Generated by Cython 0.29.14

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

Raw output: basic_path_finding.pyx

 001: """
 002:  -----------------------------------------------------------------------------------------------------------
 003:  Package:    AequilibraE
 004:  Name:       Core path computation algorithms, accessible only at Cython/C Level
 005:  Purpose:    Supports the implementation shortest path and network loading routines
 006:  Original Author:  Pedro Camargo (c@margo.co)
 007:  Contributors:
 008:  Last edited by: Pedro Camrgo
 009:  Website:    www.AequilibraE.com
 010:  Repository:  https://github.com/AequilibraE/AequilibraE
 011:  Created:    15/09/2013
 012:  Updated:    24/04/2018
 013:  Copyright:   (c) AequilibraE authors
 014:  Licence:     See LICENSE.TXT
 015:  -----------------------------------------------------------------------------------------------------------
 016: Original Algorithm for Shortest path (Dijkstra with a Fibonacci heap) was written by Jake Vanderplas <vanderplas@astro.washington.edu> under license: BSD, (C) 2012
 017:  """
 018: 
 019: """
 020: TODO:
 021: LIST OF ALL THE THINGS WE NEED TO DO TO NOT HAVE TO HAVE nodes 1..n as CENTROIDS. ARBITRARY NUMBERING
 022: - Checks of weather the centroid we are computing path from is a centroid and/or exists in the graph
 023: - Re-write function **network_loading** on the part of loading flows to centroids
 024: """
 025: cimport cython
 026: from libc.math cimport isnan
 027: 
 028: include 'parameters.pxi'
 029: from libc.stdlib cimport abort, malloc, free
 030: 
 031: @cython.wraparound(False)
 032: @cython.embedsignature(True)
 033: @cython.boundscheck(False) # turn of bounds-checking for entire function
+034: cpdef void network_loading(long classes,
static PyObject *__pyx_pw_3AoN_1network_loading(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static void __pyx_f_3AoN_network_loading(long __pyx_v_classes, __Pyx_memviewslice __pyx_v_demand, __Pyx_memviewslice __pyx_v_pred, __Pyx_memviewslice __pyx_v_conn, __Pyx_memviewslice __pyx_v_link_loads, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_no_path, __Pyx_memviewslice __pyx_v_reached_first, __Pyx_memviewslice __pyx_v_node_load, long __pyx_v_found, CYTHON_UNUSED int __pyx_skip_dispatch) {
  PY_LONG_LONG __pyx_v_i;
  PY_LONG_LONG __pyx_v_j;
  PY_LONG_LONG __pyx_v_predecessor;
  PY_LONG_LONG __pyx_v_connector;
  PY_LONG_LONG __pyx_v_node;
  PY_LONG_LONG __pyx_v_zones;
  PY_LONG_LONG __pyx_v_N;
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __PYX_XDEC_MEMVIEW(&__pyx_t_4, 0);
  __Pyx_WriteUnraisable("AoN.network_loading", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 1);
  __pyx_L0:;
}

/* Python wrapper */
static PyObject *__pyx_pw_3AoN_1network_loading(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_3AoN_network_loading[] = "network_loading(long classes, double[:, :] demand, long long[:] pred, long long[:] conn, double[:, :] link_loads, long long[:] no_path, long long[:] reached_first, double[:, :] node_load, long found) -> void";
static PyObject *__pyx_pw_3AoN_1network_loading(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  long __pyx_v_classes;
  __Pyx_memviewslice __pyx_v_demand = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_pred = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_conn = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_link_loads = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_no_path = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_reached_first = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_node_load = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_found;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("network_loading (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_classes,&__pyx_n_s_demand,&__pyx_n_s_pred,&__pyx_n_s_conn,&__pyx_n_s_link_loads,&__pyx_n_s_no_path,&__pyx_n_s_reached_first,&__pyx_n_s_node_load,&__pyx_n_s_found,0};
    PyObject* values[9] = {0,0,0,0,0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_classes)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_demand)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("network_loading", 1, 9, 9, 1); __PYX_ERR(0, 34, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pred)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("network_loading", 1, 9, 9, 2); __PYX_ERR(0, 34, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_conn)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("network_loading", 1, 9, 9, 3); __PYX_ERR(0, 34, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_link_loads)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("network_loading", 1, 9, 9, 4); __PYX_ERR(0, 34, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_no_path)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("network_loading", 1, 9, 9, 5); __PYX_ERR(0, 34, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_reached_first)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("network_loading", 1, 9, 9, 6); __PYX_ERR(0, 34, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_node_load)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("network_loading", 1, 9, 9, 7); __PYX_ERR(0, 34, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_found)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("network_loading", 1, 9, 9, 8); __PYX_ERR(0, 34, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "network_loading") < 0)) __PYX_ERR(0, 34, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 9) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
      values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
      values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
      values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
      values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
    }
    __pyx_v_classes = __Pyx_PyInt_As_long(values[0]); if (unlikely((__pyx_v_classes == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
    __pyx_v_demand = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_demand.memview)) __PYX_ERR(0, 35, __pyx_L3_error)
    __pyx_v_pred = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_pred.memview)) __PYX_ERR(0, 36, __pyx_L3_error)
    __pyx_v_conn = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_conn.memview)) __PYX_ERR(0, 37, __pyx_L3_error)
    __pyx_v_link_loads = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_link_loads.memview)) __PYX_ERR(0, 38, __pyx_L3_error)
    __pyx_v_no_path = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_no_path.memview)) __PYX_ERR(0, 39, __pyx_L3_error)
    __pyx_v_reached_first = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_reached_first.memview)) __PYX_ERR(0, 40, __pyx_L3_error)
    __pyx_v_node_load = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_node_load.memview)) __PYX_ERR(0, 41, __pyx_L3_error)
    __pyx_v_found = __Pyx_PyInt_As_long(values[8]); if (unlikely((__pyx_v_found == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 42, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("network_loading", 1, 9, 9, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 34, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("AoN.network_loading", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_3AoN_network_loading(__pyx_self, __pyx_v_classes, __pyx_v_demand, __pyx_v_pred, __pyx_v_conn, __pyx_v_link_loads, __pyx_v_no_path, __pyx_v_reached_first, __pyx_v_node_load, __pyx_v_found);

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

static PyObject *__pyx_pf_3AoN_network_loading(CYTHON_UNUSED PyObject *__pyx_self, long __pyx_v_classes, __Pyx_memviewslice __pyx_v_demand, __Pyx_memviewslice __pyx_v_pred, __Pyx_memviewslice __pyx_v_conn, __Pyx_memviewslice __pyx_v_link_loads, __Pyx_memviewslice __pyx_v_no_path, __Pyx_memviewslice __pyx_v_reached_first, __Pyx_memviewslice __pyx_v_node_load, long __pyx_v_found) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("network_loading", 0);
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_demand.memview)) { __Pyx_RaiseUnboundLocalError("demand"); __PYX_ERR(0, 34, __pyx_L1_error) }
  if (unlikely(!__pyx_v_pred.memview)) { __Pyx_RaiseUnboundLocalError("pred"); __PYX_ERR(0, 34, __pyx_L1_error) }
  if (unlikely(!__pyx_v_conn.memview)) { __Pyx_RaiseUnboundLocalError("conn"); __PYX_ERR(0, 34, __pyx_L1_error) }
  if (unlikely(!__pyx_v_link_loads.memview)) { __Pyx_RaiseUnboundLocalError("link_loads"); __PYX_ERR(0, 34, __pyx_L1_error) }
  if (unlikely(!__pyx_v_no_path.memview)) { __Pyx_RaiseUnboundLocalError("no_path"); __PYX_ERR(0, 34, __pyx_L1_error) }
  if (unlikely(!__pyx_v_reached_first.memview)) { __Pyx_RaiseUnboundLocalError("reached_first"); __PYX_ERR(0, 34, __pyx_L1_error) }
  if (unlikely(!__pyx_v_node_load.memview)) { __Pyx_RaiseUnboundLocalError("node_load"); __PYX_ERR(0, 34, __pyx_L1_error) }
  __pyx_t_1 = __Pyx_void_to_None(__pyx_f_3AoN_network_loading(__pyx_v_classes, __pyx_v_demand, __pyx_v_pred, __pyx_v_conn, __pyx_v_link_loads, __pyx_v_no_path, __pyx_v_reached_first, __pyx_v_node_load, __pyx_v_found, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __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("AoN.network_loading", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_demand, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_pred, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_conn, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_link_loads, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_no_path, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_reached_first, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_node_load, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 035:                            double[:, :] demand,
 036:                            long long [:] pred,
 037:                            long long [:] conn,
 038:                            double[:, :] link_loads,
 039:                            long long [:] no_path,
 040:                            long long [:] reached_first,
 041:                            double [:, :] node_load,
 042:                            long found) nogil:
 043: 
 044:     cdef long long i, j, predecessor, connector, node
+045:     cdef long long zones = demand.shape[0]
  __pyx_v_zones = (__pyx_v_demand.shape[0]);
+046:     cdef long long N = node_load.shape[0]
  __pyx_v_N = (__pyx_v_node_load.shape[0]);
 047: 
 048:     # Clean the node load array
+049:     for i in range(N):
  __pyx_t_1 = __pyx_v_N;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+050:         node_load[i] = 0
    __pyx_t_4.data = __pyx_v_node_load.data;
    __pyx_t_4.memview = __pyx_v_node_load.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_4, 0);
    {
    Py_ssize_t __pyx_tmp_idx = __pyx_v_i;
    Py_ssize_t __pyx_tmp_stride = __pyx_v_node_load.strides[0];
        if ((0)) __PYX_ERR(0, 50, __pyx_L1_error)
        __pyx_t_4.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

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

{
        double __pyx_temp_scalar = 0.0;
        {
            Py_ssize_t __pyx_temp_extent_0 = __pyx_t_4.shape[0];
            Py_ssize_t __pyx_temp_stride_0 = __pyx_t_4.strides[0];
            char *__pyx_temp_pointer_0;
            Py_ssize_t __pyx_temp_idx_0;
            __pyx_temp_pointer_0 = __pyx_t_4.data;
            for (__pyx_temp_idx_0 = 0; __pyx_temp_idx_0 < __pyx_temp_extent_0; __pyx_temp_idx_0++) {
              *((double *) __pyx_temp_pointer_0) = __pyx_temp_scalar;
              __pyx_temp_pointer_0 += __pyx_temp_stride_0;
            }
        }
    }
    __PYX_XDEC_MEMVIEW(&__pyx_t_4, 0);
    __pyx_t_4.memview = NULL;
    __pyx_t_4.data = NULL;
  }
 051: 
 052:     # Loads the demand to the centroids
+053:     for j in range(classes):
  __pyx_t_5 = __pyx_v_classes;
  __pyx_t_6 = __pyx_t_5;
  for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_6; __pyx_t_1+=1) {
    __pyx_v_j = __pyx_t_1;
+054:         for i in range(zones):
    __pyx_t_2 = __pyx_v_zones;
    __pyx_t_3 = __pyx_t_2;
    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_3; __pyx_t_7+=1) {
      __pyx_v_i = __pyx_t_7;
+055:             if not isnan(demand[i, j]):
      __pyx_t_8 = __pyx_v_i;
      __pyx_t_9 = __pyx_v_j;
      __pyx_t_10 = ((!(isnan((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_demand.data + __pyx_t_8 * __pyx_v_demand.strides[0]) ) + __pyx_t_9 * __pyx_v_demand.strides[1]) )))) != 0)) != 0);
      if (__pyx_t_10) {
/* … */
      }
    }
  }
