/* Generated by Cython 0.20.1 on Tue May 27 21:18:09 2014 */

#define PY_SSIZE_T_CLEAN
#ifndef CYTHON_USE_PYLONG_INTERNALS
#ifdef PYLONG_BITS_IN_DIGIT
#define CYTHON_USE_PYLONG_INTERNALS 0
#else
#include "pyconfig.h"
#ifdef PYLONG_BITS_IN_DIGIT
#define CYTHON_USE_PYLONG_INTERNALS 1
#else
#define CYTHON_USE_PYLONG_INTERNALS 0
#endif
#endif
#endif
#include "Python.h"
#ifndef Py_PYTHON_H
    #error Python headers needed to compile C extensions, please install development version of Python.
#elif PY_VERSION_HEX < 0x02040000
    #error Cython requires Python 2.4+.
#else
#define CYTHON_ABI "0_20_1"
#include <stddef.h> /* For offsetof */
#ifndef offsetof
#define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
#endif
#if !defined(WIN32) && !defined(MS_WINDOWS)
  #ifndef __stdcall
    #define __stdcall
  #endif
  #ifndef __cdecl
    #define __cdecl
  #endif
  #ifndef __fastcall
    #define __fastcall
  #endif
#endif
#ifndef DL_IMPORT
  #define DL_IMPORT(t) t
#endif
#ifndef DL_EXPORT
  #define DL_EXPORT(t) t
#endif
#ifndef PY_LONG_LONG
  #define PY_LONG_LONG LONG_LONG
#endif
#ifndef Py_HUGE_VAL
  #define Py_HUGE_VAL HUGE_VAL
#endif
#ifdef PYPY_VERSION
#define CYTHON_COMPILING_IN_PYPY 1
#define CYTHON_COMPILING_IN_CPYTHON 0
#else
#define CYTHON_COMPILING_IN_PYPY 0
#define CYTHON_COMPILING_IN_CPYTHON 1
#endif
#if CYTHON_COMPILING_IN_PYPY
#define Py_OptimizeFlag 0
#endif
#if PY_VERSION_HEX < 0x02050000
  typedef int Py_ssize_t;
  #define PY_SSIZE_T_MAX INT_MAX
  #define PY_SSIZE_T_MIN INT_MIN
  #define PY_FORMAT_SIZE_T ""
  #define CYTHON_FORMAT_SSIZE_T ""
  #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
  #define PyInt_AsSsize_t(o)   __Pyx_PyInt_As_int(o)
  #define PyNumber_Index(o)    ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \
                                (PyErr_Format(PyExc_TypeError, \
                                              "expected index value, got %.200s", Py_TYPE(o)->tp_name), \
                                 (PyObject*)0))
  #define __Pyx_PyIndex_Check(o) (PyNumber_Check(o) && !PyFloat_Check(o) && \
                                  !PyComplex_Check(o))
  #define PyIndex_Check __Pyx_PyIndex_Check
  #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
  #define __PYX_BUILD_PY_SSIZE_T "i"
#else
  #define __PYX_BUILD_PY_SSIZE_T "n"
  #define CYTHON_FORMAT_SSIZE_T "z"
  #define __Pyx_PyIndex_Check PyIndex_Check
#endif
#if PY_VERSION_HEX < 0x02060000
  #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
  #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
  #define Py_SIZE(ob)   (((PyVarObject*)(ob))->ob_size)
  #define PyVarObject_HEAD_INIT(type, size) \
          PyObject_HEAD_INIT(type) size,
  #define PyType_Modified(t)
  typedef struct {
     void *buf;
     PyObject *obj;
     Py_ssize_t len;
     Py_ssize_t itemsize;
     int readonly;
     int ndim;
     char *format;
     Py_ssize_t *shape;
     Py_ssize_t *strides;
     Py_ssize_t *suboffsets;
     void *internal;
  } Py_buffer;
  #define PyBUF_SIMPLE 0
  #define PyBUF_WRITABLE 0x0001
  #define PyBUF_FORMAT 0x0004
  #define PyBUF_ND 0x0008
  #define PyBUF_STRIDES (0x0010 | PyBUF_ND)
  #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)
  #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
  #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
  #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
  #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE)
  #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE)
  typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
  typedef void (*releasebufferproc)(PyObject *, Py_buffer *);
#endif
#if PY_MAJOR_VERSION < 3
  #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
          PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
  #define __Pyx_DefaultClassType PyClass_Type
#else
  #define __Pyx_BUILTIN_MODULE_NAME "builtins"
  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
  #define __Pyx_DefaultClassType PyType_Type
#endif
#if PY_VERSION_HEX < 0x02060000
  #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict")
#endif
#if PY_MAJOR_VERSION >= 3
  #define Py_TPFLAGS_CHECKTYPES 0
  #define Py_TPFLAGS_HAVE_INDEX 0
#endif
#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
  #define Py_TPFLAGS_HAVE_NEWBUFFER 0
#endif
#if PY_VERSION_HEX < 0x02060000
  #define Py_TPFLAGS_HAVE_VERSION_TAG 0
#endif
#if PY_VERSION_HEX < 0x02060000 && !defined(Py_TPFLAGS_IS_ABSTRACT)
  #define Py_TPFLAGS_IS_ABSTRACT 0
#endif
#if PY_VERSION_HEX < 0x030400a1 && !defined(Py_TPFLAGS_HAVE_FINALIZE)
  #define Py_TPFLAGS_HAVE_FINALIZE 0
#endif
#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
  #define CYTHON_PEP393_ENABLED 1
  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ? \
                                              0 : _PyUnicode_Ready((PyObject *)(op)))
  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
  #define __Pyx_PyUnicode_KIND(u)         PyUnicode_KIND(u)
  #define __Pyx_PyUnicode_DATA(u)         PyUnicode_DATA(u)
  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
#else
  #define CYTHON_PEP393_ENABLED 0
  #define __Pyx_PyUnicode_READY(op)       (0)
  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
  #define __Pyx_PyUnicode_KIND(u)         (sizeof(Py_UNICODE))
  #define __Pyx_PyUnicode_DATA(u)         ((void*)PyUnicode_AS_UNICODE(u))
  #define __Pyx_PyUnicode_READ(k, d, i)   ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
#endif
#if CYTHON_COMPILING_IN_PYPY
  #define __Pyx_PyUnicode_Concat(a, b)      PyNumber_Add(a, b)
  #define __Pyx_PyUnicode_ConcatSafe(a, b)  PyNumber_Add(a, b)
#else
  #define __Pyx_PyUnicode_Concat(a, b)      PyUnicode_Concat(a, b)
  #define __Pyx_PyUnicode_ConcatSafe(a, b)  ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ? \
      PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b))
#endif
#define __Pyx_PyString_FormatSafe(a, b)  ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b))
#define __Pyx_PyUnicode_FormatSafe(a, b)  ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b))
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyString_Format(a, b)  PyUnicode_Format(a, b)
#else
  #define __Pyx_PyString_Format(a, b)  PyString_Format(a, b)
#endif
#if PY_MAJOR_VERSION >= 3
  #define PyBaseString_Type            PyUnicode_Type
  #define PyStringObject               PyUnicodeObject
  #define PyString_Type                PyUnicode_Type
  #define PyString_Check               PyUnicode_Check
  #define PyString_CheckExact          PyUnicode_CheckExact
#endif
#if PY_VERSION_HEX < 0x02060000
  #define PyBytesObject                PyStringObject
  #define PyBytes_Type                 PyString_Type
  #define PyBytes_Check                PyString_Check
  #define PyBytes_CheckExact           PyString_CheckExact
  #define PyBytes_FromString           PyString_FromString
  #define PyBytes_FromStringAndSize    PyString_FromStringAndSize
  #define PyBytes_FromFormat           PyString_FromFormat
  #define PyBytes_DecodeEscape         PyString_DecodeEscape
  #define PyBytes_AsString             PyString_AsString
  #define PyBytes_AsStringAndSize      PyString_AsStringAndSize
  #define PyBytes_Size                 PyString_Size
  #define PyBytes_AS_STRING            PyString_AS_STRING
  #define PyBytes_GET_SIZE             PyString_GET_SIZE
  #define PyBytes_Repr                 PyString_Repr
  #define PyBytes_Concat               PyString_Concat
  #define PyBytes_ConcatAndDel         PyString_ConcatAndDel
#endif
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj)
  #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj)
#else
  #define __Pyx_PyBaseString_Check(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj) || \
                                         PyString_Check(obj) || PyUnicode_Check(obj))
  #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj))
#endif
#if PY_VERSION_HEX < 0x02060000
  #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)
  #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)
#endif
#ifndef PySet_CheckExact
  #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
#endif
#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
#if PY_MAJOR_VERSION >= 3
  #define PyIntObject                  PyLongObject
  #define PyInt_Type                   PyLong_Type
  #define PyInt_Check(op)              PyLong_Check(op)
  #define PyInt_CheckExact(op)         PyLong_CheckExact(op)
  #define PyInt_FromString             PyLong_FromString
  #define PyInt_FromUnicode            PyLong_FromUnicode
  #define PyInt_FromLong               PyLong_FromLong
  #define PyInt_FromSize_t             PyLong_FromSize_t
  #define PyInt_FromSsize_t            PyLong_FromSsize_t
  #define PyInt_AsLong                 PyLong_AsLong
  #define PyInt_AS_LONG                PyLong_AS_LONG
  #define PyInt_AsSsize_t              PyLong_AsSsize_t
  #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
  #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
  #define PyNumber_Int                 PyNumber_Long
#endif
#if PY_MAJOR_VERSION >= 3
  #define PyBoolObject                 PyLongObject
#endif
#if PY_VERSION_HEX < 0x030200A4
  typedef long Py_hash_t;
  #define __Pyx_PyInt_FromHash_t PyInt_FromLong
  #define __Pyx_PyInt_AsHash_t   PyInt_AsLong
#else
  #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
  #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
#endif
#if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)
  #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)
  #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)
  #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b)
#else
  #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \
        (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \
        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \
            (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0)))
  #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \
        (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \
        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \
            (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1)))
  #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \
        (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \
        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \
            (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1)))
#endif
#if PY_MAJOR_VERSION >= 3
  #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
#endif
#if PY_VERSION_HEX < 0x02050000
  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),((char *)(n)))
#else
  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),(n))
  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
#endif
#if PY_VERSION_HEX < 0x02050000
  #define __Pyx_NAMESTR(n) ((char *)(n))
  #define __Pyx_DOCSTR(n)  ((char *)(n))
#else
  #define __Pyx_NAMESTR(n) (n)
  #define __Pyx_DOCSTR(n)  (n)
#endif
#ifndef CYTHON_INLINE
  #if defined(__GNUC__)
    #define CYTHON_INLINE __inline__
  #elif defined(_MSC_VER)
    #define CYTHON_INLINE __inline
  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define CYTHON_INLINE inline
  #else
    #define CYTHON_INLINE
  #endif
#endif
#ifndef CYTHON_RESTRICT
  #if defined(__GNUC__)
    #define CYTHON_RESTRICT __restrict__
  #elif defined(_MSC_VER) && _MSC_VER >= 1400
    #define CYTHON_RESTRICT __restrict
  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define CYTHON_RESTRICT restrict
  #else
    #define CYTHON_RESTRICT
  #endif
#endif
#ifdef NAN
#define __PYX_NAN() ((float) NAN)
#else
static CYTHON_INLINE float __PYX_NAN() {
  /* Initialize NaN. The sign is irrelevant, an exponent with all bits 1 and
   a nonzero mantissa means NaN. If the first bit in the mantissa is 1, it is
   a quiet NaN. */
  float value;
  memset(&value, 0xFF, sizeof(value));
  return value;
}
#endif


#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
#else
  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
#endif

#ifndef __PYX_EXTERN_C
  #ifdef __cplusplus
    #define __PYX_EXTERN_C extern "C"
  #else
    #define __PYX_EXTERN_C extern
  #endif
#endif

#if defined(WIN32) || defined(MS_WINDOWS)
#define _USE_MATH_DEFINES
#endif
#include <math.h>
#define __PYX_HAVE__skimage__graph__heap
#define __PYX_HAVE_API__skimage__graph__heap
#include "string.h"
#include "stdlib.h"
#include "pyport.h"
#ifdef _OPENMP
#include <omp.h>
#endif /* _OPENMP */

#ifdef PYREX_WITHOUT_ASSERTIONS
#define CYTHON_WITHOUT_ASSERTIONS
#endif

#ifndef CYTHON_UNUSED
# if defined(__GNUC__)
#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
#     define CYTHON_UNUSED __attribute__ ((__unused__))
#   else
#     define CYTHON_UNUSED
#   endif
# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
#   define CYTHON_UNUSED __attribute__ ((__unused__))
# else
#   define CYTHON_UNUSED
# endif
#endif
typedef struct {PyObject **p; char *s; const Py_ssize_t n; const char* encoding;
                const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/

#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0
#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0
#define __PYX_DEFAULT_STRING_ENCODING ""
#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString
#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
#define __Pyx_fits_Py_ssize_t(v, type, is_signed)  (    \
    (sizeof(type) < sizeof(Py_ssize_t))  ||             \
    (sizeof(type) > sizeof(Py_ssize_t) &&               \
          likely(v < (type)PY_SSIZE_T_MAX ||            \
                 v == (type)PY_SSIZE_T_MAX)  &&         \
          (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||       \
                                v == (type)PY_SSIZE_T_MIN)))  ||  \
    (sizeof(type) == sizeof(Py_ssize_t) &&              \
          (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||        \
                               v == (type)PY_SSIZE_T_MAX)))  )
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*);
static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length);
#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s))
#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l)
#define __Pyx_PyBytes_FromString        PyBytes_FromString
#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize
static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(char*);
#if PY_MAJOR_VERSION < 3
    #define __Pyx_PyStr_FromString        __Pyx_PyBytes_FromString
    #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
#else
    #define __Pyx_PyStr_FromString        __Pyx_PyUnicode_FromString
    #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize
#endif
#define __Pyx_PyObject_AsSString(s)    ((signed char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_AsUString(s)    ((unsigned char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_FromUString(s)  __Pyx_PyObject_FromString((char*)s)
#define __Pyx_PyBytes_FromUString(s)   __Pyx_PyBytes_FromString((char*)s)
#define __Pyx_PyByteArray_FromUString(s)   __Pyx_PyByteArray_FromString((char*)s)
#define __Pyx_PyStr_FromUString(s)     __Pyx_PyStr_FromString((char*)s)
#define __Pyx_PyUnicode_FromUString(s) __Pyx_PyUnicode_FromString((char*)s)
#if PY_MAJOR_VERSION < 3
static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u)
{
    const Py_UNICODE *u_end = u;
    while (*u_end++) ;
    return u_end - u - 1;
}
#else
#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen
#endif
#define __Pyx_PyUnicode_FromUnicode(u)       PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u))
#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode
#define __Pyx_PyUnicode_AsUnicode            PyUnicode_AsUnicode
#define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None)
#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
#if CYTHON_COMPILING_IN_CPYTHON
#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
#else
#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
#endif
#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
static int __Pyx_sys_getdefaultencoding_not_ascii;
static int __Pyx_init_sys_getdefaultencoding_params(void) {
    PyObject* sys = NULL;
    PyObject* default_encoding = NULL;
    PyObject* ascii_chars_u = NULL;
    PyObject* ascii_chars_b = NULL;
    sys = PyImport_ImportModule("sys");
    if (sys == NULL) goto bad;
    default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
    if (default_encoding == NULL) goto bad;
    if (strcmp(PyBytes_AsString(default_encoding), "ascii") == 0) {
        __Pyx_sys_getdefaultencoding_not_ascii = 0;
    } else {
        const char* default_encoding_c = PyBytes_AS_STRING(default_encoding);
        char ascii_chars[128];
        int c;
        for (c = 0; c < 128; c++) {
            ascii_chars[c] = c;
        }
        __Pyx_sys_getdefaultencoding_not_ascii = 1;
        ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL);
        if (ascii_chars_u == NULL) goto bad;
        ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL);
        if (ascii_chars_b == NULL || strncmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) {
            PyErr_Format(
                PyExc_ValueError,
                "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.",
                default_encoding_c);
            goto bad;
        }
    }
    Py_XDECREF(sys);
    Py_XDECREF(default_encoding);
    Py_XDECREF(ascii_chars_u);
    Py_XDECREF(ascii_chars_b);
    return 0;
bad:
    Py_XDECREF(sys);
    Py_XDECREF(default_encoding);
    Py_XDECREF(ascii_chars_u);
    Py_XDECREF(ascii_chars_b);
    return -1;
}
#endif
#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3
#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL)
#else
#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL)
#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
static char* __PYX_DEFAULT_STRING_ENCODING;
static int __Pyx_init_sys_getdefaultencoding_params(void) {
    PyObject* sys = NULL;
    PyObject* default_encoding = NULL;
    char* default_encoding_c;
    sys = PyImport_ImportModule("sys");
    if (sys == NULL) goto bad;
    default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
    if (default_encoding == NULL) goto bad;
    default_encoding_c = PyBytes_AS_STRING(default_encoding);
    __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c));
    strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c);
    Py_DECREF(sys);
    Py_DECREF(default_encoding);
    return 0;
bad:
    Py_XDECREF(sys);
    Py_XDECREF(default_encoding);
    return -1;
}
#endif
#endif


#ifdef __GNUC__
  /* Test for GCC > 2.95 */
  #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))
    #define likely(x)   __builtin_expect(!!(x), 1)
    #define unlikely(x) __builtin_expect(!!(x), 0)
  #else /* __GNUC__ > 2 ... */
    #define likely(x)   (x)
    #define unlikely(x) (x)
  #endif /* __GNUC__ > 2 ... */
#else /* __GNUC__ */
  #define likely(x)   (x)
  #define unlikely(x) (x)
#endif /* __GNUC__ */

static PyObject *__pyx_m;
static PyObject *__pyx_d;
static PyObject *__pyx_b;
static PyObject *__pyx_empty_tuple;
static PyObject *__pyx_empty_bytes;
static int __pyx_lineno;
static int __pyx_clineno = 0;
static const char * __pyx_cfilenm= __FILE__;
static const char *__pyx_filename;


static const char *__pyx_f[] = {
  "heap.pyx",
  "heap.pxd",
};

/* "skimage/graph/heap.pxd":9
 * 
 * # determine datatypes for heap
 * ctypedef double VALUE_T             # <<<<<<<<<<<<<<
 * ctypedef Py_ssize_t REFERENCE_T
 * ctypedef REFERENCE_T INDEX_T
 */
typedef double __pyx_t_7skimage_5graph_4heap_VALUE_T;

/* "skimage/graph/heap.pxd":10
 * # determine datatypes for heap
 * ctypedef double VALUE_T
 * ctypedef Py_ssize_t REFERENCE_T             # <<<<<<<<<<<<<<
 * ctypedef REFERENCE_T INDEX_T
 * ctypedef unsigned char BOOL_T
 */
typedef Py_ssize_t __pyx_t_7skimage_5graph_4heap_REFERENCE_T;

/* "skimage/graph/heap.pxd":11
 * ctypedef double VALUE_T
 * ctypedef Py_ssize_t REFERENCE_T
 * ctypedef REFERENCE_T INDEX_T             # <<<<<<<<<<<<<<
 * ctypedef unsigned char BOOL_T
 * ctypedef unsigned char LEVELS_T
 */
typedef __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_t_7skimage_5graph_4heap_INDEX_T;

/* "skimage/graph/heap.pxd":12
 * ctypedef Py_ssize_t REFERENCE_T
 * ctypedef REFERENCE_T INDEX_T
 * ctypedef unsigned char BOOL_T             # <<<<<<<<<<<<<<
 * ctypedef unsigned char LEVELS_T
 * 
 */
typedef unsigned char __pyx_t_7skimage_5graph_4heap_BOOL_T;

/* "skimage/graph/heap.pxd":13
 * ctypedef REFERENCE_T INDEX_T
 * ctypedef unsigned char BOOL_T
 * ctypedef unsigned char LEVELS_T             # <<<<<<<<<<<<<<
 * 
 * cdef class BinaryHeap:
 */
typedef unsigned char __pyx_t_7skimage_5graph_4heap_LEVELS_T;

/*--- Type declarations ---*/
struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap;
struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap;

/* "skimage/graph/heap.pxd":15
 * ctypedef unsigned char LEVELS_T
 * 
 * cdef class BinaryHeap:             # <<<<<<<<<<<<<<
 *     cdef readonly INDEX_T count
 *     cdef readonly LEVELS_T levels, min_levels
 */
struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap {
  PyObject_HEAD
  struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap *__pyx_vtab;
  __pyx_t_7skimage_5graph_4heap_INDEX_T count;
  __pyx_t_7skimage_5graph_4heap_LEVELS_T levels;
  __pyx_t_7skimage_5graph_4heap_LEVELS_T min_levels;
  __pyx_t_7skimage_5graph_4heap_VALUE_T *_values;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T *_references;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T _popped_ref;
};


/* "skimage/graph/heap.pxd":30
 *     cdef VALUE_T pop_fast(self)
 * 
 * cdef class FastUpdateBinaryHeap(BinaryHeap):             # <<<<<<<<<<<<<<
 *     cdef readonly REFERENCE_T max_reference
 *     cdef INDEX_T *_crossref
 */
struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap {
  struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap __pyx_base;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T max_reference;
  __pyx_t_7skimage_5graph_4heap_INDEX_T *_crossref;
  __pyx_t_7skimage_5graph_4heap_BOOL_T _invalid_ref;
  __pyx_t_7skimage_5graph_4heap_BOOL_T _pushed;
};



/* "skimage/graph/heap.pyx":49
 * 
 * 
 * cdef class BinaryHeap:             # <<<<<<<<<<<<<<
 *     """BinaryHeap(initial_capacity=128)
 * 
 */

struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap {
  void (*_add_or_remove_level)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *, __pyx_t_7skimage_5graph_4heap_LEVELS_T);
  void (*_update)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *);
  void (*_update_one)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *, __pyx_t_7skimage_5graph_4heap_INDEX_T);
  void (*_remove)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *, __pyx_t_7skimage_5graph_4heap_INDEX_T);
  __pyx_t_7skimage_5graph_4heap_INDEX_T (*push_fast)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *, __pyx_t_7skimage_5graph_4heap_VALUE_T, __pyx_t_7skimage_5graph_4heap_REFERENCE_T);
  __pyx_t_7skimage_5graph_4heap_VALUE_T (*pop_fast)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *);
};
static struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap *__pyx_vtabptr_7skimage_5graph_4heap_BinaryHeap;


/* "skimage/graph/heap.pyx":462
 * 
 * 
 * cdef class FastUpdateBinaryHeap(BinaryHeap):             # <<<<<<<<<<<<<<
 *     """FastUpdateBinaryHeap(initial_capacity=128, max_reference=None)
 * 
 */

struct __pyx_vtabstruct_7skimage_5graph_4heap_FastUpdateBinaryHeap {
  struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap __pyx_base;
  __pyx_t_7skimage_5graph_4heap_VALUE_T (*value_of_fast)(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *, __pyx_t_7skimage_5graph_4heap_REFERENCE_T);
  __pyx_t_7skimage_5graph_4heap_INDEX_T (*push_if_lower_fast)(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *, __pyx_t_7skimage_5graph_4heap_VALUE_T, __pyx_t_7skimage_5graph_4heap_REFERENCE_T);
};
static struct __pyx_vtabstruct_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_vtabptr_7skimage_5graph_4heap_FastUpdateBinaryHeap;
#ifndef CYTHON_REFNANNY
  #define CYTHON_REFNANNY 0
#endif
#if CYTHON_REFNANNY
  typedef struct {
    void (*INCREF)(void*, PyObject*, int);
    void (*DECREF)(void*, PyObject*, int);
    void (*GOTREF)(void*, PyObject*, int);
    void (*GIVEREF)(void*, PyObject*, int);
    void* (*SetupContext)(const char*, int, const char*);
    void (*FinishContext)(void**);
  } __Pyx_RefNannyAPIStruct;
  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
  static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/
  #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
#ifdef WITH_THREAD
  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
          if (acquire_gil) { \
              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \
              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
              PyGILState_Release(__pyx_gilstate_save); \
          } else { \
              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
          }
#else
  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
#endif
  #define __Pyx_RefNannyFinishContext() \
          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
  #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_XINCREF(r)  do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0)
  #define __Pyx_XDECREF(r)  do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0)
  #define __Pyx_XGOTREF(r)  do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0)
  #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
#else
  #define __Pyx_RefNannyDeclarations
  #define __Pyx_RefNannySetupContext(name, acquire_gil)
  #define __Pyx_RefNannyFinishContext()
  #define __Pyx_INCREF(r) Py_INCREF(r)
  #define __Pyx_DECREF(r) Py_DECREF(r)
  #define __Pyx_GOTREF(r)
  #define __Pyx_GIVEREF(r)
  #define __Pyx_XINCREF(r) Py_XINCREF(r)
  #define __Pyx_XDECREF(r) Py_XDECREF(r)
  #define __Pyx_XGOTREF(r)
  #define __Pyx_XGIVEREF(r)
#endif /* CYTHON_REFNANNY */
#define __Pyx_XDECREF_SET(r, v) do {                            \
        PyObject *tmp = (PyObject *) r;                         \
        r = v; __Pyx_XDECREF(tmp);                              \
    } while (0)
#define __Pyx_DECREF_SET(r, v) do {                             \
        PyObject *tmp = (PyObject *) r;                         \
        r = v; __Pyx_DECREF(tmp);                               \
    } while (0)
#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) {
    PyTypeObject* tp = Py_TYPE(obj);
    if (likely(tp->tp_getattro))
        return tp->tp_getattro(obj, attr_name);
#if PY_MAJOR_VERSION < 3
    if (likely(tp->tp_getattr))
        return tp->tp_getattr(obj, PyString_AS_STRING(attr_name));
#endif
    return PyObject_GetAttr(obj, attr_name);
}
#else
#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n)
#endif

static PyObject *__Pyx_GetBuiltinName(PyObject *name); /*proto*/

static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/

static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \
    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \
    const char* function_name); /*proto*/

static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); /*proto*/
#else
#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
#endif

static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(
        PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop,
        PyObject** py_start, PyObject** py_stop, PyObject** py_slice,
        int has_cstart, int has_cstop, int wraparound);