+056:                 node_load[i, j] = demand[i, j]
        __pyx_t_11 = __pyx_v_i;
        __pyx_t_12 = __pyx_v_j;
        __pyx_t_13 = __pyx_v_i;
        __pyx_t_14 = __pyx_v_j;
        *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_load.data + __pyx_t_13 * __pyx_v_node_load.strides[0]) ) + __pyx_t_14 * __pyx_v_node_load.strides[1]) )) = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_demand.data + __pyx_t_11 * __pyx_v_demand.strides[0]) ) + __pyx_t_12 * __pyx_v_demand.strides[1]) )));
 057: 
 058:     #Recursevely cascades to the origin
+059:     for i in range(found, 0, -1):
  for (__pyx_t_1 = __pyx_v_found; __pyx_t_1 > 0; __pyx_t_1-=1) {
    __pyx_v_i = __pyx_t_1;
+060:         node = reached_first[i]
    __pyx_t_2 = __pyx_v_i;
    __pyx_v_node = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_reached_first.data + __pyx_t_2 * __pyx_v_reached_first.strides[0]) )));
 061: 
 062:         # captures how we got to that node
+063:         predecessor = pred[node]
    __pyx_t_3 = __pyx_v_node;
    __pyx_v_predecessor = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_pred.data + __pyx_t_3 * __pyx_v_pred.strides[0]) )));
+064:         connector = conn[node]
    __pyx_t_7 = __pyx_v_node;
    __pyx_v_connector = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_conn.data + __pyx_t_7 * __pyx_v_conn.strides[0]) )));
 065: 
 066:         # loads the flow to the links for each class
+067:         for j in range(classes):
    __pyx_t_5 = __pyx_v_classes;
    __pyx_t_6 = __pyx_t_5;
    for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_6; __pyx_t_15+=1) {
      __pyx_v_j = __pyx_t_15;
+068:             link_loads[connector, j] += node_load[node, j]
      __pyx_t_16 = __pyx_v_node;
      __pyx_t_17 = __pyx_v_j;
      __pyx_t_18 = __pyx_v_connector;
      __pyx_t_19 = __pyx_v_j;
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_link_loads.data + __pyx_t_18 * __pyx_v_link_loads.strides[0]) ) + __pyx_t_19 * __pyx_v_link_loads.strides[1]) )) += (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_load.data + __pyx_t_16 * __pyx_v_node_load.strides[0]) ) + __pyx_t_17 * __pyx_v_node_load.strides[1]) )));
 069: 
 070:             # Cascades the load from the node to their predecessor
+071:             node_load[predecessor, j] += node_load[node, j]
      __pyx_t_20 = __pyx_v_node;
      __pyx_t_21 = __pyx_v_j;
      __pyx_t_22 = __pyx_v_predecessor;
      __pyx_t_23 = __pyx_v_j;
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_load.data + __pyx_t_22 * __pyx_v_node_load.strides[0]) ) + __pyx_t_23 * __pyx_v_node_load.strides[1]) )) += (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_load.data + __pyx_t_20 * __pyx_v_node_load.strides[0]) ) + __pyx_t_21 * __pyx_v_node_load.strides[1]) )));
    }
  }
 072: 
 073: @cython.wraparound(False)
 074: @cython.embedsignature(True)
 075: @cython.boundscheck(False)
+076: cdef void _copy_skims(double[:,:] skim_matrix,  #Skim matrix_procedures computed from one origin to all nodes
static void __pyx_f_3AoN__copy_skims(__Pyx_memviewslice __pyx_v_skim_matrix, __Pyx_memviewslice __pyx_v_final_skim_matrix) {
  long __pyx_v_i;
  long __pyx_v_j;
  long __pyx_v_N;
  long __pyx_v_skims;
/* … */
  /* function exit code */
}
 077:                       double[:,:] final_skim_matrix) nogil:  #Skim matrix_procedures computed for one origin to all other centroids only
 078: 
 079:     cdef long i, j
+080:     cdef long N = final_skim_matrix.shape[0]
  __pyx_v_N = (__pyx_v_final_skim_matrix.shape[0]);
+081:     cdef long skims = final_skim_matrix.shape[1]
  __pyx_v_skims = (__pyx_v_final_skim_matrix.shape[1]);
 082: 
+083:     for i in range(N):
  __pyx_t_1 = __pyx_v_N;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+084:         for j in range(skims):
    __pyx_t_4 = __pyx_v_skims;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_j = __pyx_t_6;
+085:             final_skim_matrix[i,j]=skim_matrix[i,j]
      __pyx_t_7 = __pyx_v_i;
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_9 = __pyx_v_i;
      __pyx_t_10 = __pyx_v_j;
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_final_skim_matrix.data + __pyx_t_9 * __pyx_v_final_skim_matrix.strides[0]) ) + __pyx_t_10 * __pyx_v_final_skim_matrix.strides[1]) )) = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_skim_matrix.data + __pyx_t_7 * __pyx_v_skim_matrix.strides[0]) ) + __pyx_t_8 * __pyx_v_skim_matrix.strides[1]) )));
    }
  }
 086: 
 087: 
+088: cdef return_an_int_view(input):
static PyObject *__pyx_f_3AoN_return_an_int_view(PyObject *__pyx_v_input) {
  __Pyx_memviewslice __pyx_v_critical_links_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("return_an_int_view", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __PYX_XDEC_MEMVIEW(&__pyx_t_1, 1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("AoN.return_an_int_view", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_critical_links_view, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+089:     cdef int [:] critical_links_view = input
  __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_ds_int(__pyx_v_input, PyBUF_WRITABLE); if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 89, __pyx_L1_error)
  __pyx_v_critical_links_view = __pyx_t_1;
  __pyx_t_1.memview = NULL;
  __pyx_t_1.data = NULL;
+090:     return critical_links_view
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_critical_links_view, 1, (PyObject *(*)(char *)) __pyx_memview_get_int, (int (*)(char *, PyObject *)) __pyx_memview_set_int, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 90, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
 091: 
 092: 
 093: @cython.wraparound(False)
 094: @cython.embedsignature(True)
 095: @cython.boundscheck(False)
+096: cpdef void perform_select_link_analysis(long origin,
static PyObject *__pyx_pw_3AoN_3perform_select_link_analysis(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static void __pyx_f_3AoN_perform_select_link_analysis(CYTHON_UNUSED long __pyx_v_origin, CYTHON_UNUSED int __pyx_v_classes, __Pyx_memviewslice __pyx_v_demand, __Pyx_memviewslice __pyx_v_pred, __Pyx_memviewslice __pyx_v_conn, __Pyx_memviewslice __pyx_v_aux_link_flows, __Pyx_memviewslice __pyx_v_critical_array, int __pyx_v_query_type, CYTHON_UNUSED int __pyx_skip_dispatch) {
  __pyx_t_3AoN_ITYPE_t __pyx_v_c;
  __pyx_t_3AoN_ITYPE_t __pyx_v_j;
  __pyx_t_3AoN_ITYPE_t __pyx_v_i;
  __pyx_t_3AoN_ITYPE_t __pyx_v_p;
  __pyx_t_3AoN_ITYPE_t __pyx_v_l;
  unsigned int __pyx_v_dests;
  unsigned int __pyx_v_q;
/* … */
  /* function exit code */
}

/* Python wrapper */
static PyObject *__pyx_pw_3AoN_3perform_select_link_analysis(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_3AoN_2perform_select_link_analysis[] = "perform_select_link_analysis(long origin, int classes, double[:, :] demand, long long[:] pred, long long[:] conn, long long[:] aux_link_flows, double[:, :] critical_array, int query_type) -> void";
static PyObject *__pyx_pw_3AoN_3perform_select_link_analysis(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  long __pyx_v_origin;
  int __pyx_v_classes;
  __Pyx_memviewslice __pyx_v_demand = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_pred = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_conn = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_aux_link_flows = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_critical_array = { 0, 0, { 0 }, { 0 }, { 0 } };
  int __pyx_v_query_type;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("perform_select_link_analysis (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_origin,&__pyx_n_s_classes,&__pyx_n_s_demand,&__pyx_n_s_pred,&__pyx_n_s_conn,&__pyx_n_s_aux_link_flows,&__pyx_n_s_critical_array,&__pyx_n_s_query_type,0};
    PyObject* values[8] = {0,0,0,0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_origin)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_classes)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("perform_select_link_analysis", 1, 8, 8, 1); __PYX_ERR(0, 96, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_demand)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("perform_select_link_analysis", 1, 8, 8, 2); __PYX_ERR(0, 96, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pred)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("perform_select_link_analysis", 1, 8, 8, 3); __PYX_ERR(0, 96, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_conn)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("perform_select_link_analysis", 1, 8, 8, 4); __PYX_ERR(0, 96, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_aux_link_flows)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("perform_select_link_analysis", 1, 8, 8, 5); __PYX_ERR(0, 96, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_critical_array)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("perform_select_link_analysis", 1, 8, 8, 6); __PYX_ERR(0, 96, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_query_type)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("perform_select_link_analysis", 1, 8, 8, 7); __PYX_ERR(0, 96, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "perform_select_link_analysis") < 0)) __PYX_ERR(0, 96, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 8) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
      values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
      values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
      values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
    }
    __pyx_v_origin = __Pyx_PyInt_As_long(values[0]); if (unlikely((__pyx_v_origin == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 96, __pyx_L3_error)
    __pyx_v_classes = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_classes == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 97, __pyx_L3_error)
    __pyx_v_demand = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_demand.memview)) __PYX_ERR(0, 98, __pyx_L3_error)
    __pyx_v_pred = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_pred.memview)) __PYX_ERR(0, 99, __pyx_L3_error)
    __pyx_v_conn = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_conn.memview)) __PYX_ERR(0, 100, __pyx_L3_error)
    __pyx_v_aux_link_flows = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_aux_link_flows.memview)) __PYX_ERR(0, 101, __pyx_L3_error)
    __pyx_v_critical_array = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_critical_array.memview)) __PYX_ERR(0, 102, __pyx_L3_error)
    __pyx_v_query_type = __Pyx_PyInt_As_int(values[7]); if (unlikely((__pyx_v_query_type == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 103, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("perform_select_link_analysis", 1, 8, 8, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 96, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("AoN.perform_select_link_analysis", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_3AoN_2perform_select_link_analysis(__pyx_self, __pyx_v_origin, __pyx_v_classes, __pyx_v_demand, __pyx_v_pred, __pyx_v_conn, __pyx_v_aux_link_flows, __pyx_v_critical_array, __pyx_v_query_type);

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

static PyObject *__pyx_pf_3AoN_2perform_select_link_analysis(CYTHON_UNUSED PyObject *__pyx_self, long __pyx_v_origin, int __pyx_v_classes, __Pyx_memviewslice __pyx_v_demand, __Pyx_memviewslice __pyx_v_pred, __Pyx_memviewslice __pyx_v_conn, __Pyx_memviewslice __pyx_v_aux_link_flows, __Pyx_memviewslice __pyx_v_critical_array, int __pyx_v_query_type) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("perform_select_link_analysis", 0);
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_demand.memview)) { __Pyx_RaiseUnboundLocalError("demand"); __PYX_ERR(0, 96, __pyx_L1_error) }
  if (unlikely(!__pyx_v_pred.memview)) { __Pyx_RaiseUnboundLocalError("pred"); __PYX_ERR(0, 96, __pyx_L1_error) }
  if (unlikely(!__pyx_v_conn.memview)) { __Pyx_RaiseUnboundLocalError("conn"); __PYX_ERR(0, 96, __pyx_L1_error) }
  if (unlikely(!__pyx_v_aux_link_flows.memview)) { __Pyx_RaiseUnboundLocalError("aux_link_flows"); __PYX_ERR(0, 96, __pyx_L1_error) }
  if (unlikely(!__pyx_v_critical_array.memview)) { __Pyx_RaiseUnboundLocalError("critical_array"); __PYX_ERR(0, 96, __pyx_L1_error) }
  __pyx_t_1 = __Pyx_void_to_None(__pyx_f_3AoN_perform_select_link_analysis(__pyx_v_origin, __pyx_v_classes, __pyx_v_demand, __pyx_v_pred, __pyx_v_conn, __pyx_v_aux_link_flows, __pyx_v_critical_array, __pyx_v_query_type, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 96, __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("AoN.perform_select_link_analysis", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_demand, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_pred, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_conn, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_aux_link_flows, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_critical_array, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 097:                                         int classes,
 098:                                         double[:, :] demand,
 099:                                         long long [:] pred,
 100:                                         long long [:] conn,
 101:                                         long long [:] aux_link_flows,
 102:                                         double [:, :] critical_array,
 103:                                         int query_type) nogil:
 104:     cdef unsigned int t_origin
 105:     cdef ITYPE_t c, j, i, p, l
+106:     cdef unsigned int dests = demand.shape[0]
  __pyx_v_dests = (__pyx_v_demand.shape[0]);
+107:     cdef unsigned int q = critical_array.shape[0]
  __pyx_v_q = (__pyx_v_critical_array.shape[0]);
 108: 
 109:     """ TODO:
 110:     FIX THE SELECT LINK ANALYSIS FOR MULTIPLE CLASSES"""
+111:     l = 0
  __pyx_v_l = 0;
+112:     for j in range(dests):
  __pyx_t_1 = __pyx_v_dests;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
+113:         if demand[j, l] > 0:
    __pyx_t_4 = __pyx_v_j;
    __pyx_t_5 = __pyx_v_l;
    __pyx_t_6 = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_demand.data + __pyx_t_4 * __pyx_v_demand.strides[0]) ) + __pyx_t_5 * __pyx_v_demand.strides[1]) ))) > 0.0) != 0);
    if (__pyx_t_6) {
/* … */
    }
+114:             p = pred[j]
      __pyx_t_7 = __pyx_v_j;
      __pyx_v_p = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_pred.data + __pyx_t_7 * __pyx_v_pred.strides[0]) )));
+115:             j = i
      __pyx_v_j = __pyx_v_i;
+116:             while p >= 0:
      while (1) {
        __pyx_t_6 = ((__pyx_v_p >= 0) != 0);
        if (!__pyx_t_6) break;
+117:                 c = conn[j]
        __pyx_t_8 = __pyx_v_j;
        __pyx_v_c = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_conn.data + __pyx_t_8 * __pyx_v_conn.strides[0]) )));
+118:                 aux_link_flows[c] = 1
        __pyx_t_9 = __pyx_v_c;
        *((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_aux_link_flows.data + __pyx_t_9 * __pyx_v_aux_link_flows.strides[0]) )) = 1;
+119:                 j = p
        __pyx_v_j = __pyx_v_p;
+120:                 p = pred[j]
        __pyx_t_10 = __pyx_v_j;
        __pyx_v_p = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_pred.data + __pyx_t_10 * __pyx_v_pred.strides[0]) )));
      }
+121:         if query_type == 1: # Either one of the links in the query
    __pyx_t_6 = ((__pyx_v_query_type == 1) != 0);
    if (__pyx_t_6) {
/* … */
    }
  }
+122:             for i in range(q):
      __pyx_t_11 = __pyx_v_q;
      __pyx_t_12 = __pyx_t_11;
      for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
        __pyx_v_i = __pyx_t_13;
+123:                 if aux_link_flows[i] == 1:
        __pyx_t_14 = __pyx_v_i;
        __pyx_t_6 = (((*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_aux_link_flows.data + __pyx_t_14 * __pyx_v_aux_link_flows.strides[0]) ))) == 1) != 0);
        if (__pyx_t_6) {
        }
      }
 124:                     critical_array
 125: 
 126: 
 127: @cython.wraparound(False)
 128: @cython.embedsignature(True)
 129: @cython.boundscheck(False)
+130: cpdef void put_path_file_on_disk(unsigned int orig,
static PyObject *__pyx_pw_3AoN_5put_path_file_on_disk(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static void __pyx_f_3AoN_put_path_file_on_disk(unsigned int __pyx_v_orig, __Pyx_memviewslice __pyx_v_pred, __Pyx_memviewslice __pyx_v_predecessors, __Pyx_memviewslice __pyx_v_conn, __Pyx_memviewslice __pyx_v_connectors, __Pyx_memviewslice __pyx_v_all_nodes, __Pyx_memviewslice __pyx_v_origins_to_write, __Pyx_memviewslice __pyx_v_nodes_to_write, CYTHON_UNUSED int __pyx_skip_dispatch) {
  PY_LONG_LONG __pyx_v_i;
  PY_LONG_LONG __pyx_v_k;
/* … */
  /* function exit code */
}

/* Python wrapper */
static PyObject *__pyx_pw_3AoN_5put_path_file_on_disk(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_3AoN_4put_path_file_on_disk[] = "put_path_file_on_disk(unsigned int orig, unsigned int[:] pred, long long[:] predecessors, unsigned int[:] conn, long long[:] connectors, long long[:] all_nodes, unsigned int[:] origins_to_write, unsigned int[:] nodes_to_write) -> void";
static PyObject *__pyx_pw_3AoN_5put_path_file_on_disk(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  unsigned int __pyx_v_orig;
  __Pyx_memviewslice __pyx_v_pred = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_predecessors = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_conn = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_connectors = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_all_nodes = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_origins_to_write = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_nodes_to_write = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("put_path_file_on_disk (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_orig,&__pyx_n_s_pred,&__pyx_n_s_predecessors,&__pyx_n_s_conn,&__pyx_n_s_connectors,&__pyx_n_s_all_nodes,&__pyx_n_s_origins_to_write,&__pyx_n_s_nodes_to_write,0};
    PyObject* values[8] = {0,0,0,0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_orig)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pred)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("put_path_file_on_disk", 1, 8, 8, 1); __PYX_ERR(0, 130, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_predecessors)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("put_path_file_on_disk", 1, 8, 8, 2); __PYX_ERR(0, 130, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_conn)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("put_path_file_on_disk", 1, 8, 8, 3); __PYX_ERR(0, 130, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_connectors)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("put_path_file_on_disk", 1, 8, 8, 4); __PYX_ERR(0, 130, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_all_nodes)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("put_path_file_on_disk", 1, 8, 8, 5); __PYX_ERR(0, 130, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_origins_to_write)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("put_path_file_on_disk", 1, 8, 8, 6); __PYX_ERR(0, 130, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_nodes_to_write)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("put_path_file_on_disk", 1, 8, 8, 7); __PYX_ERR(0, 130, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "put_path_file_on_disk") < 0)) __PYX_ERR(0, 130, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 8) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
      values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
      values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
      values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
    }
    __pyx_v_orig = __Pyx_PyInt_As_unsigned_int(values[0]); if (unlikely((__pyx_v_orig == (unsigned int)-1) && PyErr_Occurred())) __PYX_ERR(0, 130, __pyx_L3_error)
    __pyx_v_pred = __Pyx_PyObject_to_MemoryviewSlice_ds_unsigned_int(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_pred.memview)) __PYX_ERR(0, 131, __pyx_L3_error)
    __pyx_v_predecessors = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_predecessors.memview)) __PYX_ERR(0, 132, __pyx_L3_error)
    __pyx_v_conn = __Pyx_PyObject_to_MemoryviewSlice_ds_unsigned_int(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_conn.memview)) __PYX_ERR(0, 133, __pyx_L3_error)
    __pyx_v_connectors = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_connectors.memview)) __PYX_ERR(0, 134, __pyx_L3_error)
    __pyx_v_all_nodes = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_all_nodes.memview)) __PYX_ERR(0, 135, __pyx_L3_error)
    __pyx_v_origins_to_write = __Pyx_PyObject_to_MemoryviewSlice_ds_unsigned_int(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_origins_to_write.memview)) __PYX_ERR(0, 136, __pyx_L3_error)
    __pyx_v_nodes_to_write = __Pyx_PyObject_to_MemoryviewSlice_ds_unsigned_int(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_nodes_to_write.memview)) __PYX_ERR(0, 137, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("put_path_file_on_disk", 1, 8, 8, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 130, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("AoN.put_path_file_on_disk", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_3AoN_4put_path_file_on_disk(__pyx_self, __pyx_v_orig, __pyx_v_pred, __pyx_v_predecessors, __pyx_v_conn, __pyx_v_connectors, __pyx_v_all_nodes, __pyx_v_origins_to_write, __pyx_v_nodes_to_write);

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

static PyObject *__pyx_pf_3AoN_4put_path_file_on_disk(CYTHON_UNUSED PyObject *__pyx_self, unsigned int __pyx_v_orig, __Pyx_memviewslice __pyx_v_pred, __Pyx_memviewslice __pyx_v_predecessors, __Pyx_memviewslice __pyx_v_conn, __Pyx_memviewslice __pyx_v_connectors, __Pyx_memviewslice __pyx_v_all_nodes, __Pyx_memviewslice __pyx_v_origins_to_write, __Pyx_memviewslice __pyx_v_nodes_to_write) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("put_path_file_on_disk", 0);
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_pred.memview)) { __Pyx_RaiseUnboundLocalError("pred"); __PYX_ERR(0, 130, __pyx_L1_error) }
  if (unlikely(!__pyx_v_predecessors.memview)) { __Pyx_RaiseUnboundLocalError("predecessors"); __PYX_ERR(0, 130, __pyx_L1_error) }
  if (unlikely(!__pyx_v_conn.memview)) { __Pyx_RaiseUnboundLocalError("conn"); __PYX_ERR(0, 130, __pyx_L1_error) }
  if (unlikely(!__pyx_v_connectors.memview)) { __Pyx_RaiseUnboundLocalError("connectors"); __PYX_ERR(0, 130, __pyx_L1_error) }
  if (unlikely(!__pyx_v_all_nodes.memview)) { __Pyx_RaiseUnboundLocalError("all_nodes"); __PYX_ERR(0, 130, __pyx_L1_error) }
  if (unlikely(!__pyx_v_origins_to_write.memview)) { __Pyx_RaiseUnboundLocalError("origins_to_write"); __PYX_ERR(0, 130, __pyx_L1_error) }
  if (unlikely(!__pyx_v_nodes_to_write.memview)) { __Pyx_RaiseUnboundLocalError("nodes_to_write"); __PYX_ERR(0, 130, __pyx_L1_error) }
  __pyx_t_1 = __Pyx_void_to_None(__pyx_f_3AoN_put_path_file_on_disk(__pyx_v_orig, __pyx_v_pred, __pyx_v_predecessors, __pyx_v_conn, __pyx_v_connectors, __pyx_v_all_nodes, __pyx_v_origins_to_write, __pyx_v_nodes_to_write, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 130, __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("AoN.put_path_file_on_disk", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_pred, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_predecessors, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_conn, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_connectors, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_all_nodes, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_origins_to_write, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_nodes_to_write, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 131:                                  unsigned int [:] pred,
 132:                                  long long [:] predecessors,
 133:                                  unsigned int [:] conn,
 134:                                  long long [:] connectors,
 135:                                  long long [:] all_nodes,
 136:                                  unsigned int [:] origins_to_write,
 137:                                  unsigned int [:] nodes_to_write) nogil:
 138:     cdef long long i
+139:     cdef long long k = pred.shape[0]
  __pyx_v_k = (__pyx_v_pred.shape[0]);
 140: 
+141:     for i in range(k):
  __pyx_t_1 = __pyx_v_k;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+142:         origins_to_write[i] = orig
    __pyx_t_4 = __pyx_v_i;
    *((unsigned int *) ( /* dim=0 */ (__pyx_v_origins_to_write.data + __pyx_t_4 * __pyx_v_origins_to_write.strides[0]) )) = __pyx_v_orig;
+143:         nodes_to_write[i] = all_nodes[i]
    __pyx_t_5 = __pyx_v_i;
    __pyx_t_6 = __pyx_v_i;
    *((unsigned int *) ( /* dim=0 */ (__pyx_v_nodes_to_write.data + __pyx_t_6 * __pyx_v_nodes_to_write.strides[0]) )) = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_all_nodes.data + __pyx_t_5 * __pyx_v_all_nodes.strides[0]) )));