static CYTHON_INLINE __pyx_t_7skimage_5graph_4heap_INDEX_T __Pyx_div___pyx_t_7skimage_5graph_4heap_INDEX_T(__pyx_t_7skimage_5graph_4heap_INDEX_T, __pyx_t_7skimage_5graph_4heap_INDEX_T); /* proto */

static CYTHON_INLINE __pyx_t_7skimage_5graph_4heap_INDEX_T __Pyx_mod___pyx_t_7skimage_5graph_4heap_INDEX_T(__pyx_t_7skimage_5graph_4heap_INDEX_T, __pyx_t_7skimage_5graph_4heap_INDEX_T); /* proto */

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
    PyListObject* L = (PyListObject*) list;
    Py_ssize_t len = Py_SIZE(list);
    if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) {
        Py_INCREF(x);
        PyList_SET_ITEM(list, len, x);
        Py_SIZE(list) = len+1;
        return 0;
    }
    return PyList_Append(list, x);
}
#else
#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
#endif

static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/

static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/

#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o,n,NULL)
static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) {
    PyTypeObject* tp = Py_TYPE(obj);
    if (likely(tp->tp_setattro))
        return tp->tp_setattro(obj, attr_name, value);
#if PY_MAJOR_VERSION < 3
    if (likely(tp->tp_setattr))
        return tp->tp_setattr(obj, PyString_AS_STRING(attr_name), value);
#endif
    return PyObject_SetAttr(obj, attr_name, value);
}
#else
#define __Pyx_PyObject_DelAttrStr(o,n)   PyObject_DelAttr(o,n)
#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v)
#endif

static void __Pyx_WriteUnraisable(const char *name, int clineno,
                                  int lineno, const char *filename,
                                  int full_traceback); /*proto*/

static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_char(unsigned char value);

static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);

static CYTHON_INLINE long __Pyx_pow_long(long, long); /* proto */

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);

static CYTHON_INLINE unsigned char __Pyx_PyInt_As_unsigned_char(PyObject *);

static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);

static int __Pyx_check_binary_version(void);

typedef struct {
    int code_line;
    PyCodeObject* code_object;
} __Pyx_CodeObjectCacheEntry;
struct __Pyx_CodeObjectCache {
    int count;
    int max_count;
    __Pyx_CodeObjectCacheEntry* entries;
};
static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
static PyCodeObject *__pyx_find_code_object(int code_line);
static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);

static void __Pyx_AddTraceback(const char *funcname, int c_line,
                               int py_line, const char *filename); /*proto*/

static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/


/* Module declarations from 'cython' */

/* Module declarations from 'libc.string' */

/* Module declarations from 'libc.stdlib' */

/* Module declarations from 'skimage.graph.heap' */
static PyTypeObject *__pyx_ptype_7skimage_5graph_4heap_BinaryHeap = 0;
static PyTypeObject *__pyx_ptype_7skimage_5graph_4heap_FastUpdateBinaryHeap = 0;
static __pyx_t_7skimage_5graph_4heap_VALUE_T __pyx_v_7skimage_5graph_4heap_inf;
static CYTHON_INLINE __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_f_7skimage_5graph_4heap_index_min(__pyx_t_7skimage_5graph_4heap_INDEX_T, __pyx_t_7skimage_5graph_4heap_INDEX_T); /*proto*/
#define __Pyx_MODULE_NAME "skimage.graph.heap"
int __pyx_module_is_main_skimage__graph__heap = 0;