+144:         pred[i] = all_nodes[predecessors[i]]
    __pyx_t_7 = __pyx_v_i;
    __pyx_t_8 = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_predecessors.data + __pyx_t_7 * __pyx_v_predecessors.strides[0]) )));
    __pyx_t_9 = __pyx_v_i;
    *((unsigned int *) ( /* dim=0 */ (__pyx_v_pred.data + __pyx_t_9 * __pyx_v_pred.strides[0]) )) = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_all_nodes.data + __pyx_t_8 * __pyx_v_all_nodes.strides[0]) )));
+145:         conn[i] = connectors[i]
    __pyx_t_10 = __pyx_v_i;
    __pyx_t_11 = __pyx_v_i;
    *((unsigned int *) ( /* dim=0 */ (__pyx_v_conn.data + __pyx_t_11 * __pyx_v_conn.strides[0]) )) = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_connectors.data + __pyx_t_10 * __pyx_v_connectors.strides[0]) )));
  }
 146: 
 147: 
 148: @cython.wraparound(False)
 149: @cython.embedsignature(True)
 150: @cython.boundscheck(False)
+151: cdef void blocking_centroid_flows(int action,
static void __pyx_f_3AoN_blocking_centroid_flows(int __pyx_v_action, PY_LONG_LONG __pyx_v_orig, __Pyx_memviewslice __pyx_v_fs, __Pyx_memviewslice __pyx_v_temp_b_nodes, __Pyx_memviewslice __pyx_v_real_b_nodes) {
  PY_LONG_LONG __pyx_v_i;
/* … */
  /* function exit code */
}
 152:                                   long long orig,
 153:                                   long long [:] fs,
 154:                                   long long [:] temp_b_nodes,
 155:                                   long long [:] real_b_nodes) nogil:
 156:     cdef long long i
 157: 
+158:     if action == 0: # We are unblocking
  __pyx_t_1 = ((__pyx_v_action == 0) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+159:         for i in range(fs[orig], fs[orig + 1]):
    __pyx_t_2 = (__pyx_v_orig + 1);
    __pyx_t_3 = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_fs.data + __pyx_t_2 * __pyx_v_fs.strides[0]) )));
    __pyx_t_4 = __pyx_v_orig;
    __pyx_t_5 = __pyx_t_3;
    for (__pyx_t_6 = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_fs.data + __pyx_t_4 * __pyx_v_fs.strides[0]) ))); __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_i = __pyx_t_6;
+160:             temp_b_nodes[i] = real_b_nodes[i]
      __pyx_t_7 = __pyx_v_i;
      __pyx_t_8 = __pyx_v_i;
      *((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_temp_b_nodes.data + __pyx_t_8 * __pyx_v_temp_b_nodes.strides[0]) )) = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_real_b_nodes.data + __pyx_t_7 * __pyx_v_real_b_nodes.strides[0]) )));
    }
 161:     else: # We are blocking:
+162:         for i in range(fs[orig], fs[orig + 1]):
  /*else*/ {
    __pyx_t_3 = (__pyx_v_orig + 1);
    __pyx_t_5 = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_fs.data + __pyx_t_3 * __pyx_v_fs.strides[0]) )));
    __pyx_t_6 = __pyx_v_orig;
    __pyx_t_9 = __pyx_t_5;
    for (__pyx_t_10 = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_fs.data + __pyx_t_6 * __pyx_v_fs.strides[0]) ))); __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
      __pyx_v_i = __pyx_t_10;
+163:             temp_b_nodes[i] = orig
      __pyx_t_11 = __pyx_v_i;
      *((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_temp_b_nodes.data + __pyx_t_11 * __pyx_v_temp_b_nodes.strides[0]) )) = __pyx_v_orig;
    }
  }
  __pyx_L3:;
 164: 
 165: 
 166: @cython.wraparound(False)
 167: @cython.embedsignature(True)
 168: @cython.boundscheck(False) # turn of bounds-checking for entire function
+169: cdef void skim_single_path(long origin,
static void __pyx_f_3AoN_skim_single_path(long __pyx_v_origin, long __pyx_v_nodes, long __pyx_v_skims, __Pyx_memviewslice __pyx_v_node_skims, __Pyx_memviewslice __pyx_v_pred, __Pyx_memviewslice __pyx_v_conn, __Pyx_memviewslice __pyx_v_graph_costs, __Pyx_memviewslice __pyx_v_reached_first, long __pyx_v_found) {
  PY_LONG_LONG __pyx_v_i;
  PY_LONG_LONG __pyx_v_node;
  PY_LONG_LONG __pyx_v_predecessor;
  PY_LONG_LONG __pyx_v_connector;
  PY_LONG_LONG __pyx_v_j;
/* … */
  /* function exit code */
}
 170:                            long nodes,
 171:                            long skims,
 172:                            double[:, :] node_skims,
 173:                            long long [:] pred,
 174:                            long long [:] conn,
 175:                            double[:, :] graph_costs,
 176:                            long long [:] reached_first,
 177:                            long found) nogil:
 178:     cdef long long i, node, predecessor, connector, j
 179: 
 180:     # sets all skims to infinity
+181:     for i in range(nodes):
  __pyx_t_1 = __pyx_v_nodes;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+182:         for j in range(skims):
    __pyx_t_4 = __pyx_v_skims;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_j = __pyx_t_6;
+183:             node_skims[i, j] = INFINITE
      __pyx_t_7 = __pyx_v_i;
      __pyx_t_8 = __pyx_v_j;
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_skims.data + __pyx_t_7 * __pyx_v_node_skims.strides[0]) ) + __pyx_t_8 * __pyx_v_node_skims.strides[1]) )) = __pyx_v_3AoN_INFINITE;
    }
  }
 184: 
 185:     # Zeroes the intrazonal cost
+186:     for j in range(skims):
  __pyx_t_1 = __pyx_v_skims;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
+187:             node_skims[origin, j] = 0
    __pyx_t_9 = __pyx_v_origin;
    __pyx_t_6 = __pyx_v_j;
    *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_skims.data + __pyx_t_9 * __pyx_v_node_skims.strides[0]) ) + __pyx_t_6 * __pyx_v_node_skims.strides[1]) )) = 0.0;
  }
 188: 
 189:     # Cascade skimming
+190:     for i in range(1, found + 1):
  __pyx_t_1 = (__pyx_v_found + 1);
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 1; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+191:         node = reached_first[i]
    __pyx_t_10 = __pyx_v_i;
    __pyx_v_node = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_reached_first.data + __pyx_t_10 * __pyx_v_reached_first.strides[0]) )));
 192: 
 193:         # captures how we got to that node
+194:         predecessor = pred[node]
    __pyx_t_11 = __pyx_v_node;
    __pyx_v_predecessor = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_pred.data + __pyx_t_11 * __pyx_v_pred.strides[0]) )));
+195:         connector = conn[node]
    __pyx_t_12 = __pyx_v_node;
    __pyx_v_connector = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_conn.data + __pyx_t_12 * __pyx_v_conn.strides[0]) )));
 196: 
+197:         for j in range(skims):
    __pyx_t_4 = __pyx_v_skims;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_5; __pyx_t_13+=1) {
      __pyx_v_j = __pyx_t_13;
+198:             node_skims[node, j] = node_skims[predecessor, j] + graph_costs[connector, j]
      __pyx_t_14 = __pyx_v_predecessor;
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_16 = __pyx_v_connector;
      __pyx_t_17 = __pyx_v_j;
      __pyx_t_18 = __pyx_v_node;
      __pyx_t_19 = __pyx_v_j;
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_skims.data + __pyx_t_18 * __pyx_v_node_skims.strides[0]) ) + __pyx_t_19 * __pyx_v_node_skims.strides[1]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_skims.data + __pyx_t_14 * __pyx_v_node_skims.strides[0]) ) + __pyx_t_15 * __pyx_v_node_skims.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_graph_costs.data + __pyx_t_16 * __pyx_v_graph_costs.strides[0]) ) + __pyx_t_17 * __pyx_v_graph_costs.strides[1]) ))));
    }
  }
 199: 
 200: 
 201: @cython.wraparound(False)
 202: @cython.embedsignature(True)
 203: @cython.boundscheck(False) # turn of bounds-checking for entire function
+204: cpdef void skim_multiple_fields(long origin,
static PyObject *__pyx_pw_3AoN_7skim_multiple_fields(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static void __pyx_f_3AoN_skim_multiple_fields(long __pyx_v_origin, long __pyx_v_nodes, long __pyx_v_zones, long __pyx_v_skims, __Pyx_memviewslice __pyx_v_node_skims, __Pyx_memviewslice __pyx_v_pred, __Pyx_memviewslice __pyx_v_conn, __Pyx_memviewslice __pyx_v_graph_costs, __Pyx_memviewslice __pyx_v_reached_first, long __pyx_v_found, __Pyx_memviewslice __pyx_v_final_skims, CYTHON_UNUSED int __pyx_skip_dispatch) {
  PY_LONG_LONG __pyx_v_i;
  PY_LONG_LONG __pyx_v_node;
  PY_LONG_LONG __pyx_v_predecessor;
  PY_LONG_LONG __pyx_v_connector;
  PY_LONG_LONG __pyx_v_j;
/* … */
  /* function exit code */
}

/* Python wrapper */
static PyObject *__pyx_pw_3AoN_7skim_multiple_fields(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_3AoN_6skim_multiple_fields[] = "skim_multiple_fields(long origin, long nodes, long zones, long skims, double[:, :] node_skims, long long[:] pred, long long[:] conn, double[:, :] graph_costs, long long[:] reached_first, long found, double[:, :] final_skims) -> void";
static PyObject *__pyx_pw_3AoN_7skim_multiple_fields(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  long __pyx_v_origin;
  long __pyx_v_nodes;
  long __pyx_v_zones;
  long __pyx_v_skims;
  __Pyx_memviewslice __pyx_v_node_skims = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_pred = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_conn = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_graph_costs = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_reached_first = { 0, 0, { 0 }, { 0 }, { 0 } };
  long __pyx_v_found;
  __Pyx_memviewslice __pyx_v_final_skims = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("skim_multiple_fields (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_origin,&__pyx_n_s_nodes,&__pyx_n_s_zones,&__pyx_n_s_skims,&__pyx_n_s_node_skims,&__pyx_n_s_pred,&__pyx_n_s_conn,&__pyx_n_s_graph_costs,&__pyx_n_s_reached_first,&__pyx_n_s_found,&__pyx_n_s_final_skims,0};
    PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_origin)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_nodes)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("skim_multiple_fields", 1, 11, 11, 1); __PYX_ERR(0, 204, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_zones)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("skim_multiple_fields", 1, 11, 11, 2); __PYX_ERR(0, 204, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_skims)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("skim_multiple_fields", 1, 11, 11, 3); __PYX_ERR(0, 204, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_node_skims)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("skim_multiple_fields", 1, 11, 11, 4); __PYX_ERR(0, 204, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pred)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("skim_multiple_fields", 1, 11, 11, 5); __PYX_ERR(0, 204, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_conn)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("skim_multiple_fields", 1, 11, 11, 6); __PYX_ERR(0, 204, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_graph_costs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("skim_multiple_fields", 1, 11, 11, 7); __PYX_ERR(0, 204, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_reached_first)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("skim_multiple_fields", 1, 11, 11, 8); __PYX_ERR(0, 204, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_found)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("skim_multiple_fields", 1, 11, 11, 9); __PYX_ERR(0, 204, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (likely((values[10] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_final_skims)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("skim_multiple_fields", 1, 11, 11, 10); __PYX_ERR(0, 204, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "skim_multiple_fields") < 0)) __PYX_ERR(0, 204, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 11) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
      values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
      values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
      values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
      values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
      values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
      values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
    }
    __pyx_v_origin = __Pyx_PyInt_As_long(values[0]); if (unlikely((__pyx_v_origin == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 204, __pyx_L3_error)
    __pyx_v_nodes = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v_nodes == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 205, __pyx_L3_error)
    __pyx_v_zones = __Pyx_PyInt_As_long(values[2]); if (unlikely((__pyx_v_zones == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 206, __pyx_L3_error)
    __pyx_v_skims = __Pyx_PyInt_As_long(values[3]); if (unlikely((__pyx_v_skims == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 207, __pyx_L3_error)
    __pyx_v_node_skims = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_node_skims.memview)) __PYX_ERR(0, 208, __pyx_L3_error)
    __pyx_v_pred = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_pred.memview)) __PYX_ERR(0, 209, __pyx_L3_error)
    __pyx_v_conn = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_conn.memview)) __PYX_ERR(0, 210, __pyx_L3_error)
    __pyx_v_graph_costs = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_graph_costs.memview)) __PYX_ERR(0, 211, __pyx_L3_error)
    __pyx_v_reached_first = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[8], PyBUF_WRITABLE); if (unlikely(!__pyx_v_reached_first.memview)) __PYX_ERR(0, 212, __pyx_L3_error)
    __pyx_v_found = __Pyx_PyInt_As_long(values[9]); if (unlikely((__pyx_v_found == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 213, __pyx_L3_error)
    __pyx_v_final_skims = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[10], PyBUF_WRITABLE); if (unlikely(!__pyx_v_final_skims.memview)) __PYX_ERR(0, 214, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("skim_multiple_fields", 1, 11, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 204, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("AoN.skim_multiple_fields", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_3AoN_6skim_multiple_fields(__pyx_self, __pyx_v_origin, __pyx_v_nodes, __pyx_v_zones, __pyx_v_skims, __pyx_v_node_skims, __pyx_v_pred, __pyx_v_conn, __pyx_v_graph_costs, __pyx_v_reached_first, __pyx_v_found, __pyx_v_final_skims);

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

static PyObject *__pyx_pf_3AoN_6skim_multiple_fields(CYTHON_UNUSED PyObject *__pyx_self, long __pyx_v_origin, long __pyx_v_nodes, long __pyx_v_zones, long __pyx_v_skims, __Pyx_memviewslice __pyx_v_node_skims, __Pyx_memviewslice __pyx_v_pred, __Pyx_memviewslice __pyx_v_conn, __Pyx_memviewslice __pyx_v_graph_costs, __Pyx_memviewslice __pyx_v_reached_first, long __pyx_v_found, __Pyx_memviewslice __pyx_v_final_skims) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("skim_multiple_fields", 0);
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_node_skims.memview)) { __Pyx_RaiseUnboundLocalError("node_skims"); __PYX_ERR(0, 204, __pyx_L1_error) }
  if (unlikely(!__pyx_v_pred.memview)) { __Pyx_RaiseUnboundLocalError("pred"); __PYX_ERR(0, 204, __pyx_L1_error) }
  if (unlikely(!__pyx_v_conn.memview)) { __Pyx_RaiseUnboundLocalError("conn"); __PYX_ERR(0, 204, __pyx_L1_error) }
  if (unlikely(!__pyx_v_graph_costs.memview)) { __Pyx_RaiseUnboundLocalError("graph_costs"); __PYX_ERR(0, 204, __pyx_L1_error) }
  if (unlikely(!__pyx_v_reached_first.memview)) { __Pyx_RaiseUnboundLocalError("reached_first"); __PYX_ERR(0, 204, __pyx_L1_error) }
  if (unlikely(!__pyx_v_final_skims.memview)) { __Pyx_RaiseUnboundLocalError("final_skims"); __PYX_ERR(0, 204, __pyx_L1_error) }
  __pyx_t_1 = __Pyx_void_to_None(__pyx_f_3AoN_skim_multiple_fields(__pyx_v_origin, __pyx_v_nodes, __pyx_v_zones, __pyx_v_skims, __pyx_v_node_skims, __pyx_v_pred, __pyx_v_conn, __pyx_v_graph_costs, __pyx_v_reached_first, __pyx_v_found, __pyx_v_final_skims, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 204, __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("AoN.skim_multiple_fields", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_node_skims, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_pred, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_conn, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_graph_costs, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_reached_first, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_final_skims, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 205:                                 long nodes,
 206:                                 long zones,
 207:                                 long skims,
 208:                                 double[:, :] node_skims,
 209:                                 long long [:] pred,
 210:                                 long long [:] conn,
 211:                                 double[:, :] graph_costs,
 212:                                 long long [:] reached_first,
 213:                                 long found,
 214:                                 double [:,:] final_skims) nogil:
 215:     cdef long long i, node, predecessor, connector, j
 216: 
 217:     # sets all skims to infinity
+218:     for i in range(nodes):
  __pyx_t_1 = __pyx_v_nodes;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+219:         for j in range(skims):
    __pyx_t_4 = __pyx_v_skims;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
      __pyx_v_j = __pyx_t_6;
+220:             node_skims[i, j] = INFINITE
      __pyx_t_7 = __pyx_v_i;
      __pyx_t_8 = __pyx_v_j;
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_skims.data + __pyx_t_7 * __pyx_v_node_skims.strides[0]) ) + __pyx_t_8 * __pyx_v_node_skims.strides[1]) )) = __pyx_v_3AoN_INFINITE;
    }
  }
 221: 
 222:     # Zeroes the intrazonal cost
+223:     for j in range(skims):
  __pyx_t_1 = __pyx_v_skims;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_j = __pyx_t_3;
+224:             node_skims[origin, j] = 0
    __pyx_t_9 = __pyx_v_origin;
    __pyx_t_6 = __pyx_v_j;
    *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_skims.data + __pyx_t_9 * __pyx_v_node_skims.strides[0]) ) + __pyx_t_6 * __pyx_v_node_skims.strides[1]) )) = 0.0;
  }
 225: 
 226:     # Cascade skimming
+227:     for i in range(1, found + 1):
  __pyx_t_1 = (__pyx_v_found + 1);
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 1; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+228:         node = reached_first[i]
    __pyx_t_10 = __pyx_v_i;
    __pyx_v_node = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_reached_first.data + __pyx_t_10 * __pyx_v_reached_first.strides[0]) )));
 229: 
 230:         # captures how we got to that node
+231:         predecessor = pred[node]
    __pyx_t_11 = __pyx_v_node;
    __pyx_v_predecessor = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_pred.data + __pyx_t_11 * __pyx_v_pred.strides[0]) )));
+232:         connector = conn[node]
    __pyx_t_12 = __pyx_v_node;
    __pyx_v_connector = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_conn.data + __pyx_t_12 * __pyx_v_conn.strides[0]) )));
 233: 
+234:         for j in range(skims):
    __pyx_t_4 = __pyx_v_skims;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_5; __pyx_t_13+=1) {
      __pyx_v_j = __pyx_t_13;
+235:             node_skims[node, j] = node_skims[predecessor, j] + graph_costs[connector, j]
      __pyx_t_14 = __pyx_v_predecessor;
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_16 = __pyx_v_connector;
      __pyx_t_17 = __pyx_v_j;
      __pyx_t_18 = __pyx_v_node;
      __pyx_t_19 = __pyx_v_j;
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_skims.data + __pyx_t_18 * __pyx_v_node_skims.strides[0]) ) + __pyx_t_19 * __pyx_v_node_skims.strides[1]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_skims.data + __pyx_t_14 * __pyx_v_node_skims.strides[0]) ) + __pyx_t_15 * __pyx_v_node_skims.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_graph_costs.data + __pyx_t_16 * __pyx_v_graph_costs.strides[0]) ) + __pyx_t_17 * __pyx_v_graph_costs.strides[1]) ))));
    }
  }
 236: 
+237:     for i in range(zones):
  __pyx_t_1 = __pyx_v_zones;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+238:         for j in range(skims):
    __pyx_t_4 = __pyx_v_skims;
    __pyx_t_5 = __pyx_t_4;
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_5; __pyx_t_13+=1) {
      __pyx_v_j = __pyx_t_13;
+239:             final_skims[i, j] = node_skims[i, j]
      __pyx_t_20 = __pyx_v_i;
      __pyx_t_21 = __pyx_v_j;
      __pyx_t_22 = __pyx_v_i;
      __pyx_t_23 = __pyx_v_j;
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_final_skims.data + __pyx_t_22 * __pyx_v_final_skims.strides[0]) ) + __pyx_t_23 * __pyx_v_final_skims.strides[1]) )) = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_node_skims.data + __pyx_t_20 * __pyx_v_node_skims.strides[0]) ) + __pyx_t_21 * __pyx_v_node_skims.strides[1]) )));
    }
  }
 240: 
 241: 
 242: # ###########################################################################################################################
 243: #############################################################################################################################
 244: #Original Dijkstra implementation by Jake Vanderplas, taken from SciPy V0.11
 245: #The old Pyrex syntax for loops was replaced with Python syntax
 246: #Old Numpy Buffers were replaces with latest memory views interface to allow for the release of the GIL
 247: # Path tracking arrays and skim arrays were also added to it
 248: #############################################################################################################################
 249: # ###########################################################################################################################
 250: 
 251: @cython.wraparound(False)
 252: @cython.embedsignature(True)
 253: @cython.boundscheck(False) # turn of bounds-checking for entire function