/* Implementation of 'skimage.graph.heap' */
static PyObject *__pyx_builtin_MemoryError;
static PyObject *__pyx_builtin_range;
static PyObject *__pyx_builtin_IndexError;
static PyObject *__pyx_builtin_ValueError;
static int __pyx_pf_7skimage_5graph_4heap_10BinaryHeap___cinit__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_initial_capacity, CYTHON_UNUSED PyObject *__pyx_v_args, CYTHON_UNUSED PyObject *__pyx_v_kws); /* proto */
static int __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_2__init__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self, CYTHON_UNUSED __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_initial_capacity); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_4reset(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self); /* proto */
static void __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_6__dealloc__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_8__str__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_10push(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_VALUE_T __pyx_v_value, __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_v_reference); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_12min_val(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_14values(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_16references(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_18pop(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_5count___get__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_6levels___get__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_10min_levels___get__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self); /* proto */
static int __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap___cinit__(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_initial_capacity, PyObject *__pyx_v_max_reference); /* proto */
static int __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_2__init__(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_initial_capacity, CYTHON_UNUSED PyObject *__pyx_v_max_reference); /* proto */
static void __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_4__dealloc__(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_6reset(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_8push(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, double __pyx_v_value, int __pyx_v_reference); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_10push_if_lower(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, double __pyx_v_value, int __pyx_v_reference); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_12value_of(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, int __pyx_v_reference); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_14cross_references(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_13max_reference___get__(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self); /* proto */
static PyObject *__pyx_tp_new_7skimage_5graph_4heap_BinaryHeap(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_7skimage_5graph_4heap_FastUpdateBinaryHeap(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static char __pyx_k_[] = "";
static char __pyx_k_g[] = "%g, ";
static char __pyx_k__3[] = "\n";
static char __pyx_k_init[] = "__init__";
static char __pyx_k_main[] = "__main__";
static char __pyx_k_test[] = "__test__";
static char __pyx_k_range[] = "range";
static char __pyx_k_reset[] = "reset";
static char __pyx_k_value[] = "value";
static char __pyx_k_level_i[] = "level %i: ";
static char __pyx_k_reference[] = "reference";
static char __pyx_k_IndexError[] = "IndexError";
static char __pyx_k_ValueError[] = "ValueError";
static char __pyx_k_pyx_vtable[] = "__pyx_vtable__";
static char __pyx_k_MemoryError[] = "MemoryError";
static char __pyx_k_invalid_ref[] = "invalid_ref";
static char __pyx_k_max_reference[] = "max_reference";
static char __pyx_k_initial_capacity[] = "initial_capacity";
static char __pyx_k_invalid_reference[] = "invalid reference";
static char __pyx_k_pop_from_an_empty_heap[] = "pop from an empty heap";
static char __pyx_k_Cython_implementation_of_a_binar[] = "Cython implementation of a binary min heap.\n\nOriginal author: Almar Klein\nModified by: Zachary Pincus\n\nLicense: BSD\n\nCopyright 2009 Almar Klein\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n1. Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\nIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\nNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n";
static char __pyx_k_reference_outside_of_range_0_max[] = "reference outside of range [0, max_reference]";
static PyObject *__pyx_kp_s_;
static PyObject *__pyx_n_s_IndexError;
static PyObject *__pyx_n_s_MemoryError;
static PyObject *__pyx_n_s_ValueError;
static PyObject *__pyx_kp_s__3;
static PyObject *__pyx_kp_s_g;
static PyObject *__pyx_n_s_init;
static PyObject *__pyx_n_s_initial_capacity;
static PyObject *__pyx_n_s_invalid_ref;
static PyObject *__pyx_kp_s_invalid_reference;
static PyObject *__pyx_kp_s_level_i;
static PyObject *__pyx_n_s_main;
static PyObject *__pyx_n_s_max_reference;
static PyObject *__pyx_kp_s_pop_from_an_empty_heap;
static PyObject *__pyx_n_s_pyx_vtable;
static PyObject *__pyx_n_s_range;
static PyObject *__pyx_n_s_reference;
static PyObject *__pyx_kp_s_reference_outside_of_range_0_max;
static PyObject *__pyx_n_s_reset;
static PyObject *__pyx_n_s_test;
static PyObject *__pyx_n_s_value;
static PyObject *__pyx_int_1;
static PyObject *__pyx_int_2;
static PyObject *__pyx_int_neg_1;
static PyObject *__pyx_slice__2;
static PyObject *__pyx_tuple__4;
static PyObject *__pyx_tuple__5;
static PyObject *__pyx_tuple__6;
static PyObject *__pyx_tuple__7;

/* "skimage/graph/heap.pyx":46
 * 
 * # this is handy
 * cdef inline INDEX_T index_min(INDEX_T a, INDEX_T b): return a if a <= b else b             # <<<<<<<<<<<<<<
 * 
 * 
 */

static CYTHON_INLINE __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_f_7skimage_5graph_4heap_index_min(__pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_a, __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_b) {
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_r;
  __Pyx_RefNannyDeclarations
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_1;
  __Pyx_RefNannySetupContext("index_min", 0);
  if (((__pyx_v_a <= __pyx_v_b) != 0)) {
    __pyx_t_1 = __pyx_v_a;
  } else {
    __pyx_t_1 = __pyx_v_b;
  }
  __pyx_r = __pyx_t_1;
  goto __pyx_L0;

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

/* "skimage/graph/heap.pyx":129
 *     # To calculate the capacity at a certain level:
 *     # 2**l
 *     def __cinit__(self, INDEX_T initial_capacity=128, *args, **kws):             # <<<<<<<<<<<<<<
 *         # calc levels from the default capacity
 *         cdef LEVELS_T levels = 0
 */

/* Python wrapper */
static int __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_initial_capacity;
  CYTHON_UNUSED PyObject *__pyx_v_args = 0;
  CYTHON_UNUSED PyObject *__pyx_v_kws = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
  __pyx_v_kws = PyDict_New(); if (unlikely(!__pyx_v_kws)) return -1;
  __Pyx_GOTREF(__pyx_v_kws);
  if (PyTuple_GET_SIZE(__pyx_args) > 1) {
    __pyx_v_args = PyTuple_GetSlice(__pyx_args, 1, PyTuple_GET_SIZE(__pyx_args));
    if (unlikely(!__pyx_v_args)) {
      __Pyx_DECREF(__pyx_v_kws); __pyx_v_kws = 0;
      __Pyx_RefNannyFinishContext();
      return -1;
    }
    __Pyx_GOTREF(__pyx_v_args);
  } else {
    __pyx_v_args = __pyx_empty_tuple; __Pyx_INCREF(__pyx_empty_tuple);
  }
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_initial_capacity,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        default:
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_initial_capacity);
          if (value) { values[0] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t used_pos_args = (pos_args < 1) ? pos_args : 1;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, __pyx_v_kws, values, used_pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        default:
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
      }
    }
    if (values[0]) {
      __pyx_v_initial_capacity = __Pyx_PyIndex_AsSsize_t(values[0]); if (unlikely((__pyx_v_initial_capacity == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    } else {
      __pyx_v_initial_capacity = ((__pyx_t_7skimage_5graph_4heap_INDEX_T)128);
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  __Pyx_DECREF(__pyx_v_args); __pyx_v_args = 0;
  __Pyx_DECREF(__pyx_v_kws); __pyx_v_kws = 0;
  __Pyx_AddTraceback("skimage.graph.heap.BinaryHeap.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_10BinaryHeap___cinit__(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self), __pyx_v_initial_capacity, __pyx_v_args, __pyx_v_kws);

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

static int __pyx_pf_7skimage_5graph_4heap_10BinaryHeap___cinit__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_initial_capacity, CYTHON_UNUSED PyObject *__pyx_v_args, CYTHON_UNUSED PyObject *__pyx_v_kws) {
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_v_levels;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_number;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  __Pyx_RefNannySetupContext("__cinit__", 0);

  /* "skimage/graph/heap.pyx":131
 *     def __cinit__(self, INDEX_T initial_capacity=128, *args, **kws):
 *         # calc levels from the default capacity
 *         cdef LEVELS_T levels = 0             # <<<<<<<<<<<<<<
 *         while 2**levels < initial_capacity:
 *             levels += 1
 */
  __pyx_v_levels = 0;

  /* "skimage/graph/heap.pyx":132
 *         # calc levels from the default capacity
 *         cdef LEVELS_T levels = 0
 *         while 2**levels < initial_capacity:             # <<<<<<<<<<<<<<
 *             levels += 1
 *         # set levels
 */
  while (1) {
    __pyx_t_1 = ((__Pyx_pow_long(2, ((long)__pyx_v_levels)) < __pyx_v_initial_capacity) != 0);
    if (!__pyx_t_1) break;

    /* "skimage/graph/heap.pyx":133
 *         cdef LEVELS_T levels = 0
 *         while 2**levels < initial_capacity:
 *             levels += 1             # <<<<<<<<<<<<<<
 *         # set levels
 *         self.min_levels = self.levels = levels
 */
    __pyx_v_levels = (__pyx_v_levels + 1);
  }

  /* "skimage/graph/heap.pyx":135
 *             levels += 1
 *         # set levels
 *         self.min_levels = self.levels = levels             # <<<<<<<<<<<<<<
 * 
 *         # we start with 0 values
 */
  __pyx_v_self->min_levels = __pyx_v_levels;
  __pyx_v_self->levels = __pyx_v_levels;

  /* "skimage/graph/heap.pyx":138
 * 
 *         # we start with 0 values
 *         self.count = 0             # <<<<<<<<<<<<<<
 * 
 *         # allocate arrays
 */
  __pyx_v_self->count = 0;

  /* "skimage/graph/heap.pyx":141
 * 
 *         # allocate arrays
 *         cdef INDEX_T number = 2**self.levels             # <<<<<<<<<<<<<<
 *         self._values = <VALUE_T *>malloc( 2*number * sizeof(VALUE_T))
 *         self._references = <REFERENCE_T *>malloc(number * sizeof(REFERENCE_T))
 */
  __pyx_v_number = __Pyx_pow_long(2, ((long)__pyx_v_self->levels));

  /* "skimage/graph/heap.pyx":142
 *         # allocate arrays
 *         cdef INDEX_T number = 2**self.levels
 *         self._values = <VALUE_T *>malloc( 2*number * sizeof(VALUE_T))             # <<<<<<<<<<<<<<
 *         self._references = <REFERENCE_T *>malloc(number * sizeof(REFERENCE_T))
 * 
 */
  __pyx_v_self->_values = ((__pyx_t_7skimage_5graph_4heap_VALUE_T *)malloc(((2 * __pyx_v_number) * (sizeof(__pyx_t_7skimage_5graph_4heap_VALUE_T)))));

  /* "skimage/graph/heap.pyx":143
 *         cdef INDEX_T number = 2**self.levels
 *         self._values = <VALUE_T *>malloc( 2*number * sizeof(VALUE_T))
 *         self._references = <REFERENCE_T *>malloc(number * sizeof(REFERENCE_T))             # <<<<<<<<<<<<<<
 * 
 *     def __init__(self, INDEX_T initial_capacity=128):
 */
  __pyx_v_self->_references = ((__pyx_t_7skimage_5graph_4heap_REFERENCE_T *)malloc((__pyx_v_number * (sizeof(__pyx_t_7skimage_5graph_4heap_REFERENCE_T)))));

  /* "skimage/graph/heap.pyx":129
 *     # To calculate the capacity at a certain level:
 *     # 2**l
 *     def __cinit__(self, INDEX_T initial_capacity=128, *args, **kws):             # <<<<<<<<<<<<<<
 *         # calc levels from the default capacity
 *         cdef LEVELS_T levels = 0
 */

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

/* "skimage/graph/heap.pyx":145
 *         self._references = <REFERENCE_T *>malloc(number * sizeof(REFERENCE_T))
 * 
 *     def __init__(self, INDEX_T initial_capacity=128):             # <<<<<<<<<<<<<<
 *         """__init__(initial_capacity=128)
 * 
 */

/* Python wrapper */
static int __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_3__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_10BinaryHeap_2__init__[] = "__init__(initial_capacity=128)\n\n        Class constructor.\n\n        Takes an optional parameter 'initial_capacity' so that\n        if the required heap capacity is known or can be estimated in advance,\n        there will need to be fewer resize operations on the heap.";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_7skimage_5graph_4heap_10BinaryHeap_2__init__;
#endif
static int __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_3__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  CYTHON_UNUSED __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_initial_capacity;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_initial_capacity,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_initial_capacity);
          if (value) { values[0] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    if (values[0]) {
      __pyx_v_initial_capacity = __Pyx_PyIndex_AsSsize_t(values[0]); if (unlikely((__pyx_v_initial_capacity == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    } else {
      __pyx_v_initial_capacity = ((__pyx_t_7skimage_5graph_4heap_INDEX_T)128);
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("skimage.graph.heap.BinaryHeap.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_2__init__(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self), __pyx_v_initial_capacity);

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

static int __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_2__init__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self, CYTHON_UNUSED __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_initial_capacity) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__init__", 0);

  /* "skimage/graph/heap.pyx":153
 *         if the required heap capacity is known or can be estimated in advance,
 *         there will need to be fewer resize operations on the heap."""
 *         if self._values is NULL or self._references is NULL:             # <<<<<<<<<<<<<<
 *           raise MemoryError()
 *         self.reset()
 */
  __pyx_t_1 = ((__pyx_v_self->_values == NULL) != 0);
  if (!__pyx_t_1) {
    __pyx_t_2 = ((__pyx_v_self->_references == NULL) != 0);
    __pyx_t_3 = __pyx_t_2;
  } else {
    __pyx_t_3 = __pyx_t_1;
  }
  if (__pyx_t_3) {

    /* "skimage/graph/heap.pyx":154
 *         there will need to be fewer resize operations on the heap."""
 *         if self._values is NULL or self._references is NULL:
 *           raise MemoryError()             # <<<<<<<<<<<<<<
 *         self.reset()
 * 
 */
    PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "skimage/graph/heap.pyx":155
 *         if self._values is NULL or self._references is NULL:
 *           raise MemoryError()
 *         self.reset()             # <<<<<<<<<<<<<<
 * 
 *     def reset(self):
 */
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_reset); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

  /* "skimage/graph/heap.pyx":145
 *         self._references = <REFERENCE_T *>malloc(number * sizeof(REFERENCE_T))
 * 
 *     def __init__(self, INDEX_T initial_capacity=128):             # <<<<<<<<<<<<<<
 *         """__init__(initial_capacity=128)
 * 
 */

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("skimage.graph.heap.BinaryHeap.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":157
 *         self.reset()
 * 
 *     def reset(self):             # <<<<<<<<<<<<<<
 *         """reset()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_5reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_10BinaryHeap_4reset[] = "reset()\n\n        Reset the heap to default, empty state.\n        ";
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_5reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("reset (wrapper)", 0);
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_4reset(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_4reset(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self) {
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_number;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i;
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_v_values;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_t_1;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_2;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_3;
  __Pyx_RefNannySetupContext("reset", 0);

  /* "skimage/graph/heap.pyx":162
 *         Reset the heap to default, empty state.
 *         """
 *         cdef INDEX_T number = 2**self.levels             # <<<<<<<<<<<<<<
 *         cdef INDEX_T i
 *         cdef VALUE_T *values = self._values
 */
  __pyx_v_number = __Pyx_pow_long(2, ((long)__pyx_v_self->levels));

  /* "skimage/graph/heap.pyx":164
 *         cdef INDEX_T number = 2**self.levels
 *         cdef INDEX_T i
 *         cdef VALUE_T *values = self._values             # <<<<<<<<<<<<<<
 *         for i in range(number*2):
 *             values[i] = inf
 */
  __pyx_t_1 = __pyx_v_self->_values;
  __pyx_v_values = __pyx_t_1;

  /* "skimage/graph/heap.pyx":165
 *         cdef INDEX_T i
 *         cdef VALUE_T *values = self._values
 *         for i in range(number*2):             # <<<<<<<<<<<<<<
 *             values[i] = inf
 * 
 */
  __pyx_t_2 = (__pyx_v_number * 2);
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;

    /* "skimage/graph/heap.pyx":166
 *         cdef VALUE_T *values = self._values
 *         for i in range(number*2):
 *             values[i] = inf             # <<<<<<<<<<<<<<
 * 
 * 
 */
    (__pyx_v_values[__pyx_v_i]) = __pyx_v_7skimage_5graph_4heap_inf;
  }

  /* "skimage/graph/heap.pyx":157
 *         self.reset()
 * 
 *     def reset(self):             # <<<<<<<<<<<<<<
 *         """reset()
 * 
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":169
 * 
 * 
 *     def __dealloc__(self):             # <<<<<<<<<<<<<<
 *         if self._values is not NULL:
 *             free(self._values)
 */

/* Python wrapper */
static void __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_7__dealloc__(PyObject *__pyx_v_self); /*proto*/
static void __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_7__dealloc__(PyObject *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
  __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_6__dealloc__(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self));

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

static void __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_6__dealloc__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  __Pyx_RefNannySetupContext("__dealloc__", 0);

  /* "skimage/graph/heap.pyx":170
 * 
 *     def __dealloc__(self):
 *         if self._values is not NULL:             # <<<<<<<<<<<<<<
 *             free(self._values)
 *         if self._references is not NULL:
 */
  __pyx_t_1 = ((__pyx_v_self->_values != NULL) != 0);
  if (__pyx_t_1) {

    /* "skimage/graph/heap.pyx":171
 *     def __dealloc__(self):
 *         if self._values is not NULL:
 *             free(self._values)             # <<<<<<<<<<<<<<
 *         if self._references is not NULL:
 *             free(self._references)
 */
    free(__pyx_v_self->_values);
    goto __pyx_L3;
  }
  __pyx_L3:;

  /* "skimage/graph/heap.pyx":172
 *         if self._values is not NULL:
 *             free(self._values)
 *         if self._references is not NULL:             # <<<<<<<<<<<<<<
 *             free(self._references)
 * 
 */
  __pyx_t_1 = ((__pyx_v_self->_references != NULL) != 0);
  if (__pyx_t_1) {

    /* "skimage/graph/heap.pyx":173
 *             free(self._values)
 *         if self._references is not NULL:
 *             free(self._references)             # <<<<<<<<<<<<<<
 * 
 *     def __str__(self):
 */
    free(__pyx_v_self->_references);
    goto __pyx_L4;
  }
  __pyx_L4:;

  /* "skimage/graph/heap.pyx":169
 * 
 * 
 *     def __dealloc__(self):             # <<<<<<<<<<<<<<
 *         if self._values is not NULL:
 *             free(self._values)
 */

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

/* "skimage/graph/heap.pyx":175
 *             free(self._references)
 * 
 *     def __str__(self):             # <<<<<<<<<<<<<<
 *         s = ''
 *         for level in range(1,self.levels+1):
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_9__str__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_9__str__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_8__str__(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_8__str__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self) {
  PyObject *__pyx_v_s = NULL;
  PyObject *__pyx_v_level = NULL;
  PyObject *__pyx_v_i0 = NULL;
  PyObject *__pyx_v_i = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  Py_ssize_t __pyx_t_3;
  PyObject *(*__pyx_t_4)(PyObject *);
  PyObject *__pyx_t_5 = NULL;
  Py_ssize_t __pyx_t_6;
  PyObject *(*__pyx_t_7)(PyObject *);
  Py_ssize_t __pyx_t_8;
  PyObject *__pyx_t_9 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__str__", 0);

  /* "skimage/graph/heap.pyx":176
 * 
 *     def __str__(self):
 *         s = ''             # <<<<<<<<<<<<<<
 *         for level in range(1,self.levels+1):
 *             i0 = 2**level-1 # LevelStart
 */
  __Pyx_INCREF(__pyx_kp_s_);
  __pyx_v_s = __pyx_kp_s_;

  /* "skimage/graph/heap.pyx":177
 *     def __str__(self):
 *         s = ''
 *         for level in range(1,self.levels+1):             # <<<<<<<<<<<<<<
 *             i0 = 2**level-1 # LevelStart
 *             s+= 'level %i: ' % level
 */
  __pyx_t_1 = __Pyx_PyInt_From_long((__pyx_v_self->levels + 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_int_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_int_1);
  __Pyx_GIVEREF(__pyx_int_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
    __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
    __pyx_t_4 = NULL;
  } else {
    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext;
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  for (;;) {
    if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_2)) {
      if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
      #if CYTHON_COMPILING_IN_CPYTHON
      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      #else
      __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      #endif
    } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_2)) {
      if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
      #if CYTHON_COMPILING_IN_CPYTHON
      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      #else
      __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      #endif
    } else {
      __pyx_t_1 = __pyx_t_4(__pyx_t_2);
      if (unlikely(!__pyx_t_1)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    __Pyx_XDECREF_SET(__pyx_v_level, __pyx_t_1);
    __pyx_t_1 = 0;

    /* "skimage/graph/heap.pyx":178
 *         s = ''
 *         for level in range(1,self.levels+1):
 *             i0 = 2**level-1 # LevelStart             # <<<<<<<<<<<<<<
 *             s+= 'level %i: ' % level
 *             for i in range(i0,i0+2**level):
 */
    __pyx_t_1 = PyNumber_Power(__pyx_int_2, __pyx_v_level, Py_None); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = PyNumber_Subtract(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XDECREF_SET(__pyx_v_i0, __pyx_t_5);
    __pyx_t_5 = 0;

    /* "skimage/graph/heap.pyx":179
 *         for level in range(1,self.levels+1):
 *             i0 = 2**level-1 # LevelStart
 *             s+= 'level %i: ' % level             # <<<<<<<<<<<<<<
 *             for i in range(i0,i0+2**level):
 *                 s += '%g, ' % self._values[i]
 */
    __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_level_i, __pyx_v_level); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_s, __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF_SET(__pyx_v_s, __pyx_t_1);
    __pyx_t_1 = 0;

    /* "skimage/graph/heap.pyx":180
 *             i0 = 2**level-1 # LevelStart
 *             s+= 'level %i: ' % level
 *             for i in range(i0,i0+2**level):             # <<<<<<<<<<<<<<
 *                 s += '%g, ' % self._values[i]
 *             s = s[:-1] + '\n'
 */
    __pyx_t_1 = PyNumber_Power(__pyx_int_2, __pyx_v_level, Py_None); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = PyNumber_Add(__pyx_v_i0, __pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_v_i0);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_i0);
    __Pyx_GIVEREF(__pyx_v_i0);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (PyList_CheckExact(__pyx_t_5) || PyTuple_CheckExact(__pyx_t_5)) {
      __pyx_t_1 = __pyx_t_5; __Pyx_INCREF(__pyx_t_1); __pyx_t_6 = 0;
      __pyx_t_7 = NULL;
    } else {
      __pyx_t_6 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_7 = Py_TYPE(__pyx_t_1)->tp_iternext;
    }
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    for (;;) {
      if (!__pyx_t_7 && PyList_CheckExact(__pyx_t_1)) {
        if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_1)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_6); __Pyx_INCREF(__pyx_t_5); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        #else
        __pyx_t_5 = PySequence_ITEM(__pyx_t_1, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        #endif
      } else if (!__pyx_t_7 && PyTuple_CheckExact(__pyx_t_1)) {
        if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_6); __Pyx_INCREF(__pyx_t_5); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        #else
        __pyx_t_5 = PySequence_ITEM(__pyx_t_1, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        #endif
      } else {
        __pyx_t_5 = __pyx_t_7(__pyx_t_1);
        if (unlikely(!__pyx_t_5)) {
          PyObject* exc_type = PyErr_Occurred();
          if (exc_type) {
            if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
            else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          }
          break;
        }
        __Pyx_GOTREF(__pyx_t_5);
      }
      __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_5);
      __pyx_t_5 = 0;

      /* "skimage/graph/heap.pyx":181
 *             s+= 'level %i: ' % level
 *             for i in range(i0,i0+2**level):
 *                 s += '%g, ' % self._values[i]             # <<<<<<<<<<<<<<
 *             s = s[:-1] + '\n'
 *         return s
 */
      __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_5 = PyFloat_FromDouble((__pyx_v_self->_values[__pyx_t_8])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_9 = __Pyx_PyString_Format(__pyx_kp_s_g, __pyx_t_5); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_v_s, __pyx_t_9); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_DECREF_SET(__pyx_v_s, __pyx_t_5);
      __pyx_t_5 = 0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

    /* "skimage/graph/heap.pyx":182
 *             for i in range(i0,i0+2**level):
 *                 s += '%g, ' % self._values[i]
 *             s = s[:-1] + '\n'             # <<<<<<<<<<<<<<
 *         return s
 * 
 */
    __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_v_s, 0, -1, NULL, NULL, &__pyx_slice__2, 0, 1, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = PyNumber_Add(__pyx_t_1, __pyx_kp_s__3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF_SET(__pyx_v_s, __pyx_t_5);
    __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "skimage/graph/heap.pyx":183
 *                 s += '%g, ' % self._values[i]
 *             s = s[:-1] + '\n'
 *         return s             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_s);
  __pyx_r = __pyx_v_s;
  goto __pyx_L0;

  /* "skimage/graph/heap.pyx":175
 *             free(self._references)
 * 
 *     def __str__(self):             # <<<<<<<<<<<<<<
 *         s = ''
 *         for level in range(1,self.levels+1):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("skimage.graph.heap.BinaryHeap.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_s);
  __Pyx_XDECREF(__pyx_v_level);
  __Pyx_XDECREF(__pyx_v_i0);
  __Pyx_XDECREF(__pyx_v_i);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":188
 *     ## C Maintanance methods
 * 
 *     cdef void _add_or_remove_level(self, LEVELS_T add_or_remove):             # <<<<<<<<<<<<<<
 *         # init indexing ints
 *         cdef INDEX_T i, i1, i2, n
 */

static void __pyx_f_7skimage_5graph_4heap_10BinaryHeap__add_or_remove_level(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_v_add_or_remove) {
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i1;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i2;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_n;
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_v_new_levels;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_number;
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_v_values;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T *__pyx_v_references;
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_v_old_values;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T *__pyx_v_old_references;
  __Pyx_RefNannyDeclarations
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_1;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_2;
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_t_3;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T *__pyx_t_4;
  int __pyx_t_5;
  __Pyx_RefNannySetupContext("_add_or_remove_level", 0);

  /* "skimage/graph/heap.pyx":193
 * 
 *         # new amount of levels
 *         cdef LEVELS_T new_levels = self.levels + add_or_remove             # <<<<<<<<<<<<<<
 * 
 *         # allocate new arrays
 */
  __pyx_v_new_levels = (__pyx_v_self->levels + __pyx_v_add_or_remove);

  /* "skimage/graph/heap.pyx":196
 * 
 *         # allocate new arrays
 *         cdef INDEX_T number = 2**new_levels             # <<<<<<<<<<<<<<
 *         cdef VALUE_T *values
 *         cdef REFERENCE_T *references
 */
  __pyx_v_number = __Pyx_pow_long(2, ((long)__pyx_v_new_levels));

  /* "skimage/graph/heap.pyx":199
 *         cdef VALUE_T *values
 *         cdef REFERENCE_T *references
 *         values = <VALUE_T *>malloc(number*2 * sizeof(VALUE_T))             # <<<<<<<<<<<<<<
 *         references = <REFERENCE_T *>malloc(number * sizeof(REFERENCE_T))
 * 
 */
  __pyx_v_values = ((__pyx_t_7skimage_5graph_4heap_VALUE_T *)malloc(((__pyx_v_number * 2) * (sizeof(__pyx_t_7skimage_5graph_4heap_VALUE_T)))));

  /* "skimage/graph/heap.pyx":200
 *         cdef REFERENCE_T *references
 *         values = <VALUE_T *>malloc(number*2 * sizeof(VALUE_T))
 *         references = <REFERENCE_T *>malloc(number * sizeof(REFERENCE_T))             # <<<<<<<<<<<<<<
 * 
 *         # init arrays
 */
  __pyx_v_references = ((__pyx_t_7skimage_5graph_4heap_REFERENCE_T *)malloc((__pyx_v_number * (sizeof(__pyx_t_7skimage_5graph_4heap_REFERENCE_T)))));

  /* "skimage/graph/heap.pyx":203
 * 
 *         # init arrays
 *         for i in range(number*2):             # <<<<<<<<<<<<<<
 *             values[i] = inf
 *         for i in range(number):
 */
  __pyx_t_1 = (__pyx_v_number * 2);
  for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
    __pyx_v_i = __pyx_t_2;

    /* "skimage/graph/heap.pyx":204
 *         # init arrays
 *         for i in range(number*2):
 *             values[i] = inf             # <<<<<<<<<<<<<<
 *         for i in range(number):
 *             references[i] = -1
 */
    (__pyx_v_values[__pyx_v_i]) = __pyx_v_7skimage_5graph_4heap_inf;
  }

  /* "skimage/graph/heap.pyx":205
 *         for i in range(number*2):
 *             values[i] = inf
 *         for i in range(number):             # <<<<<<<<<<<<<<
 *             references[i] = -1
 * 
 */
  __pyx_t_1 = __pyx_v_number;
  for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
    __pyx_v_i = __pyx_t_2;

    /* "skimage/graph/heap.pyx":206
 *             values[i] = inf
 *         for i in range(number):
 *             references[i] = -1             # <<<<<<<<<<<<<<
 * 
 *         # copy data
 */
    (__pyx_v_references[__pyx_v_i]) = -1;
  }

  /* "skimage/graph/heap.pyx":209
 * 
 *         # copy data
 *         cdef VALUE_T *old_values = self._values             # <<<<<<<<<<<<<<
 *         cdef REFERENCE_T *old_references = self._references
 *         if self.count:
 */
  __pyx_t_3 = __pyx_v_self->_values;
  __pyx_v_old_values = __pyx_t_3;

  /* "skimage/graph/heap.pyx":210
 *         # copy data
 *         cdef VALUE_T *old_values = self._values
 *         cdef REFERENCE_T *old_references = self._references             # <<<<<<<<<<<<<<
 *         if self.count:
 *             i1 = 2**new_levels-1 # LevelStart
 */
  __pyx_t_4 = __pyx_v_self->_references;
  __pyx_v_old_references = __pyx_t_4;

  /* "skimage/graph/heap.pyx":211
 *         cdef VALUE_T *old_values = self._values
 *         cdef REFERENCE_T *old_references = self._references
 *         if self.count:             # <<<<<<<<<<<<<<
 *             i1 = 2**new_levels-1 # LevelStart
 *             i2 = 2**self.levels-1 # LevelStart
 */
  __pyx_t_5 = (__pyx_v_self->count != 0);
  if (__pyx_t_5) {

    /* "skimage/graph/heap.pyx":212
 *         cdef REFERENCE_T *old_references = self._references
 *         if self.count:
 *             i1 = 2**new_levels-1 # LevelStart             # <<<<<<<<<<<<<<
 *             i2 = 2**self.levels-1 # LevelStart
 *             n = index_min(2**new_levels, 2**self.levels)
 */
    __pyx_v_i1 = (__Pyx_pow_long(2, ((long)__pyx_v_new_levels)) - 1);

    /* "skimage/graph/heap.pyx":213
 *         if self.count:
 *             i1 = 2**new_levels-1 # LevelStart
 *             i2 = 2**self.levels-1 # LevelStart             # <<<<<<<<<<<<<<
 *             n = index_min(2**new_levels, 2**self.levels)
 *             for i in range(n):
 */
    __pyx_v_i2 = (__Pyx_pow_long(2, ((long)__pyx_v_self->levels)) - 1);

    /* "skimage/graph/heap.pyx":214
 *             i1 = 2**new_levels-1 # LevelStart
 *             i2 = 2**self.levels-1 # LevelStart
 *             n = index_min(2**new_levels, 2**self.levels)             # <<<<<<<<<<<<<<
 *             for i in range(n):
 *                 values[i1+i] = old_values[i2+i]
 */
    __pyx_v_n = __pyx_f_7skimage_5graph_4heap_index_min(__Pyx_pow_long(2, ((long)__pyx_v_new_levels)), __Pyx_pow_long(2, ((long)__pyx_v_self->levels)));

    /* "skimage/graph/heap.pyx":215
 *             i2 = 2**self.levels-1 # LevelStart
 *             n = index_min(2**new_levels, 2**self.levels)
 *             for i in range(n):             # <<<<<<<<<<<<<<
 *                 values[i1+i] = old_values[i2+i]
 *             for i in range(n):
 */
    __pyx_t_1 = __pyx_v_n;
    for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
      __pyx_v_i = __pyx_t_2;

      /* "skimage/graph/heap.pyx":216
 *             n = index_min(2**new_levels, 2**self.levels)
 *             for i in range(n):
 *                 values[i1+i] = old_values[i2+i]             # <<<<<<<<<<<<<<
 *             for i in range(n):
 *                 references[i] = old_references[i]
 */
      (__pyx_v_values[(__pyx_v_i1 + __pyx_v_i)]) = (__pyx_v_old_values[(__pyx_v_i2 + __pyx_v_i)]);
    }

    /* "skimage/graph/heap.pyx":217
 *             for i in range(n):
 *                 values[i1+i] = old_values[i2+i]
 *             for i in range(n):             # <<<<<<<<<<<<<<
 *                 references[i] = old_references[i]
 * 
 */
    __pyx_t_1 = __pyx_v_n;
    for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
      __pyx_v_i = __pyx_t_2;

      /* "skimage/graph/heap.pyx":218
 *                 values[i1+i] = old_values[i2+i]
 *             for i in range(n):
 *                 references[i] = old_references[i]             # <<<<<<<<<<<<<<
 * 
 *         # make current
 */
      (__pyx_v_references[__pyx_v_i]) = (__pyx_v_old_references[__pyx_v_i]);
    }
    goto __pyx_L7;
  }
  __pyx_L7:;

  /* "skimage/graph/heap.pyx":221
 * 
 *         # make current
 *         free(self._values)             # <<<<<<<<<<<<<<
 *         free(self._references)
 *         self._values = values
 */
  free(__pyx_v_self->_values);

  /* "skimage/graph/heap.pyx":222
 *         # make current
 *         free(self._values)
 *         free(self._references)             # <<<<<<<<<<<<<<
 *         self._values = values
 *         self._references = references
 */
  free(__pyx_v_self->_references);

  /* "skimage/graph/heap.pyx":223
 *         free(self._values)
 *         free(self._references)
 *         self._values = values             # <<<<<<<<<<<<<<
 *         self._references = references
 * 
 */
  __pyx_v_self->_values = __pyx_v_values;

  /* "skimage/graph/heap.pyx":224
 *         free(self._references)
 *         self._values = values
 *         self._references = references             # <<<<<<<<<<<<<<
 * 
 *         # we need a full update
 */
  __pyx_v_self->_references = __pyx_v_references;

  /* "skimage/graph/heap.pyx":227
 * 
 *         # we need a full update
 *         self.levels = new_levels             # <<<<<<<<<<<<<<
 *         self._update()
 * 
 */
  __pyx_v_self->levels = __pyx_v_new_levels;

  /* "skimage/graph/heap.pyx":228
 *         # we need a full update
 *         self.levels = new_levels
 *         self._update()             # <<<<<<<<<<<<<<
 * 
 * 
 */
  ((struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self->__pyx_vtab)->_update(__pyx_v_self);

  /* "skimage/graph/heap.pyx":188
 *     ## C Maintanance methods
 * 
 *     cdef void _add_or_remove_level(self, LEVELS_T add_or_remove):             # <<<<<<<<<<<<<<
 *         # init indexing ints
 *         cdef INDEX_T i, i1, i2, n
 */

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

/* "skimage/graph/heap.pyx":231
 * 
 * 
 *     cdef void _update(self):             # <<<<<<<<<<<<<<
 *         """Update the full tree from the bottom up.
 *         This should be done after resizing. """
 */

static void __pyx_f_7skimage_5graph_4heap_10BinaryHeap__update(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self) {
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_v_values;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i0;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_ii;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_n;
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_v_level;
  __Pyx_RefNannyDeclarations
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_t_1;
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_t_2;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_3;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_4;
  int __pyx_t_5;
  __Pyx_RefNannySetupContext("_update", 0);

  /* "skimage/graph/heap.pyx":236
 * 
 *         # shorter name for values
 *         cdef VALUE_T *values = self._values             # <<<<<<<<<<<<<<
 * 
 *         # Note that i represents an absolute index here
 */
  __pyx_t_1 = __pyx_v_self->_values;
  __pyx_v_values = __pyx_t_1;

  /* "skimage/graph/heap.pyx":243
 * 
 *         # track tree
 *         for level in range(self.levels,1,-1):             # <<<<<<<<<<<<<<
 *             i0 = (1 << level) - 1 #2**level-1 = LevelStart
 *             n = i0 + 1 #2**level
 */
  for (__pyx_t_2 = __pyx_v_self->levels; __pyx_t_2 > 1; __pyx_t_2-=1) {
    __pyx_v_level = __pyx_t_2;

    /* "skimage/graph/heap.pyx":244
 *         # track tree
 *         for level in range(self.levels,1,-1):
 *             i0 = (1 << level) - 1 #2**level-1 = LevelStart             # <<<<<<<<<<<<<<
 *             n = i0 + 1 #2**level
 *             for i in range(i0,i0+n,2):
 */
    __pyx_v_i0 = ((1 << __pyx_v_level) - 1);

    /* "skimage/graph/heap.pyx":245
 *         for level in range(self.levels,1,-1):
 *             i0 = (1 << level) - 1 #2**level-1 = LevelStart
 *             n = i0 + 1 #2**level             # <<<<<<<<<<<<<<
 *             for i in range(i0,i0+n,2):
 *                 ii = (i-1)//2 # CalcPrevAbs
 */
    __pyx_v_n = (__pyx_v_i0 + 1);

    /* "skimage/graph/heap.pyx":246
 *             i0 = (1 << level) - 1 #2**level-1 = LevelStart
 *             n = i0 + 1 #2**level
 *             for i in range(i0,i0+n,2):             # <<<<<<<<<<<<<<
 *                 ii = (i-1)//2 # CalcPrevAbs
 *                 if values[i] < values[i+1]:
 */
    __pyx_t_3 = (__pyx_v_i0 + __pyx_v_n);
    for (__pyx_t_4 = __pyx_v_i0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=2) {
      __pyx_v_i = __pyx_t_4;

      /* "skimage/graph/heap.pyx":247
 *             n = i0 + 1 #2**level
 *             for i in range(i0,i0+n,2):
 *                 ii = (i-1)//2 # CalcPrevAbs             # <<<<<<<<<<<<<<
 *                 if values[i] < values[i+1]:
 *                     values[ii] = values[i]
 */
      __pyx_v_ii = __Pyx_div___pyx_t_7skimage_5graph_4heap_INDEX_T((__pyx_v_i - 1), 2);

      /* "skimage/graph/heap.pyx":248
 *             for i in range(i0,i0+n,2):
 *                 ii = (i-1)//2 # CalcPrevAbs
 *                 if values[i] < values[i+1]:             # <<<<<<<<<<<<<<
 *                     values[ii] = values[i]
 *                 else:
 */
      __pyx_t_5 = (((__pyx_v_values[__pyx_v_i]) < (__pyx_v_values[(__pyx_v_i + 1)])) != 0);
      if (__pyx_t_5) {

        /* "skimage/graph/heap.pyx":249
 *                 ii = (i-1)//2 # CalcPrevAbs
 *                 if values[i] < values[i+1]:
 *                     values[ii] = values[i]             # <<<<<<<<<<<<<<
 *                 else:
 *                     values[ii] = values[i+1]
 */
        (__pyx_v_values[__pyx_v_ii]) = (__pyx_v_values[__pyx_v_i]);
        goto __pyx_L7;
      }
      /*else*/ {

        /* "skimage/graph/heap.pyx":251
 *                     values[ii] = values[i]
 *                 else:
 *                     values[ii] = values[i+1]             # <<<<<<<<<<<<<<
 * 
 * 
 */
        (__pyx_v_values[__pyx_v_ii]) = (__pyx_v_values[(__pyx_v_i + 1)]);
      }
      __pyx_L7:;
    }
  }

  /* "skimage/graph/heap.pyx":231
 * 
 * 
 *     cdef void _update(self):             # <<<<<<<<<<<<<<
 *         """Update the full tree from the bottom up.
 *         This should be done after resizing. """
 */

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

/* "skimage/graph/heap.pyx":254
 * 
 * 
 *     cdef void _update_one(self, INDEX_T i):             # <<<<<<<<<<<<<<
 *         """Update the tree for one value."""
 * 
 */

static void __pyx_f_7skimage_5graph_4heap_10BinaryHeap__update_one(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i) {
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_v_values;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_ii;
  CYTHON_UNUSED __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_v_level;
  __Pyx_RefNannyDeclarations
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_t_1;
  int __pyx_t_2;
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_t_3;
  __Pyx_RefNannySetupContext("_update_one", 0);

  /* "skimage/graph/heap.pyx":258
 * 
 *         # shorter name for values
 *         cdef VALUE_T *values = self._values             # <<<<<<<<<<<<<<
 * 
 *         # make index uneven
 */
  __pyx_t_1 = __pyx_v_self->_values;
  __pyx_v_values = __pyx_t_1;

  /* "skimage/graph/heap.pyx":261
 * 
 *         # make index uneven
 *         if i % 2==0:             # <<<<<<<<<<<<<<
 *             i = i-1
 * 
 */
  __pyx_t_2 = ((__Pyx_mod___pyx_t_7skimage_5graph_4heap_INDEX_T(__pyx_v_i, 2) == 0) != 0);
  if (__pyx_t_2) {

    /* "skimage/graph/heap.pyx":262
 *         # make index uneven
 *         if i % 2==0:
 *             i = i-1             # <<<<<<<<<<<<<<
 * 
 *         # track tree
 */
    __pyx_v_i = (__pyx_v_i - 1);
    goto __pyx_L3;
  }
  __pyx_L3:;

  /* "skimage/graph/heap.pyx":267
 *         cdef INDEX_T ii
 *         cdef LEVELS_T level
 *         for level in range(self.levels,1,-1):             # <<<<<<<<<<<<<<
 *             ii = (i-1)//2 # CalcPrevAbs
 * 
 */
  for (__pyx_t_3 = __pyx_v_self->levels; __pyx_t_3 > 1; __pyx_t_3-=1) {
    __pyx_v_level = __pyx_t_3;

    /* "skimage/graph/heap.pyx":268
 *         cdef LEVELS_T level
 *         for level in range(self.levels,1,-1):
 *             ii = (i-1)//2 # CalcPrevAbs             # <<<<<<<<<<<<<<
 * 
 *             # test
 */
    __pyx_v_ii = __Pyx_div___pyx_t_7skimage_5graph_4heap_INDEX_T((__pyx_v_i - 1), 2);

    /* "skimage/graph/heap.pyx":271
 * 
 *             # test
 *             if values[i] < values[i+1]:             # <<<<<<<<<<<<<<
 *                 values[ii] = values[i]
 *             else:
 */
    __pyx_t_2 = (((__pyx_v_values[__pyx_v_i]) < (__pyx_v_values[(__pyx_v_i + 1)])) != 0);
    if (__pyx_t_2) {

      /* "skimage/graph/heap.pyx":272
 *             # test
 *             if values[i] < values[i+1]:
 *                 values[ii] = values[i]             # <<<<<<<<<<<<<<
 *             else:
 *                 values[ii] = values[i+1]
 */
      (__pyx_v_values[__pyx_v_ii]) = (__pyx_v_values[__pyx_v_i]);
      goto __pyx_L6;
    }
    /*else*/ {

      /* "skimage/graph/heap.pyx":274
 *                 values[ii] = values[i]
 *             else:
 *                 values[ii] = values[i+1]             # <<<<<<<<<<<<<<
 *             # next
 *             if ii % 2:
 */
      (__pyx_v_values[__pyx_v_ii]) = (__pyx_v_values[(__pyx_v_i + 1)]);
    }
    __pyx_L6:;

    /* "skimage/graph/heap.pyx":276
 *                 values[ii] = values[i+1]
 *             # next
 *             if ii % 2:             # <<<<<<<<<<<<<<
 *                 i = ii
 *             else:
 */
    __pyx_t_2 = (__Pyx_mod___pyx_t_7skimage_5graph_4heap_INDEX_T(__pyx_v_ii, 2) != 0);
    if (__pyx_t_2) {

      /* "skimage/graph/heap.pyx":277
 *             # next
 *             if ii % 2:
 *                 i = ii             # <<<<<<<<<<<<<<
 *             else:
 *                 i = ii-1
 */
      __pyx_v_i = __pyx_v_ii;
      goto __pyx_L7;
    }
    /*else*/ {

      /* "skimage/graph/heap.pyx":279
 *                 i = ii
 *             else:
 *                 i = ii-1             # <<<<<<<<<<<<<<
 * 
 * 
 */
      __pyx_v_i = (__pyx_v_ii - 1);
    }
    __pyx_L7:;
  }

  /* "skimage/graph/heap.pyx":254
 * 
 * 
 *     cdef void _update_one(self, INDEX_T i):             # <<<<<<<<<<<<<<
 *         """Update the tree for one value."""
 * 
 */

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

/* "skimage/graph/heap.pyx":282
 * 
 * 
 *     cdef void _remove(self, INDEX_T i1):             # <<<<<<<<<<<<<<
 *         """Remove a value from the heap. By index."""
 * 
 */

static void __pyx_f_7skimage_5graph_4heap_10BinaryHeap__remove(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i1) {
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_v_levels;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_count;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i0;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i2;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_r1;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_r2;
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_v_values;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T *__pyx_v_references;
  __Pyx_RefNannyDeclarations
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_t_1;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_2;
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_t_3;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T *__pyx_t_4;
  int __pyx_t_5;
  __Pyx_RefNannySetupContext("_remove", 0);

  /* "skimage/graph/heap.pyx":285
 *         """Remove a value from the heap. By index."""
 * 
 *         cdef LEVELS_T levels = self.levels             # <<<<<<<<<<<<<<
 *         cdef INDEX_T count = self.count
 *         # get indices
 */
  __pyx_t_1 = __pyx_v_self->levels;
  __pyx_v_levels = __pyx_t_1;

  /* "skimage/graph/heap.pyx":286
 * 
 *         cdef LEVELS_T levels = self.levels
 *         cdef INDEX_T count = self.count             # <<<<<<<<<<<<<<
 *         # get indices
 *         cdef INDEX_T i0 = (1 << levels) - 1  #2**self.levels - 1 # LevelStart
 */
  __pyx_t_2 = __pyx_v_self->count;
  __pyx_v_count = __pyx_t_2;

  /* "skimage/graph/heap.pyx":288
 *         cdef INDEX_T count = self.count
 *         # get indices
 *         cdef INDEX_T i0 = (1 << levels) - 1  #2**self.levels - 1 # LevelStart             # <<<<<<<<<<<<<<
 *         cdef INDEX_T i2 = i0 + count - 1
 * 
 */
  __pyx_v_i0 = ((1 << __pyx_v_levels) - 1);

  /* "skimage/graph/heap.pyx":289
 *         # get indices
 *         cdef INDEX_T i0 = (1 << levels) - 1  #2**self.levels - 1 # LevelStart
 *         cdef INDEX_T i2 = i0 + count - 1             # <<<<<<<<<<<<<<
 * 
 *         # get relative indices
 */
  __pyx_v_i2 = ((__pyx_v_i0 + __pyx_v_count) - 1);

  /* "skimage/graph/heap.pyx":292
 * 
 *         # get relative indices
 *         cdef INDEX_T r1 = i1 - i0             # <<<<<<<<<<<<<<
 *         cdef INDEX_T r2 = count - 1
 * 
 */
  __pyx_v_r1 = (__pyx_v_i1 - __pyx_v_i0);

  /* "skimage/graph/heap.pyx":293
 *         # get relative indices
 *         cdef INDEX_T r1 = i1 - i0
 *         cdef INDEX_T r2 = count - 1             # <<<<<<<<<<<<<<
 * 
 *         cdef VALUE_T *values = self._values
 */
  __pyx_v_r2 = (__pyx_v_count - 1);

  /* "skimage/graph/heap.pyx":295
 *         cdef INDEX_T r2 = count - 1
 * 
 *         cdef VALUE_T *values = self._values             # <<<<<<<<<<<<<<
 *         cdef REFERENCE_T *references = self._references
 * 
 */
  __pyx_t_3 = __pyx_v_self->_values;
  __pyx_v_values = __pyx_t_3;

  /* "skimage/graph/heap.pyx":296
 * 
 *         cdef VALUE_T *values = self._values
 *         cdef REFERENCE_T *references = self._references             # <<<<<<<<<<<<<<
 * 
 *         # swap with last
 */
  __pyx_t_4 = __pyx_v_self->_references;
  __pyx_v_references = __pyx_t_4;

  /* "skimage/graph/heap.pyx":299
 * 
 *         # swap with last
 *         values[i1] = values[i2]             # <<<<<<<<<<<<<<
 *         references[r1] = references[r2]
 * 
 */
  (__pyx_v_values[__pyx_v_i1]) = (__pyx_v_values[__pyx_v_i2]);

  /* "skimage/graph/heap.pyx":300
 *         # swap with last
 *         values[i1] = values[i2]
 *         references[r1] = references[r2]             # <<<<<<<<<<<<<<
 * 
 *         # make last Null
 */
  (__pyx_v_references[__pyx_v_r1]) = (__pyx_v_references[__pyx_v_r2]);

  /* "skimage/graph/heap.pyx":303
 * 
 *         # make last Null
 *         values[i2] = inf             # <<<<<<<<<<<<<<
 * 
 *         # update
 */
  (__pyx_v_values[__pyx_v_i2]) = __pyx_v_7skimage_5graph_4heap_inf;

  /* "skimage/graph/heap.pyx":306
 * 
 *         # update
 *         self.count -= 1             # <<<<<<<<<<<<<<
 *         count -= 1
 *         if (levels>self.min_levels) & (count < (1 << (levels-2))):
 */
  __pyx_v_self->count = (__pyx_v_self->count - 1);

  /* "skimage/graph/heap.pyx":307
 *         # update
 *         self.count -= 1
 *         count -= 1             # <<<<<<<<<<<<<<
 *         if (levels>self.min_levels) & (count < (1 << (levels-2))):
 *             self._add_or_remove_level(-1)
 */
  __pyx_v_count = (__pyx_v_count - 1);

  /* "skimage/graph/heap.pyx":308
 *         self.count -= 1
 *         count -= 1
 *         if (levels>self.min_levels) & (count < (1 << (levels-2))):             # <<<<<<<<<<<<<<
 *             self._add_or_remove_level(-1)
 *         else:
 */
  __pyx_t_5 = (((__pyx_v_levels > __pyx_v_self->min_levels) & (__pyx_v_count < (1 << (__pyx_v_levels - 2)))) != 0);
  if (__pyx_t_5) {

    /* "skimage/graph/heap.pyx":309
 *         count -= 1
 *         if (levels>self.min_levels) & (count < (1 << (levels-2))):
 *             self._add_or_remove_level(-1)             # <<<<<<<<<<<<<<
 *         else:
 *             self._update_one(i1)
 */
    ((struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self->__pyx_vtab)->_add_or_remove_level(__pyx_v_self, -1);
    goto __pyx_L3;
  }
  /*else*/ {

    /* "skimage/graph/heap.pyx":311
 *             self._add_or_remove_level(-1)
 *         else:
 *             self._update_one(i1)             # <<<<<<<<<<<<<<
 *             self._update_one(i2)
 * 
 */
    ((struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self->__pyx_vtab)->_update_one(__pyx_v_self, __pyx_v_i1);

    /* "skimage/graph/heap.pyx":312
 *         else:
 *             self._update_one(i1)
 *             self._update_one(i2)             # <<<<<<<<<<<<<<
 * 
 * 
 */
    ((struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self->__pyx_vtab)->_update_one(__pyx_v_self, __pyx_v_i2);
  }
  __pyx_L3:;

  /* "skimage/graph/heap.pyx":282
 * 
 * 
 *     cdef void _remove(self, INDEX_T i1):             # <<<<<<<<<<<<<<
 *         """Remove a value from the heap. By index."""
 * 
 */

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

/* "skimage/graph/heap.pyx":317
 *     ## C Public methods
 * 
 *     cdef INDEX_T push_fast(self, VALUE_T value, REFERENCE_T reference):             # <<<<<<<<<<<<<<
 *         """The c-method for fast pushing.
 * 
 */

static __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_f_7skimage_5graph_4heap_10BinaryHeap_push_fast(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_VALUE_T __pyx_v_value, __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_v_reference) {
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_v_levels;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_count;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_r;
  __Pyx_RefNannyDeclarations
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_t_1;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_2;
  int __pyx_t_3;
  __Pyx_RefNannySetupContext("push_fast", 0);

  /* "skimage/graph/heap.pyx":322
 *         Returns the index relative to the start of the last level in the heap."""
 *         # We need to resize if currently it just fits.
 *         cdef LEVELS_T levels = self.levels             # <<<<<<<<<<<<<<
 *         cdef INDEX_T count = self.count
 *         if count >= (1 << levels):#2**self.levels:
 */
  __pyx_t_1 = __pyx_v_self->levels;
  __pyx_v_levels = __pyx_t_1;

  /* "skimage/graph/heap.pyx":323
 *         # We need to resize if currently it just fits.
 *         cdef LEVELS_T levels = self.levels
 *         cdef INDEX_T count = self.count             # <<<<<<<<<<<<<<
 *         if count >= (1 << levels):#2**self.levels:
 *             self._add_or_remove_level(+1)
 */
  __pyx_t_2 = __pyx_v_self->count;
  __pyx_v_count = __pyx_t_2;

  /* "skimage/graph/heap.pyx":324
 *         cdef LEVELS_T levels = self.levels
 *         cdef INDEX_T count = self.count
 *         if count >= (1 << levels):#2**self.levels:             # <<<<<<<<<<<<<<
 *             self._add_or_remove_level(+1)
 *             levels += 1
 */
  __pyx_t_3 = ((__pyx_v_count >= (1 << __pyx_v_levels)) != 0);
  if (__pyx_t_3) {

    /* "skimage/graph/heap.pyx":325
 *         cdef INDEX_T count = self.count
 *         if count >= (1 << levels):#2**self.levels:
 *             self._add_or_remove_level(+1)             # <<<<<<<<<<<<<<
 *             levels += 1
 * 
 */
    ((struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self->__pyx_vtab)->_add_or_remove_level(__pyx_v_self, 1);

    /* "skimage/graph/heap.pyx":326
 *         if count >= (1 << levels):#2**self.levels:
 *             self._add_or_remove_level(+1)
 *             levels += 1             # <<<<<<<<<<<<<<
 * 
 *         # insert new value
 */
    __pyx_v_levels = (__pyx_v_levels + 1);
    goto __pyx_L3;
  }
  __pyx_L3:;

  /* "skimage/graph/heap.pyx":329
 * 
 *         # insert new value
 *         cdef INDEX_T i = ((1 << levels) - 1) + count # LevelStart + n             # <<<<<<<<<<<<<<
 *         self._values[i] = value
 *         self._references[count] = reference
 */
  __pyx_v_i = (((1 << __pyx_v_levels) - 1) + __pyx_v_count);

  /* "skimage/graph/heap.pyx":330
 *         # insert new value
 *         cdef INDEX_T i = ((1 << levels) - 1) + count # LevelStart + n
 *         self._values[i] = value             # <<<<<<<<<<<<<<
 *         self._references[count] = reference
 * 
 */
  (__pyx_v_self->_values[__pyx_v_i]) = __pyx_v_value;

  /* "skimage/graph/heap.pyx":331
 *         cdef INDEX_T i = ((1 << levels) - 1) + count # LevelStart + n
 *         self._values[i] = value
 *         self._references[count] = reference             # <<<<<<<<<<<<<<
 * 
 *         # update
 */
  (__pyx_v_self->_references[__pyx_v_count]) = __pyx_v_reference;

  /* "skimage/graph/heap.pyx":334
 * 
 *         # update
 *         self.count += 1             # <<<<<<<<<<<<<<
 *         self._update_one(i)
 * 
 */
  __pyx_v_self->count = (__pyx_v_self->count + 1);

  /* "skimage/graph/heap.pyx":335
 *         # update
 *         self.count += 1
 *         self._update_one(i)             # <<<<<<<<<<<<<<
 * 
 *         # return
 */
  ((struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self->__pyx_vtab)->_update_one(__pyx_v_self, __pyx_v_i);

  /* "skimage/graph/heap.pyx":338
 * 
 *         # return
 *         return count             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_r = __pyx_v_count;
  goto __pyx_L0;

  /* "skimage/graph/heap.pyx":317
 *     ## C Public methods
 * 
 *     cdef INDEX_T push_fast(self, VALUE_T value, REFERENCE_T reference):             # <<<<<<<<<<<<<<
 *         """The c-method for fast pushing.
 * 
 */

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

/* "skimage/graph/heap.pyx":341
 * 
 * 
 *     cdef VALUE_T pop_fast(self):             # <<<<<<<<<<<<<<
 *         """The c-method for fast popping.
 * 
 */

static __pyx_t_7skimage_5graph_4heap_VALUE_T __pyx_f_7skimage_5graph_4heap_10BinaryHeap_pop_fast(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self) {
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_v_values;
  CYTHON_UNUSED __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_v_level;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i;
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_v_levels;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_ir;
  __pyx_t_7skimage_5graph_4heap_VALUE_T __pyx_v_value;
  __pyx_t_7skimage_5graph_4heap_VALUE_T __pyx_r;
  __Pyx_RefNannyDeclarations
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_t_1;
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_t_2;
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_t_3;
  int __pyx_t_4;
  __Pyx_RefNannySetupContext("pop_fast", 0);

  /* "skimage/graph/heap.pyx":347
 * 
 *         # shorter name for values
 *         cdef VALUE_T *values = self._values             # <<<<<<<<<<<<<<
 * 
 *         # init index. start at 1 because we start in level 1
 */
  __pyx_t_1 = __pyx_v_self->_values;
  __pyx_v_values = __pyx_t_1;

  /* "skimage/graph/heap.pyx":351
 *         # init index. start at 1 because we start in level 1
 *         cdef LEVELS_T level
 *         cdef INDEX_T i = 1             # <<<<<<<<<<<<<<
 *         cdef LEVELS_T levels = self.levels
 *         # search tree (using absolute indices)
 */
  __pyx_v_i = 1;

  /* "skimage/graph/heap.pyx":352
 *         cdef LEVELS_T level
 *         cdef INDEX_T i = 1
 *         cdef LEVELS_T levels = self.levels             # <<<<<<<<<<<<<<
 *         # search tree (using absolute indices)
 *         for level in range(1, levels):
 */
  __pyx_t_2 = __pyx_v_self->levels;
  __pyx_v_levels = __pyx_t_2;

  /* "skimage/graph/heap.pyx":354
 *         cdef LEVELS_T levels = self.levels
 *         # search tree (using absolute indices)
 *         for level in range(1, levels):             # <<<<<<<<<<<<<<
 *             if values[i] <= values[i+1]:
 *                 i = i*2+1 # CalcNextAbs
 */
  __pyx_t_2 = __pyx_v_levels;
  for (__pyx_t_3 = 1; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_level = __pyx_t_3;

    /* "skimage/graph/heap.pyx":355
 *         # search tree (using absolute indices)
 *         for level in range(1, levels):
 *             if values[i] <= values[i+1]:             # <<<<<<<<<<<<<<
 *                 i = i*2+1 # CalcNextAbs
 *             else:
 */
    __pyx_t_4 = (((__pyx_v_values[__pyx_v_i]) <= (__pyx_v_values[(__pyx_v_i + 1)])) != 0);
    if (__pyx_t_4) {

      /* "skimage/graph/heap.pyx":356
 *         for level in range(1, levels):
 *             if values[i] <= values[i+1]:
 *                 i = i*2+1 # CalcNextAbs             # <<<<<<<<<<<<<<
 *             else:
 *                 i = (i+1)*2+1 # CalcNextAbs
 */
      __pyx_v_i = ((__pyx_v_i * 2) + 1);
      goto __pyx_L5;
    }
    /*else*/ {

      /* "skimage/graph/heap.pyx":358
 *                 i = i*2+1 # CalcNextAbs
 *             else:
 *                 i = (i+1)*2+1 # CalcNextAbs             # <<<<<<<<<<<<<<
 * 
 *         # select best one in last level
 */
      __pyx_v_i = (((__pyx_v_i + 1) * 2) + 1);
    }
    __pyx_L5:;
  }

  /* "skimage/graph/heap.pyx":361
 * 
 *         # select best one in last level
 *         if values[i] <= values[i+1]:             # <<<<<<<<<<<<<<
 *             i = i
 *         else:
 */
  __pyx_t_4 = (((__pyx_v_values[__pyx_v_i]) <= (__pyx_v_values[(__pyx_v_i + 1)])) != 0);
  if (__pyx_t_4) {

    /* "skimage/graph/heap.pyx":362
 *         # select best one in last level
 *         if values[i] <= values[i+1]:
 *             i = i             # <<<<<<<<<<<<<<
 *         else:
 *             i = i+1
 */

    goto __pyx_L6;
  }
  /*else*/ {

    /* "skimage/graph/heap.pyx":364
 *             i = i
 *         else:
 *             i = i+1             # <<<<<<<<<<<<<<
 * 
 *         # get values
 */
    __pyx_v_i = (__pyx_v_i + 1);
  }
  __pyx_L6:;

  /* "skimage/graph/heap.pyx":367
 * 
 *         # get values
 *         cdef INDEX_T ir = i - ((1 << levels) - 1) #(2**self.levels-1) # LevelStart             # <<<<<<<<<<<<<<
 *         cdef VALUE_T value = values[i]
 *         self._popped_ref = self._references[ir]
 */
  __pyx_v_ir = (__pyx_v_i - ((1 << __pyx_v_levels) - 1));

  /* "skimage/graph/heap.pyx":368
 *         # get values
 *         cdef INDEX_T ir = i - ((1 << levels) - 1) #(2**self.levels-1) # LevelStart
 *         cdef VALUE_T value = values[i]             # <<<<<<<<<<<<<<
 *         self._popped_ref = self._references[ir]
 * 
 */
  __pyx_v_value = (__pyx_v_values[__pyx_v_i]);

  /* "skimage/graph/heap.pyx":369
 *         cdef INDEX_T ir = i - ((1 << levels) - 1) #(2**self.levels-1) # LevelStart
 *         cdef VALUE_T value = values[i]
 *         self._popped_ref = self._references[ir]             # <<<<<<<<<<<<<<
 * 
 *         # remove it
 */
  __pyx_v_self->_popped_ref = (__pyx_v_self->_references[__pyx_v_ir]);

  /* "skimage/graph/heap.pyx":372
 * 
 *         # remove it
 *         if self.count:             # <<<<<<<<<<<<<<
 *             self._remove(i)
 * 
 */
  __pyx_t_4 = (__pyx_v_self->count != 0);
  if (__pyx_t_4) {

    /* "skimage/graph/heap.pyx":373
 *         # remove it
 *         if self.count:
 *             self._remove(i)             # <<<<<<<<<<<<<<
 * 
 *         # return
 */
    ((struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self->__pyx_vtab)->_remove(__pyx_v_self, __pyx_v_i);
    goto __pyx_L7;
  }
  __pyx_L7:;

  /* "skimage/graph/heap.pyx":376
 * 
 *         # return
 *         return value             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_r = __pyx_v_value;
  goto __pyx_L0;

  /* "skimage/graph/heap.pyx":341
 * 
 * 
 *     cdef VALUE_T pop_fast(self):             # <<<<<<<<<<<<<<
 *         """The c-method for fast popping.
 * 
 */

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

/* "skimage/graph/heap.pyx":381
 *     ## Python Public methods (that do not need to be VERY fast)
 * 
 *     def push(self, VALUE_T value, REFERENCE_T reference=-1):             # <<<<<<<<<<<<<<
 *         """push(value, reference=-1)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_11push(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_10BinaryHeap_10push[] = "push(value, reference=-1)\n\n        Append a value to the heap, with optional reference.\n\n        Parameters\n        ----------\n        value : float\n            Value to push onto the heap\n        reference : int, optional\n            Reference to associate with the given value.\n        ";
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_11push(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __pyx_t_7skimage_5graph_4heap_VALUE_T __pyx_v_value;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_v_reference;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("push (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_value,&__pyx_n_s_reference,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_value)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_reference);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "push") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_value = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_value == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    if (values[1]) {
      __pyx_v_reference = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_reference == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    } else {
      __pyx_v_reference = ((__pyx_t_7skimage_5graph_4heap_REFERENCE_T)-1);
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("push", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("skimage.graph.heap.BinaryHeap.push", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_10push(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self), __pyx_v_value, __pyx_v_reference);

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_10push(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_VALUE_T __pyx_v_value, __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_v_reference) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("push", 0);

  /* "skimage/graph/heap.pyx":393
 *             Reference to associate with the given value.
 *         """
 *         self.push_fast(value, reference)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  ((struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self->__pyx_vtab)->push_fast(__pyx_v_self, __pyx_v_value, __pyx_v_reference);

  /* "skimage/graph/heap.pyx":381
 *     ## Python Public methods (that do not need to be VERY fast)
 * 
 *     def push(self, VALUE_T value, REFERENCE_T reference=-1):             # <<<<<<<<<<<<<<
 *         """push(value, reference=-1)
 * 
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":396
 * 
 * 
 *     def min_val(self):             # <<<<<<<<<<<<<<
 *         """min_val()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_13min_val(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_10BinaryHeap_12min_val[] = "min_val()\n\n        Get the minimum value on the heap.\n\n        Returns only the value, and does not remove it from the heap.\n        ";
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_13min_val(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("min_val (wrapper)", 0);
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_12min_val(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_12min_val(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self) {
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_v_values;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("min_val", 0);

  /* "skimage/graph/heap.pyx":404
 *         """
 *         # shorter name for values
 *         cdef VALUE_T *values = self._values             # <<<<<<<<<<<<<<
 * 
 *         # select best one in last level
 */
  __pyx_t_1 = __pyx_v_self->_values;
  __pyx_v_values = __pyx_t_1;

  /* "skimage/graph/heap.pyx":407
 * 
 *         # select best one in last level
 *         if values[1] < values[2]:             # <<<<<<<<<<<<<<
 *             return values[1]
 *         else:
 */
  __pyx_t_2 = (((__pyx_v_values[1]) < (__pyx_v_values[2])) != 0);
  if (__pyx_t_2) {

    /* "skimage/graph/heap.pyx":408
 *         # select best one in last level
 *         if values[1] < values[2]:
 *             return values[1]             # <<<<<<<<<<<<<<
 *         else:
 *             return values[2]
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = PyFloat_FromDouble((__pyx_v_values[1])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "skimage/graph/heap.pyx":410
 *             return values[1]
 *         else:
 *             return values[2]             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = PyFloat_FromDouble((__pyx_v_values[2])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "skimage/graph/heap.pyx":396
 * 
 * 
 *     def min_val(self):             # <<<<<<<<<<<<<<
 *         """min_val()
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("skimage.graph.heap.BinaryHeap.min_val", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":413
 * 
 * 
 *     def values(self):             # <<<<<<<<<<<<<<
 *         """values()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_15values(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_10BinaryHeap_14values[] = "values()\n\n        Get the values in the heap as a list.\n        ";
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_15values(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("values (wrapper)", 0);
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_14values(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_14values(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self) {
  PyObject *__pyx_v_out = NULL;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_2;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_3;
  int __pyx_t_4;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("values", 0);

  /* "skimage/graph/heap.pyx":418
 *         Get the values in the heap as a list.
 *         """
 *         out = []             # <<<<<<<<<<<<<<
 *         cdef INDEX_T i, i0
 *         i0 = 2**self.levels-1  # LevelStart
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_out = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "skimage/graph/heap.pyx":420
 *         out = []
 *         cdef INDEX_T i, i0
 *         i0 = 2**self.levels-1  # LevelStart             # <<<<<<<<<<<<<<
 *         for i in range(self.count):
 *             out.append(self._values[i0+i])
 */
  __pyx_v_i0 = (__Pyx_pow_long(2, ((long)__pyx_v_self->levels)) - 1);

  /* "skimage/graph/heap.pyx":421
 *         cdef INDEX_T i, i0
 *         i0 = 2**self.levels-1  # LevelStart
 *         for i in range(self.count):             # <<<<<<<<<<<<<<
 *             out.append(self._values[i0+i])
 *         return out
 */
  __pyx_t_2 = __pyx_v_self->count;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;

    /* "skimage/graph/heap.pyx":422
 *         i0 = 2**self.levels-1  # LevelStart
 *         for i in range(self.count):
 *             out.append(self._values[i0+i])             # <<<<<<<<<<<<<<
 *         return out
 * 
 */
    __pyx_t_1 = PyFloat_FromDouble((__pyx_v_self->_values[(__pyx_v_i0 + __pyx_v_i)])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = __Pyx_PyList_Append(__pyx_v_out, __pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "skimage/graph/heap.pyx":423
 *         for i in range(self.count):
 *             out.append(self._values[i0+i])
 *         return out             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_out);
  __pyx_r = __pyx_v_out;
  goto __pyx_L0;

  /* "skimage/graph/heap.pyx":413
 * 
 * 
 *     def values(self):             # <<<<<<<<<<<<<<
 *         """values()
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("skimage.graph.heap.BinaryHeap.values", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_out);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":426
 * 
 * 
 *     def references(self):             # <<<<<<<<<<<<<<
 *         """references()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_17references(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_10BinaryHeap_16references[] = "references()\n\n        Get the references in the heap as a list.\n        ";
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_17references(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("references (wrapper)", 0);
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_16references(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_16references(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self) {
  PyObject *__pyx_v_out = NULL;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_2;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_3;
  int __pyx_t_4;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("references", 0);

  /* "skimage/graph/heap.pyx":431
 *         Get the references in the heap as a list.
 *         """
 *         out = []             # <<<<<<<<<<<<<<
 *         cdef INDEX_T i
 *         for i in range(self.count):
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_out = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "skimage/graph/heap.pyx":433
 *         out = []
 *         cdef INDEX_T i
 *         for i in range(self.count):             # <<<<<<<<<<<<<<
 *             out.append(self._references[i])
 *         return out
 */
  __pyx_t_2 = __pyx_v_self->count;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;

    /* "skimage/graph/heap.pyx":434
 *         cdef INDEX_T i
 *         for i in range(self.count):
 *             out.append(self._references[i])             # <<<<<<<<<<<<<<
 *         return out
 * 
 */
    __pyx_t_1 = PyInt_FromSsize_t((__pyx_v_self->_references[__pyx_v_i])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = __Pyx_PyList_Append(__pyx_v_out, __pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "skimage/graph/heap.pyx":435
 *         for i in range(self.count):
 *             out.append(self._references[i])
 *         return out             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_out);
  __pyx_r = __pyx_v_out;
  goto __pyx_L0;

  /* "skimage/graph/heap.pyx":426
 * 
 * 
 *     def references(self):             # <<<<<<<<<<<<<<
 *         """references()
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("skimage.graph.heap.BinaryHeap.references", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_out);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":438
 * 
 * 
 *     def pop(self):             # <<<<<<<<<<<<<<
 *         """pop()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_19pop(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_10BinaryHeap_18pop[] = "pop()\n\n        Get the minimum value and remove it from the list.\n\n        Returns\n        -------\n        value : float\n        reference : int\n            If no reference was provided, -1 is returned here.\n\n        Raises\n        ------\n        IndexError\n            On attempt to pop from an empty heap\n        ";
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_19pop(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("pop (wrapper)", 0);
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_18pop(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_18pop(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self) {
  PyObject *__pyx_v_value = NULL;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_v_ref;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("pop", 0);

  /* "skimage/graph/heap.pyx":454
 *             On attempt to pop from an empty heap
 *         """
 *         if self.count == 0:             # <<<<<<<<<<<<<<
 *           raise IndexError('pop from an empty heap')
 *         value = self.pop_fast()
 */
  __pyx_t_1 = ((__pyx_v_self->count == 0) != 0);
  if (__pyx_t_1) {

    /* "skimage/graph/heap.pyx":455
 *         """
 *         if self.count == 0:
 *           raise IndexError('pop from an empty heap')             # <<<<<<<<<<<<<<
 *         value = self.pop_fast()
 *         ref = self._popped_ref
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_IndexError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "skimage/graph/heap.pyx":456
 *         if self.count == 0:
 *           raise IndexError('pop from an empty heap')
 *         value = self.pop_fast()             # <<<<<<<<<<<<<<
 *         ref = self._popped_ref
 *         return value, ref
 */
  __pyx_t_2 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self->__pyx_vtab)->pop_fast(__pyx_v_self)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_value = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "skimage/graph/heap.pyx":457
 *           raise IndexError('pop from an empty heap')
 *         value = self.pop_fast()
 *         ref = self._popped_ref             # <<<<<<<<<<<<<<
 *         return value, ref
 * 
 */
  __pyx_t_3 = __pyx_v_self->_popped_ref;
  __pyx_v_ref = __pyx_t_3;

  /* "skimage/graph/heap.pyx":458
 *         value = self.pop_fast()
 *         ref = self._popped_ref
 *         return value, ref             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_ref); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_v_value);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;

  /* "skimage/graph/heap.pyx":438
 * 
 * 
 *     def pop(self):             # <<<<<<<<<<<<<<
 *         """pop()
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("skimage.graph.heap.BinaryHeap.pop", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_value);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pxd":16
 * 
 * cdef class BinaryHeap:
 *     cdef readonly INDEX_T count             # <<<<<<<<<<<<<<
 *     cdef readonly LEVELS_T levels, min_levels
 *     cdef VALUE_T *_values
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_5count_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_5count_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_5count___get__(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_5count___get__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("skimage.graph.heap.BinaryHeap.count.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pxd":17
 * cdef class BinaryHeap:
 *     cdef readonly INDEX_T count
 *     cdef readonly LEVELS_T levels, min_levels             # <<<<<<<<<<<<<<
 *     cdef VALUE_T *_values
 *     cdef REFERENCE_T *_references
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_6levels_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_6levels_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_6levels___get__(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_6levels___get__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_char(__pyx_v_self->levels); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("skimage.graph.heap.BinaryHeap.levels.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_10min_levels_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_10min_levels_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_10BinaryHeap_10min_levels___get__(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_10BinaryHeap_10min_levels___get__(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_unsigned_char(__pyx_v_self->min_levels); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("skimage.graph.heap.BinaryHeap.min_levels.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":514
 *     pathfinding algorithms.
 *     """
 *     def __cinit__(self, INDEX_T initial_capacity=128, max_reference=None):             # <<<<<<<<<<<<<<
 *       if max_reference is None:
 *         max_reference = initial_capacity - 1
 */

/* Python wrapper */
static int __pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_initial_capacity;
  PyObject *__pyx_v_max_reference = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_initial_capacity,&__pyx_n_s_max_reference,0};
    PyObject* values[2] = {0,0};
    values[1] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_initial_capacity);
          if (value) { values[0] = value; kw_args--; }
        }
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_max_reference);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    if (values[0]) {
      __pyx_v_initial_capacity = __Pyx_PyIndex_AsSsize_t(values[0]); if (unlikely((__pyx_v_initial_capacity == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    } else {
      __pyx_v_initial_capacity = ((__pyx_t_7skimage_5graph_4heap_INDEX_T)128);
    }
    __pyx_v_max_reference = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap___cinit__(((struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self), __pyx_v_initial_capacity, __pyx_v_max_reference);

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

static int __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap___cinit__(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_initial_capacity, PyObject *__pyx_v_max_reference) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_t_4;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__cinit__", 0);
  __Pyx_INCREF(__pyx_v_max_reference);

  /* "skimage/graph/heap.pyx":515
 *     """
 *     def __cinit__(self, INDEX_T initial_capacity=128, max_reference=None):
 *       if max_reference is None:             # <<<<<<<<<<<<<<
 *         max_reference = initial_capacity - 1
 *       self.max_reference = max_reference
 */
  __pyx_t_1 = (__pyx_v_max_reference == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "skimage/graph/heap.pyx":516
 *     def __cinit__(self, INDEX_T initial_capacity=128, max_reference=None):
 *       if max_reference is None:
 *         max_reference = initial_capacity - 1             # <<<<<<<<<<<<<<
 *       self.max_reference = max_reference
 *       self._crossref = <INDEX_T *>malloc((self.max_reference+1) * \
 */
    __pyx_t_3 = PyInt_FromSsize_t((__pyx_v_initial_capacity - 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF_SET(__pyx_v_max_reference, __pyx_t_3);
    __pyx_t_3 = 0;
    goto __pyx_L3;
  }
  __pyx_L3:;

  /* "skimage/graph/heap.pyx":517
 *       if max_reference is None:
 *         max_reference = initial_capacity - 1
 *       self.max_reference = max_reference             # <<<<<<<<<<<<<<
 *       self._crossref = <INDEX_T *>malloc((self.max_reference+1) * \
 *                                       sizeof(INDEX_T))
 */
  __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_v_max_reference); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_self->max_reference = __pyx_t_4;

  /* "skimage/graph/heap.pyx":518
 *         max_reference = initial_capacity - 1
 *       self.max_reference = max_reference
 *       self._crossref = <INDEX_T *>malloc((self.max_reference+1) * \             # <<<<<<<<<<<<<<
 *                                       sizeof(INDEX_T))
 * 
 */
  __pyx_v_self->_crossref = ((__pyx_t_7skimage_5graph_4heap_INDEX_T *)malloc(((__pyx_v_self->max_reference + 1) * (sizeof(__pyx_t_7skimage_5graph_4heap_INDEX_T)))));

  /* "skimage/graph/heap.pyx":514
 *     pathfinding algorithms.
 *     """
 *     def __cinit__(self, INDEX_T initial_capacity=128, max_reference=None):             # <<<<<<<<<<<<<<
 *       if max_reference is None:
 *         max_reference = initial_capacity - 1
 */

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_max_reference);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":521
 *                                       sizeof(INDEX_T))
 * 
 *     def __init__(self, INDEX_T initial_capacity=128, max_reference=None):             # <<<<<<<<<<<<<<
 *         """__init__(initial_capacity=128, max_reference=None)
 * 
 */

/* Python wrapper */
static int __pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_3__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_20FastUpdateBinaryHeap_2__init__[] = "__init__(initial_capacity=128, max_reference=None)\n\n        Class constructor.\n        ";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_7skimage_5graph_4heap_20FastUpdateBinaryHeap_2__init__;
#endif
static int __pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_3__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_initial_capacity;
  CYTHON_UNUSED PyObject *__pyx_v_max_reference = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_initial_capacity,&__pyx_n_s_max_reference,0};
    PyObject* values[2] = {0,0};
    values[1] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_initial_capacity);
          if (value) { values[0] = value; kw_args--; }
        }
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_max_reference);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    if (values[0]) {
      __pyx_v_initial_capacity = __Pyx_PyIndex_AsSsize_t(values[0]); if (unlikely((__pyx_v_initial_capacity == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    } else {
      __pyx_v_initial_capacity = ((__pyx_t_7skimage_5graph_4heap_INDEX_T)128);
    }
    __pyx_v_max_reference = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_2__init__(((struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self), __pyx_v_initial_capacity, __pyx_v_max_reference);

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

static int __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_2__init__(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_initial_capacity, CYTHON_UNUSED PyObject *__pyx_v_max_reference) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__init__", 0);

  /* "skimage/graph/heap.pyx":527
 *         """
 *         # below will call self.reset
 *         BinaryHeap.__init__(self, initial_capacity)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)((PyObject*)__pyx_ptype_7skimage_5graph_4heap_BinaryHeap)), __pyx_n_s_init); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_initial_capacity); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "skimage/graph/heap.pyx":521
 *                                       sizeof(INDEX_T))
 * 
 *     def __init__(self, INDEX_T initial_capacity=128, max_reference=None):             # <<<<<<<<<<<<<<
 *         """__init__(initial_capacity=128, max_reference=None)
 * 
 */

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":530
 * 
 * 
 *     def __dealloc__(self):             # <<<<<<<<<<<<<<
 *         if self._crossref is not NULL:
 *             free(self._crossref)
 */

/* Python wrapper */
static void __pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_5__dealloc__(PyObject *__pyx_v_self); /*proto*/
static void __pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_5__dealloc__(PyObject *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
  __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_4__dealloc__(((struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self));

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

static void __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_4__dealloc__(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  __Pyx_RefNannySetupContext("__dealloc__", 0);

  /* "skimage/graph/heap.pyx":531
 * 
 *     def __dealloc__(self):
 *         if self._crossref is not NULL:             # <<<<<<<<<<<<<<
 *             free(self._crossref)
 * 
 */
  __pyx_t_1 = ((__pyx_v_self->_crossref != NULL) != 0);
  if (__pyx_t_1) {

    /* "skimage/graph/heap.pyx":532
 *     def __dealloc__(self):
 *         if self._crossref is not NULL:
 *             free(self._crossref)             # <<<<<<<<<<<<<<
 * 
 *     def reset(self):
 */
    free(__pyx_v_self->_crossref);
    goto __pyx_L3;
  }
  __pyx_L3:;

  /* "skimage/graph/heap.pyx":530
 * 
 * 
 *     def __dealloc__(self):             # <<<<<<<<<<<<<<
 *         if self._crossref is not NULL:
 *             free(self._crossref)
 */

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

/* "skimage/graph/heap.pyx":534
 *             free(self._crossref)
 * 
 *     def reset(self):             # <<<<<<<<<<<<<<
 *         """reset()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_7reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_20FastUpdateBinaryHeap_6reset[] = "reset()\n\n        Reset the heap to default, empty state.\n        ";
static PyObject *__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_7reset(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("reset (wrapper)", 0);
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_6reset(((struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_6reset(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self) {
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_t_4;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_5;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("reset", 0);

  /* "skimage/graph/heap.pyx":539
 *         Reset the heap to default, empty state.
 *         """
 *         BinaryHeap.reset(self)             # <<<<<<<<<<<<<<
 *         # set default values of crossrefs
 *         cdef INDEX_T i
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)((PyObject*)__pyx_ptype_7skimage_5graph_4heap_BinaryHeap)), __pyx_n_s_reset); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "skimage/graph/heap.pyx":542
 *         # set default values of crossrefs
 *         cdef INDEX_T i
 *         for i in range(self.max_reference+1):             # <<<<<<<<<<<<<<
 *             self._crossref[i] = -1
 * 
 */
  __pyx_t_4 = (__pyx_v_self->max_reference + 1);
  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_i = __pyx_t_5;

    /* "skimage/graph/heap.pyx":543
 *         cdef INDEX_T i
 *         for i in range(self.max_reference+1):
 *             self._crossref[i] = -1             # <<<<<<<<<<<<<<
 * 
 * 
 */
    (__pyx_v_self->_crossref[__pyx_v_i]) = -1;
  }

  /* "skimage/graph/heap.pyx":534
 *             free(self._crossref)
 * 
 *     def reset(self):             # <<<<<<<<<<<<<<
 *         """reset()
 * 
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.reset", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":546
 * 
 * 
 *     cdef void _remove(self, INDEX_T i1):             # <<<<<<<<<<<<<<
 *         """ Remove a value from the heap. By index. """
 *         cdef LEVELS_T levels = self.levels
 */

static void __pyx_f_7skimage_5graph_4heap_20FastUpdateBinaryHeap__remove(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i1) {
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_v_levels;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_count;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i0;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i2;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_r1;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_r2;
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_v_values;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T *__pyx_v_references;
  __pyx_t_7skimage_5graph_4heap_INDEX_T *__pyx_v_crossref;
  __Pyx_RefNannyDeclarations
  __pyx_t_7skimage_5graph_4heap_LEVELS_T __pyx_t_1;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_2;
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_t_3;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T *__pyx_t_4;
  __pyx_t_7skimage_5graph_4heap_INDEX_T *__pyx_t_5;
  int __pyx_t_6;
  __Pyx_RefNannySetupContext("_remove", 0);

  /* "skimage/graph/heap.pyx":548
 *     cdef void _remove(self, INDEX_T i1):
 *         """ Remove a value from the heap. By index. """
 *         cdef LEVELS_T levels = self.levels             # <<<<<<<<<<<<<<
 *         cdef INDEX_T count = self.count
 * 
 */
  __pyx_t_1 = __pyx_v_self->__pyx_base.levels;
  __pyx_v_levels = __pyx_t_1;

  /* "skimage/graph/heap.pyx":549
 *         """ Remove a value from the heap. By index. """
 *         cdef LEVELS_T levels = self.levels
 *         cdef INDEX_T count = self.count             # <<<<<<<<<<<<<<
 * 
 *         # get indices
 */
  __pyx_t_2 = __pyx_v_self->__pyx_base.count;
  __pyx_v_count = __pyx_t_2;

  /* "skimage/graph/heap.pyx":552
 * 
 *         # get indices
 *         cdef INDEX_T i0 = (1 << levels) - 1  #2**self.levels - 1 # LevelStart             # <<<<<<<<<<<<<<
 *         cdef INDEX_T i2 = i0 + count - 1
 * 
 */
  __pyx_v_i0 = ((1 << __pyx_v_levels) - 1);

  /* "skimage/graph/heap.pyx":553
 *         # get indices
 *         cdef INDEX_T i0 = (1 << levels) - 1  #2**self.levels - 1 # LevelStart
 *         cdef INDEX_T i2 = i0 + count - 1             # <<<<<<<<<<<<<<
 * 
 *         # get relative indices
 */
  __pyx_v_i2 = ((__pyx_v_i0 + __pyx_v_count) - 1);

  /* "skimage/graph/heap.pyx":556
 * 
 *         # get relative indices
 *         cdef INDEX_T r1 = i1 - i0             # <<<<<<<<<<<<<<
 *         cdef INDEX_T r2 = count - 1
 * 
 */
  __pyx_v_r1 = (__pyx_v_i1 - __pyx_v_i0);

  /* "skimage/graph/heap.pyx":557
 *         # get relative indices
 *         cdef INDEX_T r1 = i1 - i0
 *         cdef INDEX_T r2 = count - 1             # <<<<<<<<<<<<<<
 * 
 *         cdef VALUE_T *values = self._values
 */
  __pyx_v_r2 = (__pyx_v_count - 1);

  /* "skimage/graph/heap.pyx":559
 *         cdef INDEX_T r2 = count - 1
 * 
 *         cdef VALUE_T *values = self._values             # <<<<<<<<<<<<<<
 *         cdef REFERENCE_T *references = self._references
 *         cdef INDEX_T *crossref = self._crossref
 */
  __pyx_t_3 = __pyx_v_self->__pyx_base._values;
  __pyx_v_values = __pyx_t_3;

  /* "skimage/graph/heap.pyx":560
 * 
 *         cdef VALUE_T *values = self._values
 *         cdef REFERENCE_T *references = self._references             # <<<<<<<<<<<<<<
 *         cdef INDEX_T *crossref = self._crossref
 * 
 */
  __pyx_t_4 = __pyx_v_self->__pyx_base._references;
  __pyx_v_references = __pyx_t_4;

  /* "skimage/graph/heap.pyx":561
 *         cdef VALUE_T *values = self._values
 *         cdef REFERENCE_T *references = self._references
 *         cdef INDEX_T *crossref = self._crossref             # <<<<<<<<<<<<<<
 * 
 *         # update cross reference
 */
  __pyx_t_5 = __pyx_v_self->_crossref;
  __pyx_v_crossref = __pyx_t_5;

  /* "skimage/graph/heap.pyx":564
 * 
 *         # update cross reference
 *         crossref[references[r2]]=r1             # <<<<<<<<<<<<<<
 *         crossref[references[r1]]=-1  # disable removed item
 * 
 */
  (__pyx_v_crossref[(__pyx_v_references[__pyx_v_r2])]) = __pyx_v_r1;

  /* "skimage/graph/heap.pyx":565
 *         # update cross reference
 *         crossref[references[r2]]=r1
 *         crossref[references[r1]]=-1  # disable removed item             # <<<<<<<<<<<<<<
 * 
 *         # swap with last
 */
  (__pyx_v_crossref[(__pyx_v_references[__pyx_v_r1])]) = -1;

  /* "skimage/graph/heap.pyx":568
 * 
 *         # swap with last
 *         values[i1] = values[i2]             # <<<<<<<<<<<<<<
 *         references[r1] = references[r2]
 * 
 */
  (__pyx_v_values[__pyx_v_i1]) = (__pyx_v_values[__pyx_v_i2]);

  /* "skimage/graph/heap.pyx":569
 *         # swap with last
 *         values[i1] = values[i2]
 *         references[r1] = references[r2]             # <<<<<<<<<<<<<<
 * 
 *         # make last Null
 */
  (__pyx_v_references[__pyx_v_r1]) = (__pyx_v_references[__pyx_v_r2]);

  /* "skimage/graph/heap.pyx":572
 * 
 *         # make last Null
 *         values[i2] = inf             # <<<<<<<<<<<<<<
 * 
 *         # update
 */
  (__pyx_v_values[__pyx_v_i2]) = __pyx_v_7skimage_5graph_4heap_inf;

  /* "skimage/graph/heap.pyx":575
 * 
 *         # update
 *         self.count -= 1             # <<<<<<<<<<<<<<
 *         count -= 1
 *         if (levels > self.min_levels) & (count < (1 << (levels-2))):
 */
  __pyx_v_self->__pyx_base.count = (__pyx_v_self->__pyx_base.count - 1);

  /* "skimage/graph/heap.pyx":576
 *         # update
 *         self.count -= 1
 *         count -= 1             # <<<<<<<<<<<<<<
 *         if (levels > self.min_levels) & (count < (1 << (levels-2))):
 *             self._add_or_remove_level(-1)
 */
  __pyx_v_count = (__pyx_v_count - 1);

  /* "skimage/graph/heap.pyx":577
 *         self.count -= 1
 *         count -= 1
 *         if (levels > self.min_levels) & (count < (1 << (levels-2))):             # <<<<<<<<<<<<<<
 *             self._add_or_remove_level(-1)
 *         else:
 */
  __pyx_t_6 = (((__pyx_v_levels > __pyx_v_self->__pyx_base.min_levels) & (__pyx_v_count < (1 << (__pyx_v_levels - 2)))) != 0);
  if (__pyx_t_6) {

    /* "skimage/graph/heap.pyx":578
 *         count -= 1
 *         if (levels > self.min_levels) & (count < (1 << (levels-2))):
 *             self._add_or_remove_level(-1)             # <<<<<<<<<<<<<<
 *         else:
 *             self._update_one(i1)
 */
    ((struct __pyx_vtabstruct_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._add_or_remove_level(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self), -1);
    goto __pyx_L3;
  }
  /*else*/ {

    /* "skimage/graph/heap.pyx":580
 *             self._add_or_remove_level(-1)
 *         else:
 *             self._update_one(i1)             # <<<<<<<<<<<<<<
 *             self._update_one(i2)
 * 
 */
    ((struct __pyx_vtabstruct_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._update_one(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self), __pyx_v_i1);

    /* "skimage/graph/heap.pyx":581
 *         else:
 *             self._update_one(i1)
 *             self._update_one(i2)             # <<<<<<<<<<<<<<
 * 
 * 
 */
    ((struct __pyx_vtabstruct_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._update_one(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self), __pyx_v_i2);
  }
  __pyx_L3:;

  /* "skimage/graph/heap.pyx":546
 * 
 * 
 *     cdef void _remove(self, INDEX_T i1):             # <<<<<<<<<<<<<<
 *         """ Remove a value from the heap. By index. """
 *         cdef LEVELS_T levels = self.levels
 */

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

/* "skimage/graph/heap.pyx":584
 * 
 * 
 *     cdef INDEX_T push_fast(self, VALUE_T value, REFERENCE_T reference):             # <<<<<<<<<<<<<<
 *         """The c method for fast pushing.
 * 
 */

static __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_f_7skimage_5graph_4heap_20FastUpdateBinaryHeap_push_fast(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_VALUE_T __pyx_v_value, __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_v_reference) {
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_ir;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  __Pyx_RefNannySetupContext("push_fast", 0);

  /* "skimage/graph/heap.pyx":592
 *         If -1 is returned, the provided reference was out-of-bounds and no
 *         value was pushed to the heap."""
 *         if not (0 <= reference <= self.max_reference):             # <<<<<<<<<<<<<<
 *           return -1
 * 
 */
  __pyx_t_1 = (0 <= __pyx_v_reference);
  if (__pyx_t_1) {
    __pyx_t_1 = (__pyx_v_reference <= __pyx_v_self->max_reference);
  }
  __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
  if (__pyx_t_2) {

    /* "skimage/graph/heap.pyx":593
 *         value was pushed to the heap."""
 *         if not (0 <= reference <= self.max_reference):
 *           return -1             # <<<<<<<<<<<<<<
 * 
 *         # init variable to store the index-in-the-heap
 */
    __pyx_r = -1;
    goto __pyx_L0;
  }

  /* "skimage/graph/heap.pyx":600
 *         # Reference is the index in the array where MCP is applied to.
 *         # Find the index-in-the-heap using the crossref array.
 *         cdef INDEX_T ir = self._crossref[reference]             # <<<<<<<<<<<<<<
 * 
 *         if ir != -1:
 */
  __pyx_v_ir = (__pyx_v_self->_crossref[__pyx_v_reference]);

  /* "skimage/graph/heap.pyx":602
 *         cdef INDEX_T ir = self._crossref[reference]
 * 
 *         if ir != -1:             # <<<<<<<<<<<<<<
 *             # update
 *             i = (1 << self.levels) - 1 + ir
 */
  __pyx_t_2 = ((__pyx_v_ir != -1) != 0);
  if (__pyx_t_2) {

    /* "skimage/graph/heap.pyx":604
 *         if ir != -1:
 *             # update
 *             i = (1 << self.levels) - 1 + ir             # <<<<<<<<<<<<<<
 *             self._values[i] = value
 *             self._update_one(i)
 */
    __pyx_v_i = (((1 << __pyx_v_self->__pyx_base.levels) - 1) + __pyx_v_ir);

    /* "skimage/graph/heap.pyx":605
 *             # update
 *             i = (1 << self.levels) - 1 + ir
 *             self._values[i] = value             # <<<<<<<<<<<<<<
 *             self._update_one(i)
 *             return ir
 */
    (__pyx_v_self->__pyx_base._values[__pyx_v_i]) = __pyx_v_value;

    /* "skimage/graph/heap.pyx":606
 *             i = (1 << self.levels) - 1 + ir
 *             self._values[i] = value
 *             self._update_one(i)             # <<<<<<<<<<<<<<
 *             return ir
 * 
 */
    ((struct __pyx_vtabstruct_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._update_one(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self), __pyx_v_i);

    /* "skimage/graph/heap.pyx":607
 *             self._values[i] = value
 *             self._update_one(i)
 *             return ir             # <<<<<<<<<<<<<<
 * 
 *         # if not updated: append normally and store reference
 */
    __pyx_r = __pyx_v_ir;
    goto __pyx_L0;
  }

  /* "skimage/graph/heap.pyx":610
 * 
 *         # if not updated: append normally and store reference
 *         ir = BinaryHeap.push_fast(self, value, reference)             # <<<<<<<<<<<<<<
 *         self._crossref[reference] = ir
 *         return ir
 */
  __pyx_v_ir = __pyx_vtabptr_7skimage_5graph_4heap_BinaryHeap->push_fast(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self), __pyx_v_value, __pyx_v_reference);

  /* "skimage/graph/heap.pyx":611
 *         # if not updated: append normally and store reference
 *         ir = BinaryHeap.push_fast(self, value, reference)
 *         self._crossref[reference] = ir             # <<<<<<<<<<<<<<
 *         return ir
 * 
 */
  (__pyx_v_self->_crossref[__pyx_v_reference]) = __pyx_v_ir;

  /* "skimage/graph/heap.pyx":612
 *         ir = BinaryHeap.push_fast(self, value, reference)
 *         self._crossref[reference] = ir
 *         return ir             # <<<<<<<<<<<<<<
 * 
 *     cdef INDEX_T push_if_lower_fast(self, VALUE_T value, REFERENCE_T reference):
 */
  __pyx_r = __pyx_v_ir;
  goto __pyx_L0;

  /* "skimage/graph/heap.pyx":584
 * 
 * 
 *     cdef INDEX_T push_fast(self, VALUE_T value, REFERENCE_T reference):             # <<<<<<<<<<<<<<
 *         """The c method for fast pushing.
 * 
 */

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

/* "skimage/graph/heap.pyx":614
 *         return ir
 * 
 *     cdef INDEX_T push_if_lower_fast(self, VALUE_T value, REFERENCE_T reference):             # <<<<<<<<<<<<<<
 *         """If the reference is already present, will update its value ONLY if
 *         the new value is lower than the old one. If the reference is not
 */

static __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_f_7skimage_5graph_4heap_20FastUpdateBinaryHeap_push_if_lower_fast(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_VALUE_T __pyx_v_value, __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_v_reference) {
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_ir;
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_v_values;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  __pyx_t_7skimage_5graph_4heap_VALUE_T *__pyx_t_3;
  __Pyx_RefNannySetupContext("push_if_lower_fast", 0);

  /* "skimage/graph/heap.pyx":623
 *         value was pushed to the heap.
 *         """
 *         if not (0 <= reference <= self.max_reference):             # <<<<<<<<<<<<<<
 *             return -1
 * 
 */
  __pyx_t_1 = (0 <= __pyx_v_reference);
  if (__pyx_t_1) {
    __pyx_t_1 = (__pyx_v_reference <= __pyx_v_self->max_reference);
  }
  __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
  if (__pyx_t_2) {

    /* "skimage/graph/heap.pyx":624
 *         """
 *         if not (0 <= reference <= self.max_reference):
 *             return -1             # <<<<<<<<<<<<<<
 * 
 *         # init variable to store the index-in-the-heap
 */
    __pyx_r = -1;
    goto __pyx_L0;
  }

  /* "skimage/graph/heap.pyx":631
 *         # Reference is the index in the array where MCP is applied to.
 *         # Find the index-in-the-heap using the crossref array.
 *         cdef INDEX_T ir = self._crossref[reference]             # <<<<<<<<<<<<<<
 *         cdef VALUE_T *values = self._values
 *         self._pushed = 1
 */
  __pyx_v_ir = (__pyx_v_self->_crossref[__pyx_v_reference]);

  /* "skimage/graph/heap.pyx":632
 *         # Find the index-in-the-heap using the crossref array.
 *         cdef INDEX_T ir = self._crossref[reference]
 *         cdef VALUE_T *values = self._values             # <<<<<<<<<<<<<<
 *         self._pushed = 1
 *         if ir != -1:
 */
  __pyx_t_3 = __pyx_v_self->__pyx_base._values;
  __pyx_v_values = __pyx_t_3;

  /* "skimage/graph/heap.pyx":633
 *         cdef INDEX_T ir = self._crossref[reference]
 *         cdef VALUE_T *values = self._values
 *         self._pushed = 1             # <<<<<<<<<<<<<<
 *         if ir != -1:
 *             # update
 */
  __pyx_v_self->_pushed = 1;

  /* "skimage/graph/heap.pyx":634
 *         cdef VALUE_T *values = self._values
 *         self._pushed = 1
 *         if ir != -1:             # <<<<<<<<<<<<<<
 *             # update
 *             i = (1 << self.levels) - 1 + ir
 */
  __pyx_t_2 = ((__pyx_v_ir != -1) != 0);
  if (__pyx_t_2) {

    /* "skimage/graph/heap.pyx":636
 *         if ir != -1:
 *             # update
 *             i = (1 << self.levels) - 1 + ir             # <<<<<<<<<<<<<<
 *             if values[i] > value:
 *                 values[i] = value
 */
    __pyx_v_i = (((1 << __pyx_v_self->__pyx_base.levels) - 1) + __pyx_v_ir);

    /* "skimage/graph/heap.pyx":637
 *             # update
 *             i = (1 << self.levels) - 1 + ir
 *             if values[i] > value:             # <<<<<<<<<<<<<<
 *                 values[i] = value
 *                 self._update_one(i)
 */
    __pyx_t_2 = (((__pyx_v_values[__pyx_v_i]) > __pyx_v_value) != 0);
    if (__pyx_t_2) {

      /* "skimage/graph/heap.pyx":638
 *             i = (1 << self.levels) - 1 + ir
 *             if values[i] > value:
 *                 values[i] = value             # <<<<<<<<<<<<<<
 *                 self._update_one(i)
 *             else:
 */
      (__pyx_v_values[__pyx_v_i]) = __pyx_v_value;

      /* "skimage/graph/heap.pyx":639
 *             if values[i] > value:
 *                 values[i] = value
 *                 self._update_one(i)             # <<<<<<<<<<<<<<
 *             else:
 *                 self._pushed = 0
 */
      ((struct __pyx_vtabstruct_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._update_one(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self), __pyx_v_i);
      goto __pyx_L5;
    }
    /*else*/ {

      /* "skimage/graph/heap.pyx":641
 *                 self._update_one(i)
 *             else:
 *                 self._pushed = 0             # <<<<<<<<<<<<<<
 *             return ir
 * 
 */
      __pyx_v_self->_pushed = 0;
    }
    __pyx_L5:;

    /* "skimage/graph/heap.pyx":642
 *             else:
 *                 self._pushed = 0
 *             return ir             # <<<<<<<<<<<<<<
 * 
 *         # if not updated: append normally and store reference
 */
    __pyx_r = __pyx_v_ir;
    goto __pyx_L0;
  }

  /* "skimage/graph/heap.pyx":645
 * 
 *         # if not updated: append normally and store reference
 *         ir = BinaryHeap.push_fast(self, value, reference)             # <<<<<<<<<<<<<<
 *         self._crossref[reference] = ir
 *         return ir
 */
  __pyx_v_ir = __pyx_vtabptr_7skimage_5graph_4heap_BinaryHeap->push_fast(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self), __pyx_v_value, __pyx_v_reference);

  /* "skimage/graph/heap.pyx":646
 *         # if not updated: append normally and store reference
 *         ir = BinaryHeap.push_fast(self, value, reference)
 *         self._crossref[reference] = ir             # <<<<<<<<<<<<<<
 *         return ir
 * 
 */
  (__pyx_v_self->_crossref[__pyx_v_reference]) = __pyx_v_ir;

  /* "skimage/graph/heap.pyx":647
 *         ir = BinaryHeap.push_fast(self, value, reference)
 *         self._crossref[reference] = ir
 *         return ir             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_r = __pyx_v_ir;
  goto __pyx_L0;

  /* "skimage/graph/heap.pyx":614
 *         return ir
 * 
 *     cdef INDEX_T push_if_lower_fast(self, VALUE_T value, REFERENCE_T reference):             # <<<<<<<<<<<<<<
 *         """If the reference is already present, will update its value ONLY if
 *         the new value is lower than the old one. If the reference is not
 */

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

/* "skimage/graph/heap.pyx":650
 * 
 * 
 *     cdef VALUE_T value_of_fast(self, REFERENCE_T reference):             # <<<<<<<<<<<<<<
 *         """Return the value corresponding to the given reference. If inf
 *         is returned, the reference may be invalid: check the _invaild_ref
 */

static __pyx_t_7skimage_5graph_4heap_VALUE_T __pyx_f_7skimage_5graph_4heap_20FastUpdateBinaryHeap_value_of_fast(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_v_reference) {
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_ir;
  __pyx_t_7skimage_5graph_4heap_VALUE_T __pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("value_of_fast", 0);

  /* "skimage/graph/heap.pyx":655
 *         field in this case."""
 * 
 *         if not (0 <= reference <= self.max_reference):             # <<<<<<<<<<<<<<
 *             self.invalid_ref = 1
 *             return inf
 */
  __pyx_t_1 = (0 <= __pyx_v_reference);
  if (__pyx_t_1) {
    __pyx_t_1 = (__pyx_v_reference <= __pyx_v_self->max_reference);
  }
  __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
  if (__pyx_t_2) {

    /* "skimage/graph/heap.pyx":656
 * 
 *         if not (0 <= reference <= self.max_reference):
 *             self.invalid_ref = 1             # <<<<<<<<<<<<<<
 *             return inf
 * 
 */
    if (__Pyx_PyObject_SetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_invalid_ref, __pyx_int_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 656; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "skimage/graph/heap.pyx":657
 *         if not (0 <= reference <= self.max_reference):
 *             self.invalid_ref = 1
 *             return inf             # <<<<<<<<<<<<<<
 * 
 *         # init variable to store the index-in-the-heap
 */
    __pyx_r = __pyx_v_7skimage_5graph_4heap_inf;
    goto __pyx_L0;
  }

  /* "skimage/graph/heap.pyx":664
 *         # Reference is the index in the array where MCP is applied to.
 *         # Find the index-in-the-heap using the crossref array.
 *         cdef INDEX_T ir = self._crossref[reference]             # <<<<<<<<<<<<<<
 *         self._invalid_ref = 0
 *         if ir == -1:
 */
  __pyx_v_ir = (__pyx_v_self->_crossref[__pyx_v_reference]);

  /* "skimage/graph/heap.pyx":665
 *         # Find the index-in-the-heap using the crossref array.
 *         cdef INDEX_T ir = self._crossref[reference]
 *         self._invalid_ref = 0             # <<<<<<<<<<<<<<
 *         if ir == -1:
 *             self._invalid_ref = 1
 */
  __pyx_v_self->_invalid_ref = 0;

  /* "skimage/graph/heap.pyx":666
 *         cdef INDEX_T ir = self._crossref[reference]
 *         self._invalid_ref = 0
 *         if ir == -1:             # <<<<<<<<<<<<<<
 *             self._invalid_ref = 1
 *             return inf
 */
  __pyx_t_2 = ((__pyx_v_ir == -1) != 0);
  if (__pyx_t_2) {

    /* "skimage/graph/heap.pyx":667
 *         self._invalid_ref = 0
 *         if ir == -1:
 *             self._invalid_ref = 1             # <<<<<<<<<<<<<<
 *             return inf
 *         i = (1 << self.levels) - 1 + ir
 */
    __pyx_v_self->_invalid_ref = 1;

    /* "skimage/graph/heap.pyx":668
 *         if ir == -1:
 *             self._invalid_ref = 1
 *             return inf             # <<<<<<<<<<<<<<
 *         i = (1 << self.levels) - 1 + ir
 *         return self._values[i]
 */
    __pyx_r = __pyx_v_7skimage_5graph_4heap_inf;
    goto __pyx_L0;
  }

  /* "skimage/graph/heap.pyx":669
 *             self._invalid_ref = 1
 *             return inf
 *         i = (1 << self.levels) - 1 + ir             # <<<<<<<<<<<<<<
 *         return self._values[i]
 * 
 */
  __pyx_v_i = (((1 << __pyx_v_self->__pyx_base.levels) - 1) + __pyx_v_ir);

  /* "skimage/graph/heap.pyx":670
 *             return inf
 *         i = (1 << self.levels) - 1 + ir
 *         return self._values[i]             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_r = (__pyx_v_self->__pyx_base._values[__pyx_v_i]);
  goto __pyx_L0;

  /* "skimage/graph/heap.pyx":650
 * 
 * 
 *     cdef VALUE_T value_of_fast(self, REFERENCE_T reference):             # <<<<<<<<<<<<<<
 *         """Return the value corresponding to the given reference. If inf
 *         is returned, the reference may be invalid: check the _invaild_ref
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("skimage.graph.heap.FastUpdateBinaryHeap.value_of_fast", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":673
 * 
 * 
 *     def push(self, double value, int reference):             # <<<<<<<<<<<<<<
 *         """push(value, reference)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_9push(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_20FastUpdateBinaryHeap_8push[] = "push(value, reference)\n\n        Append/update a value in the heap.\n\n        Parameters\n        ----------\n        value : float\n        reference : int\n            If the reference is already present in the array, the value for\n            that reference will be updated, otherwise the (value, reference)\n            pair will be added to the heap.\n\n        Raises\n        ------\n        ValueError\n            On pushing a reference outside the range [0, max_reference].\n        ";
static PyObject *__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_9push(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  double __pyx_v_value;
  int __pyx_v_reference;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("push (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_value,&__pyx_n_s_reference,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_value)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_reference)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("push", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "push") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_value = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_value == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    __pyx_v_reference = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_reference == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("push", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 673; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.push", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_8push(((struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self), __pyx_v_value, __pyx_v_reference);

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_8push(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, double __pyx_v_value, int __pyx_v_reference) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("push", 0);

  /* "skimage/graph/heap.pyx":691
 *             On pushing a reference outside the range [0, max_reference].
 *         """
 *         if self.push_fast(value, reference) == -1:             # <<<<<<<<<<<<<<
 *             raise ValueError("reference outside of range [0, max_reference]")
 * 
 */
  __pyx_t_1 = ((((struct __pyx_vtabstruct_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.push_fast(((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)__pyx_v_self), __pyx_v_value, __pyx_v_reference) == -1) != 0);
  if (__pyx_t_1) {

    /* "skimage/graph/heap.pyx":692
 *         """
 *         if self.push_fast(value, reference) == -1:
 *             raise ValueError("reference outside of range [0, max_reference]")             # <<<<<<<<<<<<<<
 * 
 *     def push_if_lower(self, double value, int reference):
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 692; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 692; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "skimage/graph/heap.pyx":673
 * 
 * 
 *     def push(self, double value, int reference):             # <<<<<<<<<<<<<<
 *         """push(value, reference)
 * 
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.push", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":694
 *             raise ValueError("reference outside of range [0, max_reference]")
 * 
 *     def push_if_lower(self, double value, int reference):             # <<<<<<<<<<<<<<
 *         """push_if_lower(value, reference)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_11push_if_lower(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_20FastUpdateBinaryHeap_10push_if_lower[] = "push_if_lower(value, reference)\n\n        Append/update a value in the heap if the extant value is lower.\n\n        If the reference is already in the heap, update only of the new value\n        is lower than the current one. If the reference is not present, the\n        value will always be pushed to the heap.\n\n        Parameters\n        ----------\n        value : float\n        reference : int\n            If the reference is already present in the array, the value for\n            that reference will be updated, otherwise the (value, reference)\n            pair will be added to the heap.\n\n        Returns\n        -------\n        pushed : bool\n            True if an append/update occured, False if otherwise.\n\n        Raises\n        ------\n        ValueError\n            On pushing a reference outside the range [0, max_reference].\n        ";
static PyObject *__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_11push_if_lower(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  double __pyx_v_value;
  int __pyx_v_reference;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("push_if_lower (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_value,&__pyx_n_s_reference,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_value)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_reference)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("push_if_lower", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 694; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "push_if_lower") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 694; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_value = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_value == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 694; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    __pyx_v_reference = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_reference == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 694; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("push_if_lower", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 694; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.push_if_lower", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_10push_if_lower(((struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self), __pyx_v_value, __pyx_v_reference);

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_10push_if_lower(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, double __pyx_v_value, int __pyx_v_reference) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("push_if_lower", 0);

  /* "skimage/graph/heap.pyx":721
 *             On pushing a reference outside the range [0, max_reference].
 *         """
 *         if self.push_if_lower_fast(value, reference) == -1:             # <<<<<<<<<<<<<<
 *           raise ValueError("reference outside of range [0, max_reference]")
 *         return self._pushed == 1
 */
  __pyx_t_1 = ((((struct __pyx_vtabstruct_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self->__pyx_base.__pyx_vtab)->push_if_lower_fast(__pyx_v_self, __pyx_v_value, __pyx_v_reference) == -1) != 0);
  if (__pyx_t_1) {

    /* "skimage/graph/heap.pyx":722
 *         """
 *         if self.push_if_lower_fast(value, reference) == -1:
 *           raise ValueError("reference outside of range [0, max_reference]")             # <<<<<<<<<<<<<<
 *         return self._pushed == 1
 * 
 */
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "skimage/graph/heap.pyx":723
 *         if self.push_if_lower_fast(value, reference) == -1:
 *           raise ValueError("reference outside of range [0, max_reference]")
 *         return self._pushed == 1             # <<<<<<<<<<<<<<
 * 
 *     def value_of(self, int reference):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyBool_FromLong((__pyx_v_self->_pushed == 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 723; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "skimage/graph/heap.pyx":694
 *             raise ValueError("reference outside of range [0, max_reference]")
 * 
 *     def push_if_lower(self, double value, int reference):             # <<<<<<<<<<<<<<
 *         """push_if_lower(value, reference)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.push_if_lower", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":725
 *         return self._pushed == 1
 * 
 *     def value_of(self, int reference):             # <<<<<<<<<<<<<<
 *         """value_of(reference)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_13value_of(PyObject *__pyx_v_self, PyObject *__pyx_arg_reference); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_20FastUpdateBinaryHeap_12value_of[] = "value_of(reference)\n\n        Get the value corresponding to a given reference.\n\n        Parameters\n        ----------\n        reference : int\n            A reference already pushed to the heap.\n\n        Returns\n        -------\n        value : float\n\n        Raises\n        ------\n        ValueError\n            On querying a reference outside the range [0, max_reference], or\n            not already pushed to the heap.\n        ";
static PyObject *__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_13value_of(PyObject *__pyx_v_self, PyObject *__pyx_arg_reference) {
  int __pyx_v_reference;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("value_of (wrapper)", 0);
  assert(__pyx_arg_reference); {
    __pyx_v_reference = __Pyx_PyInt_As_int(__pyx_arg_reference); if (unlikely((__pyx_v_reference == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 725; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.value_of", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_12value_of(((struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self), ((int)__pyx_v_reference));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_12value_of(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self, int __pyx_v_reference) {
  PyObject *__pyx_v_value = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("value_of", 0);

  /* "skimage/graph/heap.pyx":745
 *             not already pushed to the heap.
 *         """
 *         value = self.value_of_fast(reference)             # <<<<<<<<<<<<<<
 *         if self._invalid_ref:
 *             raise ValueError('invalid reference')
 */
  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self->__pyx_base.__pyx_vtab)->value_of_fast(__pyx_v_self, __pyx_v_reference)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 745; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_value = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "skimage/graph/heap.pyx":746
 *         """
 *         value = self.value_of_fast(reference)
 *         if self._invalid_ref:             # <<<<<<<<<<<<<<
 *             raise ValueError('invalid reference')
 *         return value
 */
  __pyx_t_2 = (__pyx_v_self->_invalid_ref != 0);
  if (__pyx_t_2) {

    /* "skimage/graph/heap.pyx":747
 *         value = self.value_of_fast(reference)
 *         if self._invalid_ref:
 *             raise ValueError('invalid reference')             # <<<<<<<<<<<<<<
 *         return value
 * 
 */
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 747; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 747; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "skimage/graph/heap.pyx":748
 *         if self._invalid_ref:
 *             raise ValueError('invalid reference')
 *         return value             # <<<<<<<<<<<<<<
 * 
 *     def cross_references(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_value);
  __pyx_r = __pyx_v_value;
  goto __pyx_L0;

  /* "skimage/graph/heap.pyx":725
 *         return self._pushed == 1
 * 
 *     def value_of(self, int reference):             # <<<<<<<<<<<<<<
 *         """value_of(reference)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.value_of", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_value);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pyx":750
 *         return value
 * 
 *     def cross_references(self):             # <<<<<<<<<<<<<<
 *         """Get the cross references in the heap as a list."""
 *         out = []
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_15cross_references(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_7skimage_5graph_4heap_20FastUpdateBinaryHeap_14cross_references[] = "Get the cross references in the heap as a list.";
static PyObject *__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_15cross_references(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("cross_references (wrapper)", 0);
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_14cross_references(((struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_14cross_references(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self) {
  PyObject *__pyx_v_out = NULL;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_v_i;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __pyx_t_7skimage_5graph_4heap_REFERENCE_T __pyx_t_2;
  __pyx_t_7skimage_5graph_4heap_INDEX_T __pyx_t_3;
  int __pyx_t_4;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("cross_references", 0);

  /* "skimage/graph/heap.pyx":752
 *     def cross_references(self):
 *         """Get the cross references in the heap as a list."""
 *         out = []             # <<<<<<<<<<<<<<
 *         cdef INDEX_T i
 *         for i in range(self.max_reference+1):
 */
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 752; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_out = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "skimage/graph/heap.pyx":754
 *         out = []
 *         cdef INDEX_T i
 *         for i in range(self.max_reference+1):             # <<<<<<<<<<<<<<
 *             out.append( self._crossref[i] )
 *         return out
 */
  __pyx_t_2 = (__pyx_v_self->max_reference + 1);
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;

    /* "skimage/graph/heap.pyx":755
 *         cdef INDEX_T i
 *         for i in range(self.max_reference+1):
 *             out.append( self._crossref[i] )             # <<<<<<<<<<<<<<
 *         return out
 */
    __pyx_t_1 = PyInt_FromSsize_t((__pyx_v_self->_crossref[__pyx_v_i])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 755; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = __Pyx_PyList_Append(__pyx_v_out, __pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 755; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "skimage/graph/heap.pyx":756
 *         for i in range(self.max_reference+1):
 *             out.append( self._crossref[i] )
 *         return out             # <<<<<<<<<<<<<<
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_out);
  __pyx_r = __pyx_v_out;
  goto __pyx_L0;

  /* "skimage/graph/heap.pyx":750
 *         return value
 * 
 *     def cross_references(self):             # <<<<<<<<<<<<<<
 *         """Get the cross references in the heap as a list."""
 *         out = []
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.cross_references", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_out);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "skimage/graph/heap.pxd":31
 * 
 * cdef class FastUpdateBinaryHeap(BinaryHeap):
 *     cdef readonly REFERENCE_T max_reference             # <<<<<<<<<<<<<<
 *     cdef INDEX_T *_crossref
 *     cdef BOOL_T _invalid_ref
 */

/* Python wrapper */
static PyObject *__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_13max_reference_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_13max_reference_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_13max_reference___get__(((struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *)__pyx_v_self));

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

static PyObject *__pyx_pf_7skimage_5graph_4heap_20FastUpdateBinaryHeap_13max_reference___get__(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->max_reference); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("skimage.graph.heap.FastUpdateBinaryHeap.max_reference.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap __pyx_vtable_7skimage_5graph_4heap_BinaryHeap;

static PyObject *__pyx_tp_new_7skimage_5graph_4heap_BinaryHeap(PyTypeObject *t, PyObject *a, PyObject *k) {
  struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *p;
  PyObject *o;
  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
    o = (*t->tp_alloc)(t, 0);
  } else {
    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
  }
  if (unlikely(!o)) return 0;
  p = ((struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *)o);
  p->__pyx_vtab = __pyx_vtabptr_7skimage_5graph_4heap_BinaryHeap;
  if (unlikely(__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_1__cinit__(o, a, k) < 0)) {
    Py_DECREF(o); o = 0;
  }
  return o;
}

static void __pyx_tp_dealloc_7skimage_5graph_4heap_BinaryHeap(PyObject *o) {
  #if PY_VERSION_HEX >= 0x030400a1
  if (unlikely(Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) {
    if (PyObject_CallFinalizerFromDealloc(o)) return;
  }
  #endif
  {
    PyObject *etype, *eval, *etb;
    PyErr_Fetch(&etype, &eval, &etb);
    ++Py_REFCNT(o);
    __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_7__dealloc__(o);
    --Py_REFCNT(o);
    PyErr_Restore(etype, eval, etb);
  }
  (*Py_TYPE(o)->tp_free)(o);
}

static PyObject *__pyx_getprop_7skimage_5graph_4heap_10BinaryHeap_count(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_5count_1__get__(o);
}

static PyObject *__pyx_getprop_7skimage_5graph_4heap_10BinaryHeap_levels(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_6levels_1__get__(o);
}

static PyObject *__pyx_getprop_7skimage_5graph_4heap_10BinaryHeap_min_levels(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_10min_levels_1__get__(o);
}

static PyMethodDef __pyx_methods_7skimage_5graph_4heap_BinaryHeap[] = {
  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_5reset, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_7skimage_5graph_4heap_10BinaryHeap_4reset)},
  {__Pyx_NAMESTR("push"), (PyCFunction)__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_11push, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7skimage_5graph_4heap_10BinaryHeap_10push)},
  {__Pyx_NAMESTR("min_val"), (PyCFunction)__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_13min_val, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_7skimage_5graph_4heap_10BinaryHeap_12min_val)},
  {__Pyx_NAMESTR("values"), (PyCFunction)__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_15values, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_7skimage_5graph_4heap_10BinaryHeap_14values)},
  {__Pyx_NAMESTR("references"), (PyCFunction)__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_17references, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_7skimage_5graph_4heap_10BinaryHeap_16references)},
  {__Pyx_NAMESTR("pop"), (PyCFunction)__pyx_pw_7skimage_5graph_4heap_10BinaryHeap_19pop, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_7skimage_5graph_4heap_10BinaryHeap_18pop)},
  {0, 0, 0, 0}
};

static struct PyGetSetDef __pyx_getsets_7skimage_5graph_4heap_BinaryHeap[] = {
  {(char *)"count", __pyx_getprop_7skimage_5graph_4heap_10BinaryHeap_count, 0, 0, 0},
  {(char *)"levels", __pyx_getprop_7skimage_5graph_4heap_10BinaryHeap_levels, 0, 0, 0},
  {(char *)"min_levels", __pyx_getprop_7skimage_5graph_4heap_10BinaryHeap_min_levels, 0, 0, 0},
  {0, 0, 0, 0, 0}
};

static PyTypeObject __pyx_type_7skimage_5graph_4heap_BinaryHeap = {
  PyVarObject_HEAD_INIT(0, 0)
  __Pyx_NAMESTR("skimage.graph.heap.BinaryHeap"), /*tp_name*/
  sizeof(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_7skimage_5graph_4heap_BinaryHeap, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #else
  0, /*reserved*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_9__str__, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
  __Pyx_DOCSTR("BinaryHeap(initial_capacity=128)\n\n    A binary heap class that can store values and an integer reference.\n\n    A binary heap is an object to store values in, optimized in such a way\n    that the minimum (or maximum, but a minimum in this implementation)\n    value can be found in O(log2(N)) time. In this implementation, a reference\n    value (a single integer) can also be stored with each value.\n\n    Use the methods push() and pop() to put in or extract values.\n    In C, use the corresponding push_fast() and pop_fast().\n\n    Parameters\n    ----------\n    initial_capacity : int\n        Estimate of the size of the heap, if known in advance. (In any case,\n        the heap will dynamically grow and shrink as required, though never\n        below the `initial_capacity`.)\n\n    Attributes\n    ----------\n    count : int\n        The number of values in the heap\n    levels : int\n        The number of levels in the binary heap (see Notes below). The values\n        are stored in the last level, so 2**levels is the capacity of the\n        heap before another resize is required.\n    min_levels : int\n        The minimum number of levels in the heap (relates to the\n        `initial_capacity` parameter.)\n\n    Notes\n    -----\n    This implementation stores the binary heap in an array twice as long as\n    the number of elements in the heap. The array is structured in levels,\n    starting at level 0 with a single value, doubling the amount of values in\n    each level. The final level contains the actual values, the level before\n    it contains the pairwise minimum values. The level before that contains\n    the pairwise minimum values of that level, etc. Take a look at this\n    illustration:\n\n    level: 0 11 2222 33333333 4444444444444444\n    index: 0 12 3456 78901234 5678901234567890\n                        1          2         3\n\n     The actual values are stored in level 4. The minimum value of position 15\n    and 16 is stored in position 7. min(17,18)->8, min(7,8)->3, min(3,4)->1.\n    When adding a value, only the path to the top has to be updated, which\n    takesO(log2(N)) time.\n\n     The advantage of this implementation relative to more common\n    implementations that swap values when pushing to the array is that data\n    only needs to be swapped once when an element is removed. This means that\n    keeping an array of references along with the values is very inexpensive.\n    Th disadvantage is that if you pop the minimum value, the tree has to be\n    traced from top to bottom and back. So if you only want values and no\n    references, this implementation will probably be slower. If you need\n    references (and maybe cross references to be kept up to date) this\n    implementation will be faster.\n    "), /*tp_doc*/
  0, /*tp_traverse*/
  0, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_7skimage_5graph_4heap_BinaryHeap, /*tp_methods*/
  0, /*tp_members*/
  __pyx_getsets_7skimage_5graph_4heap_BinaryHeap, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_3__init__, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_7skimage_5graph_4heap_BinaryHeap, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  #if PY_VERSION_HEX >= 0x02060000
  0, /*tp_version_tag*/
  #endif
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};
static struct __pyx_vtabstruct_7skimage_5graph_4heap_FastUpdateBinaryHeap __pyx_vtable_7skimage_5graph_4heap_FastUpdateBinaryHeap;

static PyObject *__pyx_tp_new_7skimage_5graph_4heap_FastUpdateBinaryHeap(PyTypeObject *t, PyObject *a, PyObject *k) {
  struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *p;
  PyObject *o = __pyx_tp_new_7skimage_5graph_4heap_BinaryHeap(t, a, k);
  if (unlikely(!o)) return 0;
  p = ((struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *)o);
  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7skimage_5graph_4heap_BinaryHeap*)__pyx_vtabptr_7skimage_5graph_4heap_FastUpdateBinaryHeap;
  if (unlikely(__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_1__cinit__(o, a, k) < 0)) {
    Py_DECREF(o); o = 0;
  }
  return o;
}

static void __pyx_tp_dealloc_7skimage_5graph_4heap_FastUpdateBinaryHeap(PyObject *o) {
  #if PY_VERSION_HEX >= 0x030400a1
  if (unlikely(Py_TYPE(o)->tp_finalize) && (!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))) {
    if (PyObject_CallFinalizerFromDealloc(o)) return;
  }
  #endif
  {
    PyObject *etype, *eval, *etb;
    PyErr_Fetch(&etype, &eval, &etb);
    ++Py_REFCNT(o);
    __pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_5__dealloc__(o);
    --Py_REFCNT(o);
    PyErr_Restore(etype, eval, etb);
  }
  __pyx_tp_dealloc_7skimage_5graph_4heap_BinaryHeap(o);
}

static PyObject *__pyx_getprop_7skimage_5graph_4heap_20FastUpdateBinaryHeap_max_reference(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_13max_reference_1__get__(o);
}

static PyMethodDef __pyx_methods_7skimage_5graph_4heap_FastUpdateBinaryHeap[] = {
  {__Pyx_NAMESTR("reset"), (PyCFunction)__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_7reset, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_7skimage_5graph_4heap_20FastUpdateBinaryHeap_6reset)},
  {__Pyx_NAMESTR("push"), (PyCFunction)__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_9push, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7skimage_5graph_4heap_20FastUpdateBinaryHeap_8push)},
  {__Pyx_NAMESTR("push_if_lower"), (PyCFunction)__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_11push_if_lower, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7skimage_5graph_4heap_20FastUpdateBinaryHeap_10push_if_lower)},
  {__Pyx_NAMESTR("value_of"), (PyCFunction)__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_13value_of, METH_O, __Pyx_DOCSTR(__pyx_doc_7skimage_5graph_4heap_20FastUpdateBinaryHeap_12value_of)},
  {__Pyx_NAMESTR("cross_references"), (PyCFunction)__pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_15cross_references, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_7skimage_5graph_4heap_20FastUpdateBinaryHeap_14cross_references)},
  {0, 0, 0, 0}
};

static struct PyGetSetDef __pyx_getsets_7skimage_5graph_4heap_FastUpdateBinaryHeap[] = {
  {(char *)"max_reference", __pyx_getprop_7skimage_5graph_4heap_20FastUpdateBinaryHeap_max_reference, 0, 0, 0},
  {0, 0, 0, 0, 0}
};

static PyTypeObject __pyx_type_7skimage_5graph_4heap_FastUpdateBinaryHeap = {
  PyVarObject_HEAD_INIT(0, 0)
  __Pyx_NAMESTR("skimage.graph.heap.FastUpdateBinaryHeap"), /*tp_name*/
  sizeof(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_7skimage_5graph_4heap_FastUpdateBinaryHeap, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #else
  0, /*reserved*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  #if CYTHON_COMPILING_IN_PYPY
  __pyx_pw_7skimage_5graph_4heap_10BinaryHeap_9__str__, /*tp_str*/
  #else
  0, /*tp_str*/
  #endif
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/
  __Pyx_DOCSTR("FastUpdateBinaryHeap(initial_capacity=128, max_reference=None)\n\n    Binary heap that allows the value of a reference to be updated quickly.\n\n    This heap class keeps cross-references so that the value associated with a\n    given reference can be quickly queried (O(1) time) or updated (O(log2(N))\n    time). This is ideal for pathfinding algorithms that implement some\n    variant of Dijkstra's algorithm.\n\n    Parameters\n    ----------\n    initial_capacity : int\n        Estimate of the size of the heap, if known in advance. (In any case,\n        the heap will dynamically grow and shrink as required, though never\n        below the `initial_capacity`.)\n\n    max_reference : int, optional\n        Largest reference value that might be pushed to the heap. (Pushing a\n        larger value will result in an error.) If no value is provided,\n        `1-initial_capacity` will be used. For the cross-reference index to\n        work, all references must be in the range [0, max_reference];\n        references pushed outside of that range will not be added to the heap.\n        The cross-references are kept as a 1-d array of length\n        `max_reference+1', so memory use of this heap is effectively\n        O(max_reference)\n\n    Attributes\n    ----------\n    count : int\n        The number of values in the heap\n    levels : int\n        The number of levels in the binary heap (see Notes below). The values\n        are stored in the last level, so 2**levels is the capacity of the\n        heap before another resize is required.\n    min_levels : int\n        The minimum number of levels in the heap (relates to the\n        `initial_capacity` parameter.)\n    max_reference : int\n        The provided or calculated maximum allowed reference value.\n\n    Notes\n    -----\n    The cross-references map data[reference]->internalindex, such that the\n    value corresponding to a given reference can be found efficiently. This\n    can be queried with the value_of() method.\n\n    A special method, push_if_lower() is provided that will update the heap if\n    the given reference is not in the heap, or if it is and the provided value\n    is lower than the current value in the heap. This is again useful for\n    pathfinding algorithms.\n    "), /*tp_doc*/
  0, /*tp_traverse*/
  0, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_7skimage_5graph_4heap_FastUpdateBinaryHeap, /*tp_methods*/
  0, /*tp_members*/
  __pyx_getsets_7skimage_5graph_4heap_FastUpdateBinaryHeap, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  __pyx_pw_7skimage_5graph_4heap_20FastUpdateBinaryHeap_3__init__, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_7skimage_5graph_4heap_FastUpdateBinaryHeap, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  #if PY_VERSION_HEX >= 0x02060000
  0, /*tp_version_tag*/
  #endif
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static PyMethodDef __pyx_methods[] = {
  {0, 0, 0, 0}
};

#if PY_MAJOR_VERSION >= 3
static struct PyModuleDef __pyx_moduledef = {
  #if PY_VERSION_HEX < 0x03020000
    { PyObject_HEAD_INIT(NULL) NULL, 0, NULL },
  #else
    PyModuleDef_HEAD_INIT,
  #endif
    __Pyx_NAMESTR("heap"),
    __Pyx_DOCSTR(__pyx_k_Cython_implementation_of_a_binar), /* m_doc */
    -1, /* m_size */
    __pyx_methods /* m_methods */,
    NULL, /* m_reload */
    NULL, /* m_traverse */
    NULL, /* m_clear */
    NULL /* m_free */
};
#endif

static __Pyx_StringTabEntry __pyx_string_tab[] = {
  {&__pyx_kp_s_, __pyx_k_, sizeof(__pyx_k_), 0, 0, 1, 0},
  {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1},
  {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1},
  {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1},
  {&__pyx_kp_s__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 0, 1, 0},
  {&__pyx_kp_s_g, __pyx_k_g, sizeof(__pyx_k_g), 0, 0, 1, 0},
  {&__pyx_n_s_init, __pyx_k_init, sizeof(__pyx_k_init), 0, 0, 1, 1},
  {&__pyx_n_s_initial_capacity, __pyx_k_initial_capacity, sizeof(__pyx_k_initial_capacity), 0, 0, 1, 1},
  {&__pyx_n_s_invalid_ref, __pyx_k_invalid_ref, sizeof(__pyx_k_invalid_ref), 0, 0, 1, 1},
  {&__pyx_kp_s_invalid_reference, __pyx_k_invalid_reference, sizeof(__pyx_k_invalid_reference), 0, 0, 1, 0},
  {&__pyx_kp_s_level_i, __pyx_k_level_i, sizeof(__pyx_k_level_i), 0, 0, 1, 0},
  {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1},
  {&__pyx_n_s_max_reference, __pyx_k_max_reference, sizeof(__pyx_k_max_reference), 0, 0, 1, 1},
  {&__pyx_kp_s_pop_from_an_empty_heap, __pyx_k_pop_from_an_empty_heap, sizeof(__pyx_k_pop_from_an_empty_heap), 0, 0, 1, 0},
  {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1},
  {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1},
  {&__pyx_n_s_reference, __pyx_k_reference, sizeof(__pyx_k_reference), 0, 0, 1, 1},
  {&__pyx_kp_s_reference_outside_of_range_0_max, __pyx_k_reference_outside_of_range_0_max, sizeof(__pyx_k_reference_outside_of_range_0_max), 0, 0, 1, 0},
  {&__pyx_n_s_reset, __pyx_k_reset, sizeof(__pyx_k_reset), 0, 0, 1, 1},
  {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
  {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0}
};
static int __Pyx_InitCachedBuiltins(void) {
  __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 692; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  return 0;
  __pyx_L1_error:;
  return -1;
}

static int __Pyx_InitCachedConstants(void) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);

  /* "skimage/graph/heap.pyx":182
 *             for i in range(i0,i0+2**level):
 *                 s += '%g, ' % self._values[i]
 *             s = s[:-1] + '\n'             # <<<<<<<<<<<<<<
 *         return s
 * 
 */
  __pyx_slice__2 = PySlice_New(Py_None, __pyx_int_neg_1, Py_None); if (unlikely(!__pyx_slice__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_slice__2);
  __Pyx_GIVEREF(__pyx_slice__2);

  /* "skimage/graph/heap.pyx":455
 *         """
 *         if self.count == 0:
 *           raise IndexError('pop from an empty heap')             # <<<<<<<<<<<<<<
 *         value = self.pop_fast()
 *         ref = self._popped_ref
 */
  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_pop_from_an_empty_heap); if (unlikely(!__pyx_tuple__4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__4);
  __Pyx_GIVEREF(__pyx_tuple__4);

  /* "skimage/graph/heap.pyx":692
 *         """
 *         if self.push_fast(value, reference) == -1:
 *             raise ValueError("reference outside of range [0, max_reference]")             # <<<<<<<<<<<<<<
 * 
 *     def push_if_lower(self, double value, int reference):
 */
  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_reference_outside_of_range_0_max); if (unlikely(!__pyx_tuple__5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 692; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__5);
  __Pyx_GIVEREF(__pyx_tuple__5);

  /* "skimage/graph/heap.pyx":722
 *         """
 *         if self.push_if_lower_fast(value, reference) == -1:
 *           raise ValueError("reference outside of range [0, max_reference]")             # <<<<<<<<<<<<<<
 *         return self._pushed == 1
 * 
 */
  __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_reference_outside_of_range_0_max); if (unlikely(!__pyx_tuple__6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__6);
  __Pyx_GIVEREF(__pyx_tuple__6);

  /* "skimage/graph/heap.pyx":747
 *         value = self.value_of_fast(reference)
 *         if self._invalid_ref:
 *             raise ValueError('invalid reference')             # <<<<<<<<<<<<<<
 *         return value
 * 
 */
  __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_s_invalid_reference); if (unlikely(!__pyx_tuple__7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 747; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__7);
  __Pyx_GIVEREF(__pyx_tuple__7);
  __Pyx_RefNannyFinishContext();
  return 0;
  __pyx_L1_error:;
  __Pyx_RefNannyFinishContext();
  return -1;
}

static int __Pyx_InitGlobals(void) {
  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  return 0;
  __pyx_L1_error:;
  return -1;
}

#if PY_MAJOR_VERSION < 3
PyMODINIT_FUNC initheap(void); /*proto*/
PyMODINIT_FUNC initheap(void)
#else
PyMODINIT_FUNC PyInit_heap(void); /*proto*/
PyMODINIT_FUNC PyInit_heap(void)
#endif
{
  PyObject *__pyx_t_1 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannyDeclarations
  #if CYTHON_REFNANNY
  __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
  if (!__Pyx_RefNanny) {
      PyErr_Clear();
      __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
      if (!__Pyx_RefNanny)
          Py_FatalError("failed to import 'refnanny' module");
  }
  #endif
  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_heap(void)", 0);
  if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #ifdef __Pyx_CyFunction_USED
  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  #ifdef __Pyx_FusedFunction_USED
  if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  #ifdef __Pyx_Generator_USED
  if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  /*--- Library function declarations ---*/
  /*--- Threads initialization code ---*/
  #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
  #ifdef WITH_THREAD /* Python build with threading support? */
  PyEval_InitThreads();
  #endif
  #endif
  /*--- Module creation code ---*/
  #if PY_MAJOR_VERSION < 3
  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("heap"), __pyx_methods, __Pyx_DOCSTR(__pyx_k_Cython_implementation_of_a_binar), 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
  #else
  __pyx_m = PyModule_Create(&__pyx_moduledef);
  #endif
  if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_INCREF(__pyx_d);
  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #if CYTHON_COMPILING_IN_PYPY
  Py_INCREF(__pyx_b);
  #endif
  if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  /*--- Initialize various global constants etc. ---*/
  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
  if (__Pyx_init_sys_getdefaultencoding_params() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  if (__pyx_module_is_main_skimage__graph__heap) {
    if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  }
  #if PY_MAJOR_VERSION >= 3
  {
    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (!PyDict_GetItemString(modules, "skimage.graph.heap")) {
      if (unlikely(PyDict_SetItemString(modules, "skimage.graph.heap", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
  }
  #endif
  /*--- Builtin init code ---*/
  if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  /*--- Constants init code ---*/
  if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  /*--- Global init code ---*/
  /*--- Variable export code ---*/
  /*--- Function export code ---*/
  /*--- Type init code ---*/
  __pyx_vtabptr_7skimage_5graph_4heap_BinaryHeap = &__pyx_vtable_7skimage_5graph_4heap_BinaryHeap;
  __pyx_vtable_7skimage_5graph_4heap_BinaryHeap._add_or_remove_level = (void (*)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *, __pyx_t_7skimage_5graph_4heap_LEVELS_T))__pyx_f_7skimage_5graph_4heap_10BinaryHeap__add_or_remove_level;
  __pyx_vtable_7skimage_5graph_4heap_BinaryHeap._update = (void (*)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *))__pyx_f_7skimage_5graph_4heap_10BinaryHeap__update;
  __pyx_vtable_7skimage_5graph_4heap_BinaryHeap._update_one = (void (*)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *, __pyx_t_7skimage_5graph_4heap_INDEX_T))__pyx_f_7skimage_5graph_4heap_10BinaryHeap__update_one;
  __pyx_vtable_7skimage_5graph_4heap_BinaryHeap._remove = (void (*)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *, __pyx_t_7skimage_5graph_4heap_INDEX_T))__pyx_f_7skimage_5graph_4heap_10BinaryHeap__remove;
  __pyx_vtable_7skimage_5graph_4heap_BinaryHeap.push_fast = (__pyx_t_7skimage_5graph_4heap_INDEX_T (*)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *, __pyx_t_7skimage_5graph_4heap_VALUE_T, __pyx_t_7skimage_5graph_4heap_REFERENCE_T))__pyx_f_7skimage_5graph_4heap_10BinaryHeap_push_fast;
  __pyx_vtable_7skimage_5graph_4heap_BinaryHeap.pop_fast = (__pyx_t_7skimage_5graph_4heap_VALUE_T (*)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *))__pyx_f_7skimage_5graph_4heap_10BinaryHeap_pop_fast;
  if (PyType_Ready(&__pyx_type_7skimage_5graph_4heap_BinaryHeap) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_type_7skimage_5graph_4heap_BinaryHeap.tp_print = 0;
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = __Pyx_GetAttrString((PyObject *)&__pyx_type_7skimage_5graph_4heap_BinaryHeap, "__init__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_7skimage_5graph_4heap_10BinaryHeap_2__init__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_7skimage_5graph_4heap_10BinaryHeap_2__init__.doc = __pyx_doc_7skimage_5graph_4heap_10BinaryHeap_2__init__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_7skimage_5graph_4heap_10BinaryHeap_2__init__;
    }
  }
  #endif
  if (__Pyx_SetVtable(__pyx_type_7skimage_5graph_4heap_BinaryHeap.tp_dict, __pyx_vtabptr_7skimage_5graph_4heap_BinaryHeap) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__Pyx_SetAttrString(__pyx_m, "BinaryHeap", (PyObject *)&__pyx_type_7skimage_5graph_4heap_BinaryHeap) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_ptype_7skimage_5graph_4heap_BinaryHeap = &__pyx_type_7skimage_5graph_4heap_BinaryHeap;
  __pyx_vtabptr_7skimage_5graph_4heap_FastUpdateBinaryHeap = &__pyx_vtable_7skimage_5graph_4heap_FastUpdateBinaryHeap;
  __pyx_vtable_7skimage_5graph_4heap_FastUpdateBinaryHeap.__pyx_base = *__pyx_vtabptr_7skimage_5graph_4heap_BinaryHeap;
  __pyx_vtable_7skimage_5graph_4heap_FastUpdateBinaryHeap.__pyx_base._remove = (void (*)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *, __pyx_t_7skimage_5graph_4heap_INDEX_T))__pyx_f_7skimage_5graph_4heap_20FastUpdateBinaryHeap__remove;
  __pyx_vtable_7skimage_5graph_4heap_FastUpdateBinaryHeap.__pyx_base.push_fast = (__pyx_t_7skimage_5graph_4heap_INDEX_T (*)(struct __pyx_obj_7skimage_5graph_4heap_BinaryHeap *, __pyx_t_7skimage_5graph_4heap_VALUE_T, __pyx_t_7skimage_5graph_4heap_REFERENCE_T))__pyx_f_7skimage_5graph_4heap_20FastUpdateBinaryHeap_push_fast;
  __pyx_vtable_7skimage_5graph_4heap_FastUpdateBinaryHeap.value_of_fast = (__pyx_t_7skimage_5graph_4heap_VALUE_T (*)(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *, __pyx_t_7skimage_5graph_4heap_REFERENCE_T))__pyx_f_7skimage_5graph_4heap_20FastUpdateBinaryHeap_value_of_fast;
  __pyx_vtable_7skimage_5graph_4heap_FastUpdateBinaryHeap.push_if_lower_fast = (__pyx_t_7skimage_5graph_4heap_INDEX_T (*)(struct __pyx_obj_7skimage_5graph_4heap_FastUpdateBinaryHeap *, __pyx_t_7skimage_5graph_4heap_VALUE_T, __pyx_t_7skimage_5graph_4heap_REFERENCE_T))__pyx_f_7skimage_5graph_4heap_20FastUpdateBinaryHeap_push_if_lower_fast;
  __pyx_type_7skimage_5graph_4heap_FastUpdateBinaryHeap.tp_base = __pyx_ptype_7skimage_5graph_4heap_BinaryHeap;
  if (PyType_Ready(&__pyx_type_7skimage_5graph_4heap_FastUpdateBinaryHeap) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_type_7skimage_5graph_4heap_FastUpdateBinaryHeap.tp_print = 0;
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = __Pyx_GetAttrString((PyObject *)&__pyx_type_7skimage_5graph_4heap_FastUpdateBinaryHeap, "__init__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_7skimage_5graph_4heap_20FastUpdateBinaryHeap_2__init__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_7skimage_5graph_4heap_20FastUpdateBinaryHeap_2__init__.doc = __pyx_doc_7skimage_5graph_4heap_20FastUpdateBinaryHeap_2__init__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_7skimage_5graph_4heap_20FastUpdateBinaryHeap_2__init__;
    }
  }
  #endif
  if (__Pyx_SetVtable(__pyx_type_7skimage_5graph_4heap_FastUpdateBinaryHeap.tp_dict, __pyx_vtabptr_7skimage_5graph_4heap_FastUpdateBinaryHeap) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__Pyx_SetAttrString(__pyx_m, "FastUpdateBinaryHeap", (PyObject *)&__pyx_type_7skimage_5graph_4heap_FastUpdateBinaryHeap) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_ptype_7skimage_5graph_4heap_FastUpdateBinaryHeap = &__pyx_type_7skimage_5graph_4heap_FastUpdateBinaryHeap;
  /*--- Type import code ---*/
  /*--- Variable import code ---*/
  /*--- Function import code ---*/
  /*--- Execution code ---*/

  /* "skimage/graph/heap.pyx":43
 *   double Py_HUGE_VAL
 * 
 * cdef VALUE_T inf = Py_HUGE_VAL             # <<<<<<<<<<<<<<
 * 
 * # this is handy
 */
  __pyx_v_7skimage_5graph_4heap_inf = Py_HUGE_VAL;

  /* "skimage/graph/heap.pyx":1
 * # -*- python -*-             # <<<<<<<<<<<<<<
 * 
 * """Cython implementation of a binary min heap.
 */
  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  if (__pyx_m) {
    __Pyx_AddTraceback("init skimage.graph.heap", __pyx_clineno, __pyx_lineno, __pyx_filename);
    Py_DECREF(__pyx_m); __pyx_m = 0;
  } else if (!PyErr_Occurred()) {
    PyErr_SetString(PyExc_ImportError, "init skimage.graph.heap");
  }
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  #if PY_MAJOR_VERSION < 3
  return;
  #else
  return __pyx_m;
  #endif
}

/* Runtime support code */
#if CYTHON_REFNANNY
static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
    PyObject *m = NULL, *p = NULL;
    void *r = NULL;
    m = PyImport_ImportModule((char *)modname);
    if (!m) goto end;
    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
    if (!p) goto end;
    r = PyLong_AsVoidPtr(p);
end:
    Py_XDECREF(p);
    Py_XDECREF(m);
    return (__Pyx_RefNannyAPIStruct *)r;
}
#endif /* CYTHON_REFNANNY */

static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
    PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
    if (unlikely(!result)) {
        PyErr_Format(PyExc_NameError,
#if PY_MAJOR_VERSION >= 3
            "name '%U' is not defined", name);
#else
            "name '%.200s' is not defined", PyString_AS_STRING(name));
#endif
    }
    return result;
}

static void __Pyx_RaiseDoubleKeywordsError(
    const char* func_name,
    PyObject* kw_name)
{
    PyErr_Format(PyExc_TypeError,
        #if PY_MAJOR_VERSION >= 3
        "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
        #else
        "%s() got multiple values for keyword argument '%s'", func_name,
        PyString_AsString(kw_name));
        #endif
}

static int __Pyx_ParseOptionalKeywords(
    PyObject *kwds,
    PyObject **argnames[],
    PyObject *kwds2,
    PyObject *values[],
    Py_ssize_t num_pos_args,
    const char* function_name)
{
    PyObject *key = 0, *value = 0;
    Py_ssize_t pos = 0;
    PyObject*** name;
    PyObject*** first_kw_arg = argnames + num_pos_args;
    while (PyDict_Next(kwds, &pos, &key, &value)) {
        name = first_kw_arg;
        while (*name && (**name != key)) name++;
        if (*name) {
            values[name-argnames] = value;
            continue;
        }
        name = first_kw_arg;
        #if PY_MAJOR_VERSION < 3
        if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {
            while (*name) {
                if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
                        && _PyString_Eq(**name, key)) {
                    values[name-argnames] = value;
                    break;
                }
                name++;
            }
            if (*name) continue;
            else {
                PyObject*** argname = argnames;
                while (argname != first_kw_arg) {
                    if ((**argname == key) || (
                            (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
                             && _PyString_Eq(**argname, key))) {
                        goto arg_passed_twice;
                    }
                    argname++;
                }
            }
        } else
        #endif
        if (likely(PyUnicode_Check(key))) {
            while (*name) {
                int cmp = (**name == key) ? 0 :
                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
                    (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
                #endif
                    PyUnicode_Compare(**name, key);
                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
                if (cmp == 0) {
                    values[name-argnames] = value;
                    break;
                }
                name++;
            }
            if (*name) continue;
            else {
                PyObject*** argname = argnames;
                while (argname != first_kw_arg) {
                    int cmp = (**argname == key) ? 0 :
                    #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
                        (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
                    #endif
                        PyUnicode_Compare(**argname, key);
                    if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
                    if (cmp == 0) goto arg_passed_twice;
                    argname++;
                }
            }
        } else
            goto invalid_keyword_type;
        if (kwds2) {
            if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
        } else {
            goto invalid_keyword;
        }
    }
    return 0;
arg_passed_twice:
    __Pyx_RaiseDoubleKeywordsError(function_name, key);
    goto bad;
invalid_keyword_type:
    PyErr_Format(PyExc_TypeError,
        "%.200s() keywords must be strings", function_name);
    goto bad;
invalid_keyword:
    PyErr_Format(PyExc_TypeError,
    #if PY_MAJOR_VERSION < 3
        "%.200s() got an unexpected keyword argument '%.200s'",
        function_name, PyString_AsString(key));
    #else
        "%s() got an unexpected keyword argument '%U'",
        function_name, key);
    #endif
bad:
    return -1;
}

static void __Pyx_RaiseArgtupleInvalid(
    const char* func_name,
    int exact,
    Py_ssize_t num_min,
    Py_ssize_t num_max,
    Py_ssize_t num_found)
{
    Py_ssize_t num_expected;
    const char *more_or_less;
    if (num_found < num_min) {
        num_expected = num_min;
        more_or_less = "at least";
    } else {
        num_expected = num_max;
        more_or_less = "at most";
    }
    if (exact) {
        more_or_less = "exactly";
    }
    PyErr_Format(PyExc_TypeError,
                 "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
                 func_name, more_or_less, num_expected,
                 (num_expected == 1) ? "" : "s", num_found);
}

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
    PyObject *result;
    ternaryfunc call = func->ob_type->tp_call;
    if (unlikely(!call))
        return PyObject_Call(func, arg, kw);
#if PY_VERSION_HEX >= 0x02060000
    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
        return NULL;
#endif
    result = (*call)(func, arg, kw);
#if PY_VERSION_HEX >= 0x02060000
    Py_LeaveRecursiveCall();
#endif
    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
        PyErr_SetString(
            PyExc_SystemError,
            "NULL result without error in PyObject_Call");
    }
    return result;
}
#endif

static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(
        PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop,
        PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice,
        int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyMappingMethods* mp;
#if PY_MAJOR_VERSION < 3
    PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence;
    if (likely(ms && ms->sq_slice)) {
        if (!has_cstart) {
            if (_py_start && (*_py_start != Py_None)) {
                cstart = __Pyx_PyIndex_AsSsize_t(*_py_start);
                if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
            } else
                cstart = 0;
        }
        if (!has_cstop) {
            if (_py_stop && (*_py_stop != Py_None)) {
                cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop);
                if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
            } else
                cstop = PY_SSIZE_T_MAX;
        }
        if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) {
            Py_ssize_t l = ms->sq_length(obj);
            if (likely(l >= 0)) {
                if (cstop < 0) {
                    cstop += l;
                    if (cstop < 0) cstop = 0;
                }
                if (cstart < 0) {
                    cstart += l;
                    if (cstart < 0) cstart = 0;
                }
            } else {
                if (PyErr_ExceptionMatches(PyExc_OverflowError))
                    PyErr_Clear();
                else
                    goto bad;
            }
        }
        return ms->sq_slice(obj, cstart, cstop);
    }
#endif
    mp = Py_TYPE(obj)->tp_as_mapping;
    if (likely(mp && mp->mp_subscript))
#endif
    {
        PyObject* result;
        PyObject *py_slice, *py_start, *py_stop;
        if (_py_slice) {
            py_slice = *_py_slice;
        } else {
            PyObject* owned_start = NULL;
            PyObject* owned_stop = NULL;
            if (_py_start) {
                py_start = *_py_start;
            } else {
                if (has_cstart) {
                    owned_start = py_start = PyInt_FromSsize_t(cstart);
                    if (unlikely(!py_start)) goto bad;
                } else
                    py_start = Py_None;
            }
            if (_py_stop) {
                py_stop = *_py_stop;
            } else {
                if (has_cstop) {
                    owned_stop = py_stop = PyInt_FromSsize_t(cstop);
                    if (unlikely(!py_stop)) {
                        Py_XDECREF(owned_start);
                        goto bad;
                    }
                } else
                    py_stop = Py_None;
            }
            py_slice = PySlice_New(py_start, py_stop, Py_None);
            Py_XDECREF(owned_start);
            Py_XDECREF(owned_stop);
            if (unlikely(!py_slice)) goto bad;
        }
#if CYTHON_COMPILING_IN_CPYTHON
        result = mp->mp_subscript(obj, py_slice);
#else
        result = PyObject_GetItem(obj, py_slice);
#endif
        if (!_py_slice) {
            Py_DECREF(py_slice);
        }
        return result;
    }
    PyErr_Format(PyExc_TypeError,
        "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name);
bad:
    return NULL;
}

static CYTHON_INLINE __pyx_t_7skimage_5graph_4heap_INDEX_T __Pyx_div___pyx_t_7skimage_5graph_4heap_INDEX_T(__pyx_t_7skimage_5graph_4heap_INDEX_T a, __pyx_t_7skimage_5graph_4heap_INDEX_T b) {
    __pyx_t_7skimage_5graph_4heap_INDEX_T q = a / b;
    __pyx_t_7skimage_5graph_4heap_INDEX_T r = a - q*b;
    q -= ((r != 0) & ((r ^ b) < 0));
    return q;
}

static CYTHON_INLINE __pyx_t_7skimage_5graph_4heap_INDEX_T __Pyx_mod___pyx_t_7skimage_5graph_4heap_INDEX_T(__pyx_t_7skimage_5graph_4heap_INDEX_T a, __pyx_t_7skimage_5graph_4heap_INDEX_T b) {
    __pyx_t_7skimage_5graph_4heap_INDEX_T r = a % b;
    r += ((r != 0) & ((r ^ b) < 0)) * b;
    return r;
}

static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    PyThreadState *tstate = PyThreadState_GET();
    tmp_type = tstate->curexc_type;
    tmp_value = tstate->curexc_value;
    tmp_tb = tstate->curexc_traceback;
    tstate->curexc_type = type;
    tstate->curexc_value = value;
    tstate->curexc_traceback = tb;
    Py_XDECREF(tmp_type);
    Py_XDECREF(tmp_value);
    Py_XDECREF(tmp_tb);
#else
    PyErr_Restore(type, value, tb);
#endif
}
static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyThreadState *tstate = PyThreadState_GET();
    *type = tstate->curexc_type;
    *value = tstate->curexc_value;
    *tb = tstate->curexc_traceback;
    tstate->curexc_type = 0;
    tstate->curexc_value = 0;
    tstate->curexc_traceback = 0;
#else
    PyErr_Fetch(type, value, tb);
#endif
}

#if PY_MAJOR_VERSION < 3
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
                        CYTHON_UNUSED PyObject *cause) {
    Py_XINCREF(type);
    if (!value || value == Py_None)
        value = NULL;
    else
        Py_INCREF(value);
    if (!tb || tb == Py_None)
        tb = NULL;
    else {
        Py_INCREF(tb);
        if (!PyTraceBack_Check(tb)) {
            PyErr_SetString(PyExc_TypeError,
                "raise: arg 3 must be a traceback or None");
            goto raise_error;
        }
    }
    #if PY_VERSION_HEX < 0x02050000
    if (PyClass_Check(type)) {
    #else
    if (PyType_Check(type)) {
    #endif
#if CYTHON_COMPILING_IN_PYPY
        if (!value) {
            Py_INCREF(Py_None);
            value = Py_None;
        }
#endif
        PyErr_NormalizeException(&type, &value, &tb);
    } else {
        if (value) {
            PyErr_SetString(PyExc_TypeError,
                "instance exception may not have a separate value");
            goto raise_error;
        }
        value = type;
        #if PY_VERSION_HEX < 0x02050000
        if (PyInstance_Check(type)) {
            type = (PyObject*) ((PyInstanceObject*)type)->in_class;
            Py_INCREF(type);
        } else {
            type = 0;
            PyErr_SetString(PyExc_TypeError,
                "raise: exception must be an old-style class or instance");
            goto raise_error;
        }
        #else
        type = (PyObject*) Py_TYPE(type);
        Py_INCREF(type);
        if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
            PyErr_SetString(PyExc_TypeError,
                "raise: exception class must be a subclass of BaseException");
            goto raise_error;
        }
        #endif
    }
    __Pyx_ErrRestore(type, value, tb);
    return;
raise_error:
    Py_XDECREF(value);
    Py_XDECREF(type);
    Py_XDECREF(tb);
    return;
}
#else /* Python 3+ */
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
    PyObject* owned_instance = NULL;
    if (tb == Py_None) {
        tb = 0;
    } else if (tb && !PyTraceBack_Check(tb)) {
        PyErr_SetString(PyExc_TypeError,
            "raise: arg 3 must be a traceback or None");
        goto bad;
    }
    if (value == Py_None)
        value = 0;
    if (PyExceptionInstance_Check(type)) {
        if (value) {
            PyErr_SetString(PyExc_TypeError,
                "instance exception may not have a separate value");
            goto bad;
        }
        value = type;
        type = (PyObject*) Py_TYPE(value);
    } else if (PyExceptionClass_Check(type)) {
        PyObject *instance_class = NULL;
        if (value && PyExceptionInstance_Check(value)) {
            instance_class = (PyObject*) Py_TYPE(value);
            if (instance_class != type) {
                if (PyObject_IsSubclass(instance_class, type)) {
                    type = instance_class;
                } else {
                    instance_class = NULL;
                }
            }
        }
        if (!instance_class) {
            PyObject *args;
            if (!value)
                args = PyTuple_New(0);
            else if (PyTuple_Check(value)) {
                Py_INCREF(value);
                args = value;
            } else
                args = PyTuple_Pack(1, value);
            if (!args)
                goto bad;
            owned_instance = PyObject_Call(type, args, NULL);
            Py_DECREF(args);
            if (!owned_instance)
                goto bad;
            value = owned_instance;
            if (!PyExceptionInstance_Check(value)) {
                PyErr_Format(PyExc_TypeError,
                             "calling %R should have returned an instance of "
                             "BaseException, not %R",
                             type, Py_TYPE(value));
                goto bad;
            }
        }
    } else {
        PyErr_SetString(PyExc_TypeError,
            "raise: exception class must be a subclass of BaseException");
        goto bad;
    }
#if PY_VERSION_HEX >= 0x03030000
    if (cause) {
#else
    if (cause && cause != Py_None) {
#endif
        PyObject *fixed_cause;
        if (cause == Py_None) {
            fixed_cause = NULL;
        } else if (PyExceptionClass_Check(cause)) {
            fixed_cause = PyObject_CallObject(cause, NULL);
            if (fixed_cause == NULL)
                goto bad;
        } else if (PyExceptionInstance_Check(cause)) {
            fixed_cause = cause;
            Py_INCREF(fixed_cause);
        } else {
            PyErr_SetString(PyExc_TypeError,
                            "exception causes must derive from "
                            "BaseException");
            goto bad;
        }
        PyException_SetCause(value, fixed_cause);
    }
    PyErr_SetObject(type, value);
    if (tb) {
        PyThreadState *tstate = PyThreadState_GET();
        PyObject* tmp_tb = tstate->curexc_traceback;
        if (tb != tmp_tb) {
            Py_INCREF(tb);
            tstate->curexc_traceback = tb;
            Py_XDECREF(tmp_tb);
        }
    }
bad:
    Py_XDECREF(owned_instance);
    return;
}
#endif

static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename,
                                  int full_traceback) {
    PyObject *old_exc, *old_val, *old_tb;
    PyObject *ctx;
    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
    if (full_traceback) {
        Py_XINCREF(old_exc);
        Py_XINCREF(old_val);
        Py_XINCREF(old_tb);
        __Pyx_ErrRestore(old_exc, old_val, old_tb);
        PyErr_PrintEx(1);
    }
    #if PY_MAJOR_VERSION < 3
    ctx = PyString_FromString(name);
    #else
    ctx = PyUnicode_FromString(name);
    #endif
    __Pyx_ErrRestore(old_exc, old_val, old_tb);
    if (!ctx) {
        PyErr_WriteUnraisable(Py_None);
    } else {
        PyErr_WriteUnraisable(ctx);
        Py_DECREF(ctx);
    }
}

static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)
    PyObject *ob = PyCapsule_New(vtable, 0, 0);
#else
    PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
#endif
    if (!ob)
        goto bad;
    if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0)
        goto bad;
    Py_DECREF(ob);
    return 0;
bad:
    Py_XDECREF(ob);
    return -1;
}

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_char(unsigned char value) {
    const unsigned char neg_one = (unsigned char) -1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (is_unsigned) {
        if (sizeof(unsigned char) < sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(unsigned char) <= sizeof(unsigned long)) {
            return PyLong_FromUnsignedLong((unsigned long) value);
        } else if (sizeof(unsigned char) <= sizeof(unsigned long long)) {
            return PyLong_FromUnsignedLongLong((unsigned long long) value);
        }
    } else {
        if (sizeof(unsigned char) <= sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(unsigned char) <= sizeof(long long)) {
            return PyLong_FromLongLong((long long) value);
        }
    }
    {
        int one = 1; int little = (int)*(unsigned char *)&one;
        unsigned char *bytes = (unsigned char *)&value;
        return _PyLong_FromByteArray(bytes, sizeof(unsigned char),
                                     little, !is_unsigned);
    }
}

#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func)             \
    {                                                                     \
        func_type value = func(x);                                        \
        if (sizeof(target_type) < sizeof(func_type)) {                    \
            if (unlikely(value != (func_type) (target_type) value)) {     \
                func_type zero = 0;                                       \
                PyErr_SetString(PyExc_OverflowError,                      \
                    (is_unsigned && unlikely(value < zero)) ?             \
                    "can't convert negative value to " #target_type :     \
                    "value too large to convert to " #target_type);       \
                return (target_type) -1;                                  \
            }                                                             \
        }                                                                 \
        return (target_type) value;                                       \
    }

#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
  #include "longintrepr.h"
 #endif
#endif
static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
    const int neg_one = (int) -1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(int) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG)
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                PyErr_SetString(PyExc_OverflowError,
                                "can't convert negative value to int");
                return (int) -1;
            }
            return (int) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
            if (sizeof(digit) <= sizeof(int)) {
                switch (Py_SIZE(x)) {
                    case  0: return 0;
                    case  1: return (int) ((PyLongObject*)x)->ob_digit[0];
                }
            }
 #endif
#endif
            if (unlikely(Py_SIZE(x) < 0)) {
                PyErr_SetString(PyExc_OverflowError,
                                "can't convert negative value to int");
                return (int) -1;
            }
            if (sizeof(int) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT(int, unsigned long, PyLong_AsUnsignedLong)
            } else if (sizeof(int) <= sizeof(unsigned long long)) {
                __PYX_VERIFY_RETURN_INT(int, unsigned long long, PyLong_AsUnsignedLongLong)
            }
        } else {
#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
            if (sizeof(digit) <= sizeof(int)) {
                switch (Py_SIZE(x)) {
                    case  0: return 0;
                    case  1: return +(int) ((PyLongObject*)x)->ob_digit[0];
                    case -1: return -(int) ((PyLongObject*)x)->ob_digit[0];
                }
            }
 #endif
#endif
            if (sizeof(int) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT(int, long, PyLong_AsLong)
            } else if (sizeof(int) <= sizeof(long long)) {
                __PYX_VERIFY_RETURN_INT(int, long long, PyLong_AsLongLong)
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            int val;
            PyObject *v = __Pyx_PyNumber_Int(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (int) -1;
        }
    } else {
        int val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (int) -1;
        val = __Pyx_PyInt_As_int(tmp);
        Py_DECREF(tmp);
        return val;
    }
}

static CYTHON_INLINE long __Pyx_pow_long(long b, long e) {
    long t = b;
    switch (e) {
        case 3:
            t *= b;
        case 2:
            t *= b;
        case 1:
            return t;
        case 0:
            return 1;
    }
    #if 1
    if (unlikely(e<0)) return 0;
    #endif
    t = 1;
    while (likely(e)) {
        t *= (b * (e&1)) | ((~e)&1);    /* 1 or b */
        b *= b;
        e >>= 1;
    }
    return t;
}

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) {
    const long neg_one = (long) -1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (is_unsigned) {
        if (sizeof(long) < sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(long) <= sizeof(unsigned long)) {
            return PyLong_FromUnsignedLong((unsigned long) value);
        } else if (sizeof(long) <= sizeof(unsigned long long)) {
            return PyLong_FromUnsignedLongLong((unsigned long long) value);
        }
    } else {
        if (sizeof(long) <= sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(long) <= sizeof(long long)) {
            return PyLong_FromLongLong((long long) value);
        }
    }
    {
        int one = 1; int little = (int)*(unsigned char *)&one;
        unsigned char *bytes = (unsigned char *)&value;
        return _PyLong_FromByteArray(bytes, sizeof(long),
                                     little, !is_unsigned);
    }
}

#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
  #include "longintrepr.h"
 #endif
#endif
static CYTHON_INLINE unsigned char __Pyx_PyInt_As_unsigned_char(PyObject *x) {
    const unsigned char neg_one = (unsigned char) -1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(unsigned char) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(unsigned char, long, PyInt_AS_LONG)
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                PyErr_SetString(PyExc_OverflowError,
                                "can't convert negative value to unsigned char");
                return (unsigned char) -1;
            }
            return (unsigned char) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
            if (sizeof(digit) <= sizeof(unsigned char)) {
                switch (Py_SIZE(x)) {
                    case  0: return 0;
                    case  1: return (unsigned char) ((PyLongObject*)x)->ob_digit[0];
                }
            }
 #endif
#endif
            if (unlikely(Py_SIZE(x) < 0)) {
                PyErr_SetString(PyExc_OverflowError,
                                "can't convert negative value to unsigned char");
                return (unsigned char) -1;
            }
            if (sizeof(unsigned char) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT(unsigned char, unsigned long, PyLong_AsUnsignedLong)
            } else if (sizeof(unsigned char) <= sizeof(unsigned long long)) {
                __PYX_VERIFY_RETURN_INT(unsigned char, unsigned long long, PyLong_AsUnsignedLongLong)
            }
        } else {
#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
            if (sizeof(digit) <= sizeof(unsigned char)) {
                switch (Py_SIZE(x)) {
                    case  0: return 0;
                    case  1: return +(unsigned char) ((PyLongObject*)x)->ob_digit[0];
                    case -1: return -(unsigned char) ((PyLongObject*)x)->ob_digit[0];
                }
            }
 #endif
#endif
            if (sizeof(unsigned char) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT(unsigned char, long, PyLong_AsLong)
            } else if (sizeof(unsigned char) <= sizeof(long long)) {
                __PYX_VERIFY_RETURN_INT(unsigned char, long long, PyLong_AsLongLong)
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            unsigned char val;
            PyObject *v = __Pyx_PyNumber_Int(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (unsigned char) -1;
        }
    } else {
        unsigned char val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (unsigned char) -1;
        val = __Pyx_PyInt_As_unsigned_char(tmp);
        Py_DECREF(tmp);
        return val;
    }
}

#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
  #include "longintrepr.h"
 #endif
#endif
static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) {
    const long neg_one = (long) -1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(long) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG)
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                PyErr_SetString(PyExc_OverflowError,
                                "can't convert negative value to long");
                return (long) -1;
            }
            return (long) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
            if (sizeof(digit) <= sizeof(long)) {
                switch (Py_SIZE(x)) {
                    case  0: return 0;
                    case  1: return (long) ((PyLongObject*)x)->ob_digit[0];
                }
            }
 #endif
#endif
            if (unlikely(Py_SIZE(x) < 0)) {
                PyErr_SetString(PyExc_OverflowError,
                                "can't convert negative value to long");
                return (long) -1;
            }
            if (sizeof(long) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT(long, unsigned long, PyLong_AsUnsignedLong)
            } else if (sizeof(long) <= sizeof(unsigned long long)) {
                __PYX_VERIFY_RETURN_INT(long, unsigned long long, PyLong_AsUnsignedLongLong)
            }
        } else {
#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
            if (sizeof(digit) <= sizeof(long)) {
                switch (Py_SIZE(x)) {
                    case  0: return 0;
                    case  1: return +(long) ((PyLongObject*)x)->ob_digit[0];
                    case -1: return -(long) ((PyLongObject*)x)->ob_digit[0];
                }
            }
 #endif
#endif
            if (sizeof(long) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT(long, long, PyLong_AsLong)
            } else if (sizeof(long) <= sizeof(long long)) {
                __PYX_VERIFY_RETURN_INT(long, long long, PyLong_AsLongLong)
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            long val;
            PyObject *v = __Pyx_PyNumber_Int(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (long) -1;
        }
    } else {
        long val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (long) -1;
        val = __Pyx_PyInt_As_long(tmp);
        Py_DECREF(tmp);
        return val;
    }
}

static int __Pyx_check_binary_version(void) {
    char ctversion[4], rtversion[4];
    PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
    PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion());
    if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) {
        char message[200];
        PyOS_snprintf(message, sizeof(message),
                      "compiletime version %s of module '%.100s' "
                      "does not match runtime version %s",
                      ctversion, __Pyx_MODULE_NAME, rtversion);
        #if PY_VERSION_HEX < 0x02050000
        return PyErr_Warn(NULL, message);
        #else
        return PyErr_WarnEx(NULL, message, 1);
        #endif
    }
    return 0;
}

static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
    int start = 0, mid = 0, end = count - 1;
    if (end >= 0 && code_line > entries[end].code_line) {
        return count;
    }
    while (start < end) {
        mid = (start + end) / 2;
        if (code_line < entries[mid].code_line) {
            end = mid;
        } else if (code_line > entries[mid].code_line) {
             start = mid + 1;
        } else {
            return mid;
        }
    }
    if (code_line <= entries[mid].code_line) {
        return mid;
    } else {
        return mid + 1;
    }
}
static PyCodeObject *__pyx_find_code_object(int code_line) {
    PyCodeObject* code_object;
    int pos;
    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
        return NULL;
    }
    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
        return NULL;
    }
    code_object = __pyx_code_cache.entries[pos].code_object;
    Py_INCREF(code_object);
    return code_object;
}
static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
    int pos, i;
    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
    if (unlikely(!code_line)) {
        return;
    }
    if (unlikely(!entries)) {
        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
        if (likely(entries)) {
            __pyx_code_cache.entries = entries;
            __pyx_code_cache.max_count = 64;
            __pyx_code_cache.count = 1;
            entries[0].code_line = code_line;
            entries[0].code_object = code_object;
            Py_INCREF(code_object);
        }
        return;
    }
    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
        PyCodeObject* tmp = entries[pos].code_object;
        entries[pos].code_object = code_object;
        Py_DECREF(tmp);
        return;
    }
    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
        int new_max = __pyx_code_cache.max_count + 64;
        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
            __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry));
        if (unlikely(!entries)) {
            return;
        }
        __pyx_code_cache.entries = entries;
        __pyx_code_cache.max_count = new_max;
    }
    for (i=__pyx_code_cache.count; i>pos; i--) {
        entries[i] = entries[i-1];
    }
    entries[pos].code_line = code_line;
    entries[pos].code_object = code_object;
    __pyx_code_cache.count++;
    Py_INCREF(code_object);
}

#include "compile.h"
#include "frameobject.h"
#include "traceback.h"
static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
            const char *funcname, int c_line,
            int py_line, const char *filename) {
    PyCodeObject *py_code = 0;
    PyObject *py_srcfile = 0;
    PyObject *py_funcname = 0;
    #if PY_MAJOR_VERSION < 3
    py_srcfile = PyString_FromString(filename);
    #else
    py_srcfile = PyUnicode_FromString(filename);
    #endif
    if (!py_srcfile) goto bad;
    if (c_line) {
        #if PY_MAJOR_VERSION < 3
        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
        #else
        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
        #endif
    }
    else {
        #if PY_MAJOR_VERSION < 3
        py_funcname = PyString_FromString(funcname);
        #else
        py_funcname = PyUnicode_FromString(funcname);
        #endif
    }
    if (!py_funcname) goto bad;
    py_code = __Pyx_PyCode_New(
        0,            /*int argcount,*/
        0,            /*int kwonlyargcount,*/
        0,            /*int nlocals,*/
        0,            /*int stacksize,*/
        0,            /*int flags,*/
        __pyx_empty_bytes, /*PyObject *code,*/
        __pyx_empty_tuple, /*PyObject *consts,*/
        __pyx_empty_tuple, /*PyObject *names,*/
        __pyx_empty_tuple, /*PyObject *varnames,*/
        __pyx_empty_tuple, /*PyObject *freevars,*/
        __pyx_empty_tuple, /*PyObject *cellvars,*/
        py_srcfile,   /*PyObject *filename,*/
        py_funcname,  /*PyObject *name,*/
        py_line,      /*int firstlineno,*/
        __pyx_empty_bytes  /*PyObject *lnotab*/
    );
    Py_DECREF(py_srcfile);
    Py_DECREF(py_funcname);
    return py_code;
bad:
    Py_XDECREF(py_srcfile);
    Py_XDECREF(py_funcname);
    return NULL;
}
static void __Pyx_AddTraceback(const char *funcname, int c_line,
                               int py_line, const char *filename) {
    PyCodeObject *py_code = 0;
    PyObject *py_globals = 0;
    PyFrameObject *py_frame = 0;
    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
    if (!py_code) {
        py_code = __Pyx_CreateCodeObjectForTraceback(
            funcname, c_line, py_line, filename);
        if (!py_code) goto bad;
        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
    }
    py_globals = PyModule_GetDict(__pyx_m);
    if (!py_globals) goto bad;
    py_frame = PyFrame_New(
        PyThreadState_GET(), /*PyThreadState *tstate,*/
        py_code,             /*PyCodeObject *code,*/
        py_globals,          /*PyObject *globals,*/
        0                    /*PyObject *locals*/
    );
    if (!py_frame) goto bad;
    py_frame->f_lineno = py_line;
    PyTraceBack_Here(py_frame);
bad:
    Py_XDECREF(py_code);
    Py_XDECREF(py_frame);
}

static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
    while (t->p) {
        #if PY_MAJOR_VERSION < 3
        if (t->is_unicode) {
            *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
        } else if (t->intern) {
            *t->p = PyString_InternFromString(t->s);
        } else {
            *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
        }
        #else  /* Python 3+ has unicode identifiers */
        if (t->is_unicode | t->is_str) {
            if (t->intern) {
                *t->p = PyUnicode_InternFromString(t->s);
            } else if (t->encoding) {
                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
            } else {
                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
            }
        } else {
            *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
        }
        #endif
        if (!*t->p)
            return -1;
        ++t;
    }
    return 0;
}

static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(char* c_str) {
    return __Pyx_PyUnicode_FromStringAndSize(c_str, strlen(c_str));
}
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) {
    Py_ssize_t ignore;
    return __Pyx_PyObject_AsStringAndSize(o, &ignore);
}
static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
    if (
#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
            __Pyx_sys_getdefaultencoding_not_ascii &&
#endif
            PyUnicode_Check(o)) {
#if PY_VERSION_HEX < 0x03030000
        char* defenc_c;
        PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL);
        if (!defenc) return NULL;
        defenc_c = PyBytes_AS_STRING(defenc);
#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
        {
            char* end = defenc_c + PyBytes_GET_SIZE(defenc);
            char* c;
            for (c = defenc_c; c < end; c++) {
                if ((unsigned char) (*c) >= 128) {
                    PyUnicode_AsASCIIString(o);
                    return NULL;
                }
            }
        }
#endif /*__PYX_DEFAULT_STRING_ENCODING_IS_ASCII*/
        *length = PyBytes_GET_SIZE(defenc);
        return defenc_c;
#else /* PY_VERSION_HEX < 0x03030000 */
        if (PyUnicode_READY(o) == -1) return NULL;
#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
        if (PyUnicode_IS_ASCII(o)) {
            *length = PyUnicode_GET_DATA_SIZE(o);
            return PyUnicode_AsUTF8(o);
        } else {
            PyUnicode_AsASCIIString(o);
            return NULL;
        }
#else /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */
        return PyUnicode_AsUTF8AndSize(o, length);
#endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */
#endif /* PY_VERSION_HEX < 0x03030000 */
    } else
#endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII  || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT */
#if !CYTHON_COMPILING_IN_PYPY
#if PY_VERSION_HEX >= 0x02060000
    if (PyByteArray_Check(o)) {
        *length = PyByteArray_GET_SIZE(o);
        return PyByteArray_AS_STRING(o);
    } else
#endif
#endif
    {
        char* result;
        int r = PyBytes_AsStringAndSize(o, &result, length);
        if (unlikely(r < 0)) {
            return NULL;
        } else {
            return result;
        }
    }
}
static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
   int is_true = x == Py_True;
   if (is_true | (x == Py_False) | (x == Py_None)) return is_true;
   else return PyObject_IsTrue(x);
}
static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
  PyNumberMethods *m;
  const char *name = NULL;
  PyObject *res = NULL;
#if PY_MAJOR_VERSION < 3
  if (PyInt_Check(x) || PyLong_Check(x))
#else
  if (PyLong_Check(x))
#endif
    return Py_INCREF(x), x;
  m = Py_TYPE(x)->tp_as_number;
#if PY_MAJOR_VERSION < 3
  if (m && m->nb_int) {
    name = "int";
    res = PyNumber_Int(x);
  }
  else if (m && m->nb_long) {
    name = "long";
    res = PyNumber_Long(x);
  }
#else
  if (m && m->nb_int) {
    name = "int";
    res = PyNumber_Long(x);
  }
#endif
  if (res) {
#if PY_MAJOR_VERSION < 3
    if (!PyInt_Check(res) && !PyLong_Check(res)) {
#else
    if (!PyLong_Check(res)) {
#endif
      PyErr_Format(PyExc_TypeError,
                   "__%.4s__ returned non-%.4s (type %.200s)",
                   name, name, Py_TYPE(res)->tp_name);
      Py_DECREF(res);
      return NULL;
    }
  }
  else if (!PyErr_Occurred()) {
    PyErr_SetString(PyExc_TypeError,
                    "an integer is required");
  }
  return res;
}
#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
  #include "longintrepr.h"
 #endif
#endif
static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
  Py_ssize_t ival;
  PyObject *x;
#if PY_MAJOR_VERSION < 3
  if (likely(PyInt_CheckExact(b)))
      return PyInt_AS_LONG(b);
#endif
  if (likely(PyLong_CheckExact(b))) {
    #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
     #if CYTHON_USE_PYLONG_INTERNALS
       switch (Py_SIZE(b)) {
       case -1: return -(sdigit)((PyLongObject*)b)->ob_digit[0];
       case  0: return 0;
       case  1: return ((PyLongObject*)b)->ob_digit[0];
       }
     #endif
    #endif
  #if PY_VERSION_HEX < 0x02060000
    return PyInt_AsSsize_t(b);
  #else
    return PyLong_AsSsize_t(b);
  #endif
  }
  x = PyNumber_Index(b);
  if (!x) return -1;
  ival = PyInt_AsSsize_t(x);
  Py_DECREF(x);
  return ival;
}
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
#if PY_VERSION_HEX < 0x02050000
   if (ival <= LONG_MAX)
       return PyInt_FromLong((long)ival);
   else {
       unsigned char *bytes = (unsigned char *) &ival;
       int one = 1; int little = (int)*(unsigned char*)&one;
       return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0);
   }
#else
   return PyInt_FromSize_t(ival);
#endif
}


#endif /* Py_PYTHON_H */