+254: cpdef int path_finding(long origin,
static PyObject *__pyx_pw_3AoN_9path_finding(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_f_3AoN_path_finding(long __pyx_v_origin, __Pyx_memviewslice __pyx_v_graph_costs, __Pyx_memviewslice __pyx_v_csr_indices, __Pyx_memviewslice __pyx_v_graph_fs, __Pyx_memviewslice __pyx_v_pred, __Pyx_memviewslice __pyx_v_ids, __Pyx_memviewslice __pyx_v_connectors, __Pyx_memviewslice __pyx_v_reached_first, CYTHON_UNUSED int __pyx_skip_dispatch) {
  unsigned int __pyx_v_N;
  unsigned int __pyx_v_M;
  long __pyx_v_i;
  long __pyx_v_k;
  long __pyx_v_j_source;
  long __pyx_v_j_current;
  __pyx_t_3AoN_ITYPE_t __pyx_v_found;
  long __pyx_v_j;
  __pyx_t_3AoN_DTYPE_t __pyx_v_weight;
  struct __pyx_t_3AoN_FibonacciHeap __pyx_v_heap;
  struct __pyx_t_3AoN_FibonacciNode *__pyx_v_v;
  struct __pyx_t_3AoN_FibonacciNode *__pyx_v_current_node;
  struct __pyx_t_3AoN_FibonacciNode *__pyx_v_nodes;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_3AoN_9path_finding(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_3AoN_8path_finding[] = "path_finding(long origin, double[:] graph_costs, long long[:] csr_indices, long long[:] graph_fs, long long[:] pred, long long[:] ids, long long[:] connectors, long long[:] reached_first) -> int";
static PyObject *__pyx_pw_3AoN_9path_finding(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  long __pyx_v_origin;
  __Pyx_memviewslice __pyx_v_graph_costs = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_csr_indices = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_graph_fs = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_pred = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_ids = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_connectors = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_reached_first = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("path_finding (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_origin,&__pyx_n_s_graph_costs,&__pyx_n_s_csr_indices,&__pyx_n_s_graph_fs,&__pyx_n_s_pred,&__pyx_n_s_ids,&__pyx_n_s_connectors,&__pyx_n_s_reached_first,0};
    PyObject* values[8] = {0,0,0,0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_origin)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_graph_costs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("path_finding", 1, 8, 8, 1); __PYX_ERR(0, 254, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_csr_indices)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("path_finding", 1, 8, 8, 2); __PYX_ERR(0, 254, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_graph_fs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("path_finding", 1, 8, 8, 3); __PYX_ERR(0, 254, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pred)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("path_finding", 1, 8, 8, 4); __PYX_ERR(0, 254, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_ids)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("path_finding", 1, 8, 8, 5); __PYX_ERR(0, 254, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_connectors)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("path_finding", 1, 8, 8, 6); __PYX_ERR(0, 254, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_reached_first)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("path_finding", 1, 8, 8, 7); __PYX_ERR(0, 254, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "path_finding") < 0)) __PYX_ERR(0, 254, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 8) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
      values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
      values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
      values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
    }
    __pyx_v_origin = __Pyx_PyInt_As_long(values[0]); if (unlikely((__pyx_v_origin == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 254, __pyx_L3_error)
    __pyx_v_graph_costs = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_graph_costs.memview)) __PYX_ERR(0, 255, __pyx_L3_error)
    __pyx_v_csr_indices = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_csr_indices.memview)) __PYX_ERR(0, 256, __pyx_L3_error)
    __pyx_v_graph_fs = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_graph_fs.memview)) __PYX_ERR(0, 257, __pyx_L3_error)
    __pyx_v_pred = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_pred.memview)) __PYX_ERR(0, 258, __pyx_L3_error)
    __pyx_v_ids = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_ids.memview)) __PYX_ERR(0, 259, __pyx_L3_error)
    __pyx_v_connectors = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[6], PyBUF_WRITABLE); if (unlikely(!__pyx_v_connectors.memview)) __PYX_ERR(0, 260, __pyx_L3_error)
    __pyx_v_reached_first = __Pyx_PyObject_to_MemoryviewSlice_ds_PY_LONG_LONG(values[7], PyBUF_WRITABLE); if (unlikely(!__pyx_v_reached_first.memview)) __PYX_ERR(0, 261, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("path_finding", 1, 8, 8, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 254, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("AoN.path_finding", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_3AoN_8path_finding(__pyx_self, __pyx_v_origin, __pyx_v_graph_costs, __pyx_v_csr_indices, __pyx_v_graph_fs, __pyx_v_pred, __pyx_v_ids, __pyx_v_connectors, __pyx_v_reached_first);

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

static PyObject *__pyx_pf_3AoN_8path_finding(CYTHON_UNUSED PyObject *__pyx_self, long __pyx_v_origin, __Pyx_memviewslice __pyx_v_graph_costs, __Pyx_memviewslice __pyx_v_csr_indices, __Pyx_memviewslice __pyx_v_graph_fs, __Pyx_memviewslice __pyx_v_pred, __Pyx_memviewslice __pyx_v_ids, __Pyx_memviewslice __pyx_v_connectors, __Pyx_memviewslice __pyx_v_reached_first) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("path_finding", 0);
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_v_graph_costs.memview)) { __Pyx_RaiseUnboundLocalError("graph_costs"); __PYX_ERR(0, 254, __pyx_L1_error) }
  if (unlikely(!__pyx_v_csr_indices.memview)) { __Pyx_RaiseUnboundLocalError("csr_indices"); __PYX_ERR(0, 254, __pyx_L1_error) }
  if (unlikely(!__pyx_v_graph_fs.memview)) { __Pyx_RaiseUnboundLocalError("graph_fs"); __PYX_ERR(0, 254, __pyx_L1_error) }
  if (unlikely(!__pyx_v_pred.memview)) { __Pyx_RaiseUnboundLocalError("pred"); __PYX_ERR(0, 254, __pyx_L1_error) }
  if (unlikely(!__pyx_v_ids.memview)) { __Pyx_RaiseUnboundLocalError("ids"); __PYX_ERR(0, 254, __pyx_L1_error) }
  if (unlikely(!__pyx_v_connectors.memview)) { __Pyx_RaiseUnboundLocalError("connectors"); __PYX_ERR(0, 254, __pyx_L1_error) }
  if (unlikely(!__pyx_v_reached_first.memview)) { __Pyx_RaiseUnboundLocalError("reached_first"); __PYX_ERR(0, 254, __pyx_L1_error) }
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_f_3AoN_path_finding(__pyx_v_origin, __pyx_v_graph_costs, __pyx_v_csr_indices, __pyx_v_graph_fs, __pyx_v_pred, __pyx_v_ids, __pyx_v_connectors, __pyx_v_reached_first, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 254, __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("AoN.path_finding", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_graph_costs, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_csr_indices, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_graph_fs, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_pred, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_ids, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_connectors, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_reached_first, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 255:                        double[:] graph_costs,
 256:                        long long [:] csr_indices,
 257:                        long long [:] graph_fs,
 258:                        long long [:] pred,
 259:                        long long [:] ids,
 260:                        long long [:] connectors,
 261:                        long long [:] reached_first) nogil:
 262: 
+263:     cdef unsigned int N = graph_costs.shape[0]
  __pyx_v_N = (__pyx_v_graph_costs.shape[0]);
+264:     cdef unsigned int M = pred.shape[0]
  __pyx_v_M = (__pyx_v_pred.shape[0]);
 265: 
 266:     cdef long i, k, j_source, j_current
+267:     cdef ITYPE_t found = 0
  __pyx_v_found = 0;
 268:     cdef long j
 269:     cdef DTYPE_t weight
 270: 
 271:     cdef FibonacciHeap heap
 272:     cdef FibonacciNode *v
 273:     cdef FibonacciNode *current_node
+274:     cdef FibonacciNode *nodes = <FibonacciNode*> malloc(N * sizeof(FibonacciNode))
  __pyx_v_nodes = ((struct __pyx_t_3AoN_FibonacciNode *)malloc((__pyx_v_N * (sizeof(struct __pyx_t_3AoN_FibonacciNode)))));
 275: 
+276:     for i in range(M):
  __pyx_t_1 = __pyx_v_M;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+277:         pred[i] = -1
    __pyx_t_4 = __pyx_v_i;
    *((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_pred.data + __pyx_t_4 * __pyx_v_pred.strides[0]) )) = -1LL;
+278:         connectors[i] = -1
    __pyx_t_5 = __pyx_v_i;
    *((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_connectors.data + __pyx_t_5 * __pyx_v_connectors.strides[0]) )) = -1LL;
  }
 279: 
+280:     j_source = origin
  __pyx_v_j_source = __pyx_v_origin;
+281:     for k in range(N):
  __pyx_t_1 = __pyx_v_N;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_k = __pyx_t_3;
+282:         initialize_node(&nodes[k], k)
    __pyx_f_3AoN_initialize_node((&(__pyx_v_nodes[__pyx_v_k])), __pyx_v_k, NULL);
  }
 283: 
+284:     heap.min_node = NULL
  __pyx_v_heap.min_node = NULL;
+285:     insert_node(&heap, &nodes[j_source])
  __pyx_f_3AoN_insert_node((&__pyx_v_heap), (&(__pyx_v_nodes[__pyx_v_j_source])));
 286: 
+287:     while heap.min_node:
  while (1) {
    __pyx_t_6 = (__pyx_v_heap.min_node != 0);
    if (!__pyx_t_6) break;
+288:         v = remove_min(&heap)
    __pyx_v_v = __pyx_f_3AoN_remove_min((&__pyx_v_heap));
+289:         reached_first[found] = v.index
    __pyx_t_7 = __pyx_v_v->index;
    __pyx_t_8 = __pyx_v_found;
    *((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_reached_first.data + __pyx_t_8 * __pyx_v_reached_first.strides[0]) )) = __pyx_t_7;
+290:         found += 1
    __pyx_v_found = (__pyx_v_found + 1);
+291:         v.state = 1
    __pyx_v_v->state = 1;
 292: 
+293:         for j in range(graph_fs[v.index],graph_fs[v.index + 1]):
    __pyx_t_7 = (__pyx_v_v->index + 1);
    __pyx_t_9 = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_graph_fs.data + __pyx_t_7 * __pyx_v_graph_fs.strides[0]) )));
    __pyx_t_10 = __pyx_v_v->index;
    __pyx_t_11 = __pyx_t_9;
    for (__pyx_t_3 = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_graph_fs.data + __pyx_t_10 * __pyx_v_graph_fs.strides[0]) ))); __pyx_t_3 < __pyx_t_11; __pyx_t_3+=1) {
      __pyx_v_j = __pyx_t_3;
+294:             j_current = csr_indices[j]
      __pyx_t_12 = __pyx_v_j;
      __pyx_v_j_current = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_csr_indices.data + __pyx_t_12 * __pyx_v_csr_indices.strides[0]) )));
+295:             current_node = &nodes[j_current]
      __pyx_v_current_node = (&(__pyx_v_nodes[__pyx_v_j_current]));
 296: 
+297:             if current_node.state != 1:
      __pyx_t_6 = ((__pyx_v_current_node->state != 1) != 0);
      if (__pyx_t_6) {
/* … */
      }
    }
  }
+298:                 weight = graph_costs[j]
        __pyx_t_13 = __pyx_v_j;
        __pyx_v_weight = (*((double *) ( /* dim=0 */ (__pyx_v_graph_costs.data + __pyx_t_13 * __pyx_v_graph_costs.strides[0]) )));
+299:                 if current_node.state == 2:
        __pyx_t_6 = ((__pyx_v_current_node->state == 2) != 0);
        if (__pyx_t_6) {
/* … */
          goto __pyx_L12;
        }
+300:                     current_node.state = 3
          __pyx_v_current_node->state = 3;
+301:                     current_node.val = v.val + weight
          __pyx_v_current_node->val = (__pyx_v_v->val + __pyx_v_weight);
+302:                     insert_node(&heap, current_node)
          __pyx_f_3AoN_insert_node((&__pyx_v_heap), __pyx_v_current_node);
+303:                     pred[j_current] = v.index
          __pyx_t_14 = __pyx_v_v->index;
          __pyx_t_15 = __pyx_v_j_current;
          *((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_pred.data + __pyx_t_15 * __pyx_v_pred.strides[0]) )) = __pyx_t_14;
+304:                     connectors[j_current] = ids[j]
          __pyx_t_16 = __pyx_v_j;
          __pyx_t_17 = __pyx_v_j_current;
          *((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_connectors.data + __pyx_t_17 * __pyx_v_connectors.strides[0]) )) = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_ids.data + __pyx_t_16 * __pyx_v_ids.strides[0]) )));
 305: 
+306:                 elif current_node.val > v.val + weight:
        __pyx_t_6 = ((__pyx_v_current_node->val > (__pyx_v_v->val + __pyx_v_weight)) != 0);
        if (__pyx_t_6) {
/* … */
        }
        __pyx_L12:;
+307:                     decrease_val(&heap, current_node, v.val + weight)
          __pyx_f_3AoN_decrease_val((&__pyx_v_heap), __pyx_v_current_node, (__pyx_v_v->val + __pyx_v_weight));
+308:                     pred[j_current] = v.index
          __pyx_t_14 = __pyx_v_v->index;
          __pyx_t_18 = __pyx_v_j_current;
          *((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_pred.data + __pyx_t_18 * __pyx_v_pred.strides[0]) )) = __pyx_t_14;
 309:                     #The link that took us to such node
+310:                     connectors[j_current] = ids[j]
          __pyx_t_19 = __pyx_v_j;
          __pyx_t_20 = __pyx_v_j_current;
          *((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_connectors.data + __pyx_t_20 * __pyx_v_connectors.strides[0]) )) = (*((PY_LONG_LONG *) ( /* dim=0 */ (__pyx_v_ids.data + __pyx_t_19 * __pyx_v_ids.strides[0]) )));
 311: 
+312:     free(nodes)
  free(__pyx_v_nodes);
+313:     return found -1
  __pyx_r = (__pyx_v_found - 1);
  goto __pyx_L0;
 314: 
 315: ######################################################################
 316: # FibonacciNode structure
 317: #  This structure and the operations on it are the nodes of the
 318: #  Fibonacci heap.
 319: 
 320: #cdef enum FibonacciState:
 321: #    SCANNED=1
 322: #    NOT_IN_HEAP=2
 323: #    IN_HEAP=3
 324: 
+325: cdef struct FibonacciNode:
struct __pyx_t_3AoN_FibonacciNode {
  __pyx_t_3AoN_ITYPE_t index;
  unsigned int rank;
  unsigned int state;
  __pyx_t_3AoN_DTYPE_t val;
  struct __pyx_t_3AoN_FibonacciNode *parent;
  struct __pyx_t_3AoN_FibonacciNode *left_sibling;
  struct __pyx_t_3AoN_FibonacciNode *right_sibling;
  struct __pyx_t_3AoN_FibonacciNode *children;
};
 326:     ITYPE_t index
 327:     unsigned int rank
 328:     #FibonacciState state
 329:     unsigned int state
 330:     DTYPE_t val
 331:     FibonacciNode* parent
 332:     FibonacciNode* left_sibling
 333:     FibonacciNode* right_sibling
 334:     FibonacciNode* children
 335: 
+336: cdef void initialize_node(FibonacciNode* node,
static void __pyx_f_3AoN_initialize_node(struct __pyx_t_3AoN_FibonacciNode *__pyx_v_node, unsigned int __pyx_v_index, struct __pyx_opt_args_3AoN_initialize_node *__pyx_optional_args) {
  double __pyx_v_val = ((double)0.0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_val = __pyx_optional_args->val;
    }
  }
/* … */
  /* function exit code */
}
/* … */
struct __pyx_opt_args_3AoN_initialize_node {
  int __pyx_n;
  double val;
};
 337:                           unsigned int index,
 338:                           double val=0) nogil:
 339:     # Assumptions: - node is a valid pointer
 340:     #              - node is not currently part of a heap
+341:     node.index = index
  __pyx_v_node->index = __pyx_v_index;
+342:     node.val = val
  __pyx_v_node->val = __pyx_v_val;
+343:     node.rank = 0
  __pyx_v_node->rank = 0;
+344:     node.state = 2
  __pyx_v_node->state = 2;
+345:     node.parent = NULL
  __pyx_v_node->parent = NULL;
+346:     node.left_sibling = NULL
  __pyx_v_node->left_sibling = NULL;
+347:     node.right_sibling = NULL
  __pyx_v_node->right_sibling = NULL;
+348:     node.children = NULL
  __pyx_v_node->children = NULL;
 349: 
+350: cdef FibonacciNode* rightmost_sibling(FibonacciNode* node) nogil:
static struct __pyx_t_3AoN_FibonacciNode *__pyx_f_3AoN_rightmost_sibling(struct __pyx_t_3AoN_FibonacciNode *__pyx_v_node) {
  struct __pyx_t_3AoN_FibonacciNode *__pyx_v_temp;
  struct __pyx_t_3AoN_FibonacciNode *__pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 351:     # Assumptions: - node is a valid pointer
+352:     cdef FibonacciNode* temp = node
  __pyx_v_temp = __pyx_v_node;
+353:     while(temp.right_sibling):
  while (1) {
    __pyx_t_1 = (__pyx_v_temp->right_sibling != 0);
    if (!__pyx_t_1) break;
+354:         temp = temp.right_sibling
    __pyx_t_2 = __pyx_v_temp->right_sibling;
    __pyx_v_temp = __pyx_t_2;
  }
+355:     return temp
  __pyx_r = __pyx_v_temp;
  goto __pyx_L0;
 356: 
+357: cdef FibonacciNode* leftmost_sibling(FibonacciNode* node) nogil:
static struct __pyx_t_3AoN_FibonacciNode *__pyx_f_3AoN_leftmost_sibling(struct __pyx_t_3AoN_FibonacciNode *__pyx_v_node) {
  struct __pyx_t_3AoN_FibonacciNode *__pyx_v_temp;
  struct __pyx_t_3AoN_FibonacciNode *__pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 358:     # Assumptions: - node is a valid pointer
+359:     cdef FibonacciNode* temp = node
  __pyx_v_temp = __pyx_v_node;
+360:     while(temp.left_sibling):
  while (1) {
    __pyx_t_1 = (__pyx_v_temp->left_sibling != 0);
    if (!__pyx_t_1) break;
+361:         temp = temp.left_sibling
    __pyx_t_2 = __pyx_v_temp->left_sibling;
    __pyx_v_temp = __pyx_t_2;
  }
+362:     return temp
  __pyx_r = __pyx_v_temp;
  goto __pyx_L0;
 363: 
+364: cdef void add_child(FibonacciNode* node, FibonacciNode* new_child) nogil:
static void __pyx_f_3AoN_add_child(struct __pyx_t_3AoN_FibonacciNode *__pyx_v_node, struct __pyx_t_3AoN_FibonacciNode *__pyx_v_new_child) {
/* … */
  /* function exit code */
}
 365:     # Assumptions: - node is a valid pointer
 366:     #              - new_child is a valid pointer
 367:     #              - new_child is not the sibling or child of another node
+368:     new_child.parent = node
  __pyx_v_new_child->parent = __pyx_v_node;
 369: 
+370:     if node.children:
  __pyx_t_1 = (__pyx_v_node->children != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+371:         add_sibling(node.children, new_child)
    __pyx_f_3AoN_add_sibling(__pyx_v_node->children, __pyx_v_new_child);
 372:     else:
+373:         node.children = new_child
  /*else*/ {
    __pyx_v_node->children = __pyx_v_new_child;
+374:         new_child.right_sibling = NULL
    __pyx_v_new_child->right_sibling = NULL;
+375:         new_child.left_sibling = NULL
    __pyx_v_new_child->left_sibling = NULL;
+376:         node.rank = 1
    __pyx_v_node->rank = 1;
  }
  __pyx_L3:;
 377: 
+378: cdef void add_sibling(FibonacciNode* node, FibonacciNode* new_sibling) nogil:
static void __pyx_f_3AoN_add_sibling(struct __pyx_t_3AoN_FibonacciNode *__pyx_v_node, struct __pyx_t_3AoN_FibonacciNode *__pyx_v_new_sibling) {
  struct __pyx_t_3AoN_FibonacciNode *__pyx_v_temp;
/* … */
  /* function exit code */
}
 379:     # Assumptions: - node is a valid pointer
 380:     #              - new_sibling is a valid pointer
 381:     #              - new_sibling is not the child or sibling of another node
+382:     cdef FibonacciNode* temp = rightmost_sibling(node)
  __pyx_v_temp = __pyx_f_3AoN_rightmost_sibling(__pyx_v_node);
+383:     temp.right_sibling = new_sibling
  __pyx_v_temp->right_sibling = __pyx_v_new_sibling;
+384:     new_sibling.left_sibling = temp
  __pyx_v_new_sibling->left_sibling = __pyx_v_temp;
+385:     new_sibling.right_sibling = NULL
  __pyx_v_new_sibling->right_sibling = NULL;
+386:     new_sibling.parent = node.parent
  __pyx_t_1 = __pyx_v_node->parent;
  __pyx_v_new_sibling->parent = __pyx_t_1;
+387:     if new_sibling.parent:
  __pyx_t_2 = (__pyx_v_new_sibling->parent != 0);
  if (__pyx_t_2) {
/* … */
  }
+388:         new_sibling.parent.rank += 1
    __pyx_v_new_sibling->parent->rank = (__pyx_v_new_sibling->parent->rank + 1);
 389: 
+390: cdef void remove(FibonacciNode* node) nogil:
static void __pyx_f_3AoN_remove(struct __pyx_t_3AoN_FibonacciNode *__pyx_v_node) {
/* … */
  /* function exit code */
}
 391:     # Assumptions: - node is a valid pointer
+392:     if node.parent:
  __pyx_t_1 = (__pyx_v_node->parent != 0);
  if (__pyx_t_1) {
/* … */
  }
+393:         node.parent.rank -= 1
    __pyx_v_node->parent->rank = (__pyx_v_node->parent->rank - 1);
+394:         if node.left_sibling:
    __pyx_t_1 = (__pyx_v_node->left_sibling != 0);
    if (__pyx_t_1) {
/* … */
      goto __pyx_L4;
    }
+395:             node.parent.children = node.left_sibling
      __pyx_t_2 = __pyx_v_node->left_sibling;
      __pyx_v_node->parent->children = __pyx_t_2;
+396:         elif node.right_sibling:
    __pyx_t_1 = (__pyx_v_node->right_sibling != 0);
    if (__pyx_t_1) {
/* … */
      goto __pyx_L4;
    }
+397:             node.parent.children = node.right_sibling
      __pyx_t_2 = __pyx_v_node->right_sibling;
      __pyx_v_node->parent->children = __pyx_t_2;
 398:         else:
+399:             node.parent.children = NULL
    /*else*/ {
      __pyx_v_node->parent->children = NULL;
    }
    __pyx_L4:;
 400: 
+401:     if node.left_sibling:
  __pyx_t_1 = (__pyx_v_node->left_sibling != 0);
  if (__pyx_t_1) {
/* … */
  }
+402:         node.left_sibling.right_sibling = node.right_sibling
    __pyx_t_2 = __pyx_v_node->right_sibling;
    __pyx_v_node->left_sibling->right_sibling = __pyx_t_2;
+403:     if node.right_sibling:
  __pyx_t_1 = (__pyx_v_node->right_sibling != 0);
  if (__pyx_t_1) {
/* … */
  }
+404:         node.right_sibling.left_sibling = node.left_sibling
    __pyx_t_2 = __pyx_v_node->left_sibling;
    __pyx_v_node->right_sibling->left_sibling = __pyx_t_2;
 405: 
+406:     node.left_sibling = NULL
  __pyx_v_node->left_sibling = NULL;
+407:     node.right_sibling = NULL
  __pyx_v_node->right_sibling = NULL;
+408:     node.parent = NULL
  __pyx_v_node->parent = NULL;
 409: 
 410: 
 411: ######################################################################
 412: # FibonacciHeap structure
 413: #  This structure and operations on it use the FibonacciNode
 414: #  routines to implement a Fibonacci heap
 415: 
+416: ctypedef FibonacciNode* pFibonacciNode
typedef struct __pyx_t_3AoN_FibonacciNode *__pyx_t_3AoN_pFibonacciNode;
 417: 
+418: cdef struct FibonacciHeap:
struct __pyx_t_3AoN_FibonacciHeap {
  struct __pyx_t_3AoN_FibonacciNode *min_node;
  __pyx_t_3AoN_pFibonacciNode roots_by_rank[0x64];
};
 419:     FibonacciNode* min_node
 420:     pFibonacciNode[100] roots_by_rank  # maximum number of nodes is ~2^100.
 421: 
+422: cdef void insert_node(FibonacciHeap* heap,
static void __pyx_f_3AoN_insert_node(struct __pyx_t_3AoN_FibonacciHeap *__pyx_v_heap, struct __pyx_t_3AoN_FibonacciNode *__pyx_v_node) {
/* … */
  /* function exit code */
}
 423:                       FibonacciNode* node) nogil:
 424:     # Assumptions: - heap is a valid pointer
 425:     #              - node is a valid pointer
 426:     #              - node is not the child or sibling of another node
+427:     if heap.min_node:
  __pyx_t_1 = (__pyx_v_heap->min_node != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+428:         add_sibling(heap.min_node, node)
    __pyx_f_3AoN_add_sibling(__pyx_v_heap->min_node, __pyx_v_node);
+429:         if node.val < heap.min_node.val:
    __pyx_t_1 = ((__pyx_v_node->val < __pyx_v_heap->min_node->val) != 0);
    if (__pyx_t_1) {
/* … */
    }
+430:             heap.min_node = node
      __pyx_v_heap->min_node = __pyx_v_node;
 431:     else:
+432:         heap.min_node = node
  /*else*/ {
    __pyx_v_heap->min_node = __pyx_v_node;
  }
  __pyx_L3:;
 433: 
+434: cdef void decrease_val(FibonacciHeap* heap,
static void __pyx_f_3AoN_decrease_val(struct __pyx_t_3AoN_FibonacciHeap *__pyx_v_heap, struct __pyx_t_3AoN_FibonacciNode *__pyx_v_node, __pyx_t_3AoN_DTYPE_t __pyx_v_newval) {
/* … */
  /* function exit code */
}
 435:                        FibonacciNode* node,
 436:                        DTYPE_t newval) nogil:
 437:     # Assumptions: - heap is a valid pointer
 438:     #              - newval <= node.val
 439:     #              - node is a valid pointer
 440:     #              - node is not the child or sibling of another node
 441:     #              - node is in the heap
+442:     node.val = newval
  __pyx_v_node->val = __pyx_v_newval;
+443:     if node.parent and (node.parent.val >= newval):
  __pyx_t_2 = (__pyx_v_node->parent != 0);
  if (__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_node->parent->val >= __pyx_v_newval) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+444:         remove(node)
    __pyx_f_3AoN_remove(__pyx_v_node);
+445:         insert_node(heap, node)
    __pyx_f_3AoN_insert_node(__pyx_v_heap, __pyx_v_node);
+446:     elif heap.min_node.val > node.val:
  __pyx_t_1 = ((__pyx_v_heap->min_node->val > __pyx_v_node->val) != 0);
  if (__pyx_t_1) {
/* … */
  }
  __pyx_L3:;
+447:         heap.min_node = node
    __pyx_v_heap->min_node = __pyx_v_node;
 448: 
+449: cdef void link(FibonacciHeap* heap, FibonacciNode* node) nogil:
static void __pyx_f_3AoN_link(struct __pyx_t_3AoN_FibonacciHeap *__pyx_v_heap, struct __pyx_t_3AoN_FibonacciNode *__pyx_v_node) {
  struct __pyx_t_3AoN_FibonacciNode *__pyx_v_linknode;
/* … */
  /* function exit code */
}
 450:     # Assumptions: - heap is a valid pointer
 451:     #              - node is a valid pointer
 452:     #              - node is already within heap
 453: 
 454:     cdef FibonacciNode *linknode
 455:     cdef FibonacciNode *parent
 456:     cdef FibonacciNode *child
 457: 
+458:     if heap.roots_by_rank[node.rank] == NULL:
  __pyx_t_1 = (((__pyx_v_heap->roots_by_rank[__pyx_v_node->rank]) == NULL) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+459:         heap.roots_by_rank[node.rank] = node
    (__pyx_v_heap->roots_by_rank[__pyx_v_node->rank]) = __pyx_v_node;
 460:     else:
+461:         linknode = heap.roots_by_rank[node.rank]
  /*else*/ {
    __pyx_v_linknode = (__pyx_v_heap->roots_by_rank[__pyx_v_node->rank]);
+462:         heap.roots_by_rank[node.rank] = NULL
    (__pyx_v_heap->roots_by_rank[__pyx_v_node->rank]) = NULL;
 463: 
+464:         if node.val < linknode.val or node == heap.min_node:
    __pyx_t_2 = ((__pyx_v_node->val < __pyx_v_linknode->val) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_1 = __pyx_t_2;
      goto __pyx_L5_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_node == __pyx_v_heap->min_node) != 0);
    __pyx_t_1 = __pyx_t_2;
    __pyx_L5_bool_binop_done:;
    if (__pyx_t_1) {
/* … */
      goto __pyx_L4;
    }
+465:             remove(linknode)
      __pyx_f_3AoN_remove(__pyx_v_linknode);
+466:             add_child(node, linknode)
      __pyx_f_3AoN_add_child(__pyx_v_node, __pyx_v_linknode);
+467:             link(heap, node)
      __pyx_f_3AoN_link(__pyx_v_heap, __pyx_v_node);
 468:         else:
+469:             remove(node)
    /*else*/ {
      __pyx_f_3AoN_remove(__pyx_v_node);
+470:             add_child(linknode, node)
      __pyx_f_3AoN_add_child(__pyx_v_linknode, __pyx_v_node);
+471:             link(heap, linknode)
      __pyx_f_3AoN_link(__pyx_v_heap, __pyx_v_linknode);
    }
    __pyx_L4:;
  }
  __pyx_L3:;
 472: 
 473: @cython.wraparound(False)
 474: @cython.embedsignature(True)
 475: @cython.boundscheck(False) # turn of bounds-checking for entire function
+476: cdef FibonacciNode* remove_min(FibonacciHeap* heap) nogil:
static struct __pyx_t_3AoN_FibonacciNode *__pyx_f_3AoN_remove_min(struct __pyx_t_3AoN_FibonacciHeap *__pyx_v_heap) {
  struct __pyx_t_3AoN_FibonacciNode *__pyx_v_temp;
  struct __pyx_t_3AoN_FibonacciNode *__pyx_v_temp_right;
  struct __pyx_t_3AoN_FibonacciNode *__pyx_v_out;
  unsigned int __pyx_v_i;
  struct __pyx_t_3AoN_FibonacciNode *__pyx_r;
/* … */
  /* function exit code */
  __pyx_L0:;
  return __pyx_r;
}
 477:     # Assumptions: - heap is a valid pointer
 478:     #              - heap.min_node is a valid pointer
 479:     cdef FibonacciNode *temp
 480:     cdef FibonacciNode *temp_right
 481:     cdef FibonacciNode *out
 482:     cdef unsigned int i
 483: 
 484:     # make all min_node children into root nodes
+485:     if heap.min_node.children:
  __pyx_t_1 = (__pyx_v_heap->min_node->children != 0);
  if (__pyx_t_1) {
/* … */
  }
+486:         temp = leftmost_sibling(heap.min_node.children)
    __pyx_v_temp = __pyx_f_3AoN_leftmost_sibling(__pyx_v_heap->min_node->children);
+487:         temp_right = NULL
    __pyx_v_temp_right = NULL;
 488: 
+489:         while temp:
    while (1) {
      __pyx_t_1 = (__pyx_v_temp != 0);
      if (!__pyx_t_1) break;
+490:             temp_right = temp.right_sibling
      __pyx_t_2 = __pyx_v_temp->right_sibling;
      __pyx_v_temp_right = __pyx_t_2;
+491:             remove(temp)
      __pyx_f_3AoN_remove(__pyx_v_temp);
+492:             add_sibling(heap.min_node, temp)
      __pyx_f_3AoN_add_sibling(__pyx_v_heap->min_node, __pyx_v_temp);
+493:             temp = temp_right
      __pyx_v_temp = __pyx_v_temp_right;
    }
 494: 
+495:         heap.min_node.children = NULL
    __pyx_v_heap->min_node->children = NULL;
 496: 
 497:     # choose a root node other than min_node
+498:     temp = leftmost_sibling(heap.min_node)
  __pyx_v_temp = __pyx_f_3AoN_leftmost_sibling(__pyx_v_heap->min_node);
+499:     if temp == heap.min_node:
  __pyx_t_1 = ((__pyx_v_temp == __pyx_v_heap->min_node) != 0);
  if (__pyx_t_1) {
/* … */
  }
+500:         if heap.min_node.right_sibling:
    __pyx_t_1 = (__pyx_v_heap->min_node->right_sibling != 0);
    if (__pyx_t_1) {
/* … */
      goto __pyx_L7;
    }
+501:             temp = heap.min_node.right_sibling
      __pyx_t_2 = __pyx_v_heap->min_node->right_sibling;
      __pyx_v_temp = __pyx_t_2;
 502:         else:
+503:             out = heap.min_node
    /*else*/ {
      __pyx_t_2 = __pyx_v_heap->min_node;
      __pyx_v_out = __pyx_t_2;
+504:             heap.min_node = NULL
      __pyx_v_heap->min_node = NULL;
+505:             return out
      __pyx_r = __pyx_v_out;
      goto __pyx_L0;
    }
    __pyx_L7:;
 506: 
 507:     # remove min_node, and point heap to the new min
+508:     out = heap.min_node
  __pyx_t_2 = __pyx_v_heap->min_node;
  __pyx_v_out = __pyx_t_2;
+509:     remove(heap.min_node)
  __pyx_f_3AoN_remove(__pyx_v_heap->min_node);
+510:     heap.min_node = temp
  __pyx_v_heap->min_node = __pyx_v_temp;
 511: 
 512:     # re-link the heap
+513:     for i in range(100):
  for (__pyx_t_3 = 0; __pyx_t_3 < 0x64; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+514:         heap.roots_by_rank[i] = NULL
    (__pyx_v_heap->roots_by_rank[__pyx_v_i]) = NULL;
  }
 515: 
+516:     while temp:
  while (1) {
    __pyx_t_1 = (__pyx_v_temp != 0);
    if (!__pyx_t_1) break;
+517:         if temp.val < heap.min_node.val:
    __pyx_t_1 = ((__pyx_v_temp->val < __pyx_v_heap->min_node->val) != 0);
    if (__pyx_t_1) {
/* … */
    }
+518:             heap.min_node = temp
      __pyx_v_heap->min_node = __pyx_v_temp;
+519:         temp_right = temp.right_sibling
    __pyx_t_2 = __pyx_v_temp->right_sibling;
    __pyx_v_temp_right = __pyx_t_2;
+520:         link(heap, temp)
    __pyx_f_3AoN_link(__pyx_v_heap, __pyx_v_temp);
+521:         temp = temp_right
    __pyx_v_temp = __pyx_v_temp_right;
  }
 522: 
+523:     return out
  __pyx_r = __pyx_v_out;
  goto __pyx_L0;