Generated by Cython 0.10 on Wed Nov 12 16:52:13 2008

Raw output: gridworld.c

 1: """
 2: Defines the `GridWorld` class.
    #if PY_MAJOR_VERSION < 3
  return;
  #else
  return __pyx_m;
  #endif
  __pyx_L1_error:;
  Py_XDECREF(__pyx_1);
  __Pyx_AddTraceback("spatial.gridworld");
  #if PY_MAJOR_VERSION >= 3
  return NULL;
  #endif
}
 3: """
 4: 
 5: # import the appropriate classes
 6: from geometry cimport Box, Point
 7: from gravity cimport setInducedGF_box_nomask_nonrandom, GravityField
 8: from numpy cimport ndarray as ar
 9: import numpy as np
    __pyx_1 = __Pyx_Import(__pyx_kp_numpy, 0); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (PyObject_SetAttr(__pyx_m, __pyx_kp_np, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_1); __pyx_1 = 0;
 10: cimport cython
 11: 
 12: ctypedef unsigned long int size_t
 13: 
struct __pyx_obj_7spatial_7gravity_GravityField {
  PyObject_HEAD
  struct __pyx_vtabstruct_7spatial_7gravity_GravityField *__pyx_vtab;
  double Txx;
  double Txy;
  double Tyy;
};

struct __pyx_vtabstruct_7spatial_7gravity_GravityField {
  void (*set)(struct __pyx_obj_7spatial_7gravity_GravityField *, float, float, float);
  void (*addTo)(struct __pyx_obj_7spatial_7gravity_GravityField *, struct __pyx_obj_7spatial_7gravity_GravityField *);
  void (*scaleBy)(struct __pyx_obj_7spatial_7gravity_GravityField *, double);
  float (*det)(struct __pyx_obj_7spatial_7gravity_GravityField *);
};
static struct __pyx_vtabstruct_7spatial_7gravity_GravityField *__pyx_vtabptr_7spatial_7gravity_GravityField;

 14: cdef extern from "math.h":
struct __pyx_obj_7spatial_8geometry_Point {
  PyObject_HEAD
  struct __pyx_vtabstruct_7spatial_8geometry_Point *__pyx_vtab;
  float x;
  float y;
  float z;
};

struct __pyx_vtabstruct_7spatial_8geometry_Point {
  void (*set)(struct __pyx_obj_7spatial_8geometry_Point *, float, float, float);
};
static struct __pyx_vtabstruct_7spatial_8geometry_Point *__pyx_vtabptr_7spatial_8geometry_Point;

 15:     float ceil(float)
 16: 
 17: ############################################################
 18: # Some low-level inline functions to make sure the indexing is
 19: # consistent
 20: 
 21: cdef inline int _idx_to_xi(int idx, int nx, int ny, int nz):
static INLINE int __pyx_f_7spatial_9gridworld__idx_to_xi(int __pyx_v_idx, int __pyx_v_nx, int __pyx_v_ny, int __pyx_v_nz) {
  int __pyx_r;

enum __pyx_t_7spatial_8geometry_GeomType {
  __pyx_e_7spatial_8geometry_null,
  __pyx_e_7spatial_8geometry_point,
  __pyx_e_7spatial_8geometry_box,
  __pyx_e_7spatial_8geometry_point_mass
};

typedef unsigned long __pyx_t_7spatial_7gravity_size_t;

typedef unsigned long __pyx_t_7spatial_9gridworld_size_t;
 22:     return idx % (ny*nz)
    __pyx_r = (__pyx_v_idx % (__pyx_v_ny * __pyx_v_nz));
  goto __pyx_L0;

  __pyx_r = 0;
  __pyx_L0:;
  return __pyx_r;
}
 23: 
 24: cdef inline int _idx_to_yi(int idx, int nx, int ny, int nz):
static INLINE int __pyx_f_7spatial_9gridworld__idx_to_yi(int __pyx_v_idx, int __pyx_v_nx, int __pyx_v_ny, int __pyx_v_nz) {
  int __pyx_r;

struct __pyx_obj_7spatial_8geometry_SpatialObject {
  PyObject_HEAD
  struct __pyx_vtabstruct_7spatial_8geometry_SpatialObject *__pyx_vtab;
  enum __pyx_t_7spatial_8geometry_GeomType gt;
  float _density;
};

struct __pyx_vtabstruct_7spatial_8geometry_SpatialObject {
  PyObject *(*_setType)(struct __pyx_obj_7spatial_8geometry_SpatialObject *, enum __pyx_t_7spatial_8geometry_GeomType);
  enum __pyx_t_7spatial_8geometry_GeomType (*gtype)(struct __pyx_obj_7spatial_8geometry_SpatialObject *, int __pyx_skip_dispatch);
  PyObject *(*setDensity)(struct __pyx_obj_7spatial_8geometry_SpatialObject *, float, int __pyx_skip_dispatch);
  void (*_setDensity)(struct __pyx_obj_7spatial_8geometry_SpatialObject *, float);
  PyArrayObject *(*sample)(struct __pyx_obj_7spatial_8geometry_SpatialObject *, __pyx_t_7spatial_8geometry_size_t, int __pyx_skip_dispatch);
  PyArrayObject *(*sample_nonrandom)(struct __pyx_obj_7spatial_8geometry_SpatialObject *, __pyx_t_7spatial_8geometry_size_t, int __pyx_skip_dispatch);
  float (*density)(struct __pyx_obj_7spatial_8geometry_SpatialObject *, int __pyx_skip_dispatch);
  float (*mass)(struct __pyx_obj_7spatial_8geometry_SpatialObject *, int __pyx_skip_dispatch);
  int (*isInside)(struct __pyx_obj_7spatial_8geometry_SpatialObject *, struct __pyx_obj_7spatial_8geometry_Point *, int __pyx_skip_dispatch);
  float (*volume)(struct __pyx_obj_7spatial_8geometry_SpatialObject *, int __pyx_skip_dispatch);
};
static struct __pyx_vtabstruct_7spatial_8geometry_SpatialObject *__pyx_vtabptr_7spatial_8geometry_SpatialObject;

 25:     return (idx / nx) % nz
    __pyx_r = ((__pyx_v_idx / __pyx_v_nx) % __pyx_v_nz);
  goto __pyx_L0;

  __pyx_r = 0;
  __pyx_L0:;
  return __pyx_r;
}
 26: 
 27: cdef inline int _idx_to_zi(int idx, int nx, int ny, int nz):
static INLINE int __pyx_f_7spatial_9gridworld__idx_to_zi(int __pyx_v_idx, int __pyx_v_nx, int __pyx_v_ny, int __pyx_v_nz) {
  int __pyx_r;
 28:     return idx / (nx*ny)
    __pyx_r = (__pyx_v_idx / (__pyx_v_nx * __pyx_v_ny));
  goto __pyx_L0;

  __pyx_r = 0;
  __pyx_L0:;
  return __pyx_r;
}
 29: 
 30: @cython.boundscheck(True)
 31: def _edges_from_center(a_o, tuple bounds = None):
static PyObject *__pyx_pf_7spatial_9gridworld__edges_from_center(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pf_7spatial_9gridworld__edges_from_center(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_a_o = 0;
  PyObject *__pyx_v_bounds = 0;
  PyArrayObject *__pyx_v_a = 0;
  PyArrayObject *__pyx_v_r = 0;
  Py_buffer __pyx_bstruct_a;
  Py_ssize_t __pyx_bstride_0_a = 0;
  Py_ssize_t __pyx_bshape_0_a = 0;
  Py_buffer __pyx_bstruct_r;
  Py_ssize_t __pyx_bstride_0_r = 0;
  Py_ssize_t __pyx_bshape_0_r = 0;
  PyObject *__pyx_r;
  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_a_o,&__pyx_kp_bounds,0};
  __pyx_self = __pyx_self;
  __pyx_v_bounds = ((PyObject *)Py_None);
  if (unlikely(__pyx_kwds)) {
    PyObject* values[2] = {0,0};
    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      case  0: break;
      default: goto __pyx_L5_argtuple_error;
    }
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  0:
      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_a_o);
      if (likely(values[0])) kw_args--;
      else goto __pyx_L5_argtuple_error;
    }
    if (unlikely(kw_args > 0)) {
      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "_edges_from_center") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
    }
    __pyx_v_a_o = values[0];
    if (values[1]) {
      __pyx_v_bounds = ((PyObject *)values[1]);
    }
  } else {
    switch (PyTuple_GET_SIZE(__pyx_args)) {
      case  2: __pyx_v_bounds = ((PyObject *)PyTuple_GET_ITEM(__pyx_args, 1));
      case  1: __pyx_v_a_o = PyTuple_GET_ITEM(__pyx_args, 0);
      break;
      default: goto __pyx_L5_argtuple_error;
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_edges_from_center", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("spatial.gridworld._edges_from_center");
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_bstruct_a.buf = NULL;
  __pyx_bstruct_r.buf = NULL;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_bounds), &PyTuple_Type, 1, "bounds", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 32: 
 33:     cdef ar[float] a = np.asarray(a_o, dtype= np.float32)
    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_asarray); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_1); __pyx_1 = 0;
  __pyx_1 = PyTuple_New(1); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_INCREF(__pyx_v_a_o);
  PyTuple_SET_ITEM(__pyx_1, 0, __pyx_v_a_o);
  __pyx_3 = PyDict_New(); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_4 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_5 = PyObject_GetAttr(__pyx_4, __pyx_kp_25); if (unlikely(!__pyx_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_4); __pyx_4 = 0;
  if (PyDict_SetItem(__pyx_3, __pyx_kp_dtype, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_5); __pyx_5 = 0;
  __pyx_4 = PyEval_CallObjectWithKeywords(__pyx_2, ((PyObject *)__pyx_1), ((PyObject *)__pyx_3)); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_2); __pyx_2 = 0;
  Py_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
  Py_DECREF(((PyObject *)__pyx_3)); __pyx_3 = 0;
  if (!(__Pyx_TypeTest(__pyx_4, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_1 = ((PyArrayObject *)__pyx_4);
  if (unlikely(__Pyx_GetBuffer_float((PyObject*)__pyx_t_1, &__pyx_bstruct_a, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0) == -1)) {
    __pyx_v_a = ((PyArrayObject *)Py_None); Py_INCREF(Py_None); __pyx_bstruct_a.buf = NULL;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  } else {__pyx_bstride_0_a = __pyx_bstruct_a.strides[0];
    __pyx_bshape_0_a = __pyx_bstruct_a.shape[0];
  }
  __pyx_t_1 = 0;
  __pyx_v_a = ((PyArrayObject *)__pyx_4);
  __pyx_4 = 0;
 34:     cdef ar[float] r = np.empty( a.size + 1, dtype=np.float32)
    __pyx_5 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_2 = PyObject_GetAttr(__pyx_5, __pyx_kp_empty); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_5); __pyx_5 = 0;
  __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_a), __pyx_kp_size); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = PyNumber_Add(__pyx_1, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_1); __pyx_1 = 0;
  __pyx_3 = PyTuple_New(1); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_4 = PyDict_New(); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_5 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_1 = PyObject_GetAttr(__pyx_5, __pyx_kp_25); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_5); __pyx_5 = 0;
  if (PyDict_SetItem(__pyx_4, __pyx_kp_dtype, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_1); __pyx_1 = 0;
  __pyx_5 = PyEval_CallObjectWithKeywords(__pyx_2, ((PyObject *)__pyx_3), ((PyObject *)__pyx_4)); if (unlikely(!__pyx_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_2); __pyx_2 = 0;
  Py_DECREF(((PyObject *)__pyx_3)); __pyx_3 = 0;
  Py_DECREF(((PyObject *)__pyx_4)); __pyx_4 = 0;
  if (!(__Pyx_TypeTest(__pyx_5, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = ((PyArrayObject *)__pyx_5);
  if (unlikely(__Pyx_GetBuffer_float((PyObject*)__pyx_t_3, &__pyx_bstruct_r, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0) == -1)) {
    __pyx_v_r = ((PyArrayObject *)Py_None); Py_INCREF(Py_None); __pyx_bstruct_r.buf = NULL;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  } else {__pyx_bstride_0_r = __pyx_bstruct_r.strides[0];
    __pyx_bshape_0_r = __pyx_bstruct_r.shape[0];
  }
  __pyx_t_3 = 0;
  __pyx_v_r = ((PyArrayObject *)__pyx_5);
  __pyx_5 = 0;
 35: 
 36:     if r.size > 2:
    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_r), __pyx_kp_size); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_2 = PyObject_RichCompare(__pyx_1, __pyx_int_2, Py_GT); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_1); __pyx_1 = 0;
  __pyx_6 = __Pyx_PyObject_IsTrue(__pyx_2); if (unlikely(__pyx_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_2); __pyx_2 = 0;
  if (__pyx_6) {
 37:         r[1:-1] = (a[:-1] + a[1:]) / 2
        __pyx_3 = PySequence_GetSlice(((PyObject *)__pyx_v_a), 0, -1); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_4 = PySequence_GetSlice(((PyObject *)__pyx_v_a), 1, PY_SSIZE_T_MAX); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_2 = PyNumber_Add(__pyx_3, __pyx_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_DECREF(__pyx_3); __pyx_3 = 0;
    Py_DECREF(__pyx_4); __pyx_4 = 0;
    __pyx_t_4 = __Pyx_PyNumber_Divide(__pyx_t_2, __pyx_int_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (PySequence_SetSlice(((PyObject *)__pyx_v_r), 1, -1, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L6;
  }
  __pyx_L6:;
 38: 
 39:     if bounds is None:
    __pyx_6 = (__pyx_v_bounds == ((PyObject *)Py_None));
  if (__pyx_6) {
 40:         r[0]  = a[0]  - (r[1]  - a[0])
        __pyx_t_5 = 0;
    __pyx_t_6 = -1;
    if (__pyx_t_5 < 0) {
      __pyx_t_5 += __pyx_bshape_0_a;
      if (unlikely(__pyx_t_5 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_5 >= __pyx_bshape_0_a)) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_6);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_t_7 = 1;
    __pyx_t_6 = -1;
    if (__pyx_t_7 < 0) {
      __pyx_t_7 += __pyx_bshape_0_r;
      if (unlikely(__pyx_t_7 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_7 >= __pyx_bshape_0_r)) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_6);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_t_8 = 0;
    __pyx_t_6 = -1;
    if (__pyx_t_8 < 0) {
      __pyx_t_8 += __pyx_bshape_0_a;
      if (unlikely(__pyx_t_8 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_8 >= __pyx_bshape_0_a)) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_6);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_t_9 = 0;
    __pyx_t_6 = -1;
    if (__pyx_t_9 < 0) {
      __pyx_t_9 += __pyx_bshape_0_r;
      if (unlikely(__pyx_t_9 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_9 >= __pyx_bshape_0_r)) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_6);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    *__Pyx_BufPtrStrided1d(float *, __pyx_bstruct_r.buf, __pyx_t_9, __pyx_bstride_0_r) = ((*__Pyx_BufPtrStrided1d(float *, __pyx_bstruct_a.buf, __pyx_t_5, __pyx_bstride_0_a)) - ((*__Pyx_BufPtrStrided1d(float *, __pyx_bstruct_r.buf, __pyx_t_7, __pyx_bstride_0_r)) - (*__Pyx_BufPtrStrided1d(float *, __pyx_bstruct_a.buf, __pyx_t_8, __pyx_bstride_0_a))));
 41:         r[-1] = a[-1] + (a[-1] - r[-2])
        __pyx_t_10 = -1;
    __pyx_t_6 = -1;
    if (__pyx_t_10 < 0) {
      __pyx_t_10 += __pyx_bshape_0_a;
      if (unlikely(__pyx_t_10 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_10 >= __pyx_bshape_0_a)) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_6);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_t_11 = -1;
    __pyx_t_6 = -1;
    if (__pyx_t_11 < 0) {
      __pyx_t_11 += __pyx_bshape_0_a;
      if (unlikely(__pyx_t_11 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_11 >= __pyx_bshape_0_a)) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_6);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_t_12 = -2;
    __pyx_t_6 = -1;
    if (__pyx_t_12 < 0) {
      __pyx_t_12 += __pyx_bshape_0_r;
      if (unlikely(__pyx_t_12 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_12 >= __pyx_bshape_0_r)) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_6);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_t_13 = -1;
    __pyx_t_6 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_13 += __pyx_bshape_0_r;
      if (unlikely(__pyx_t_13 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_bshape_0_r)) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_6);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    *__Pyx_BufPtrStrided1d(float *, __pyx_bstruct_r.buf, __pyx_t_13, __pyx_bstride_0_r) = ((*__Pyx_BufPtrStrided1d(float *, __pyx_bstruct_a.buf, __pyx_t_10, __pyx_bstride_0_a)) + ((*__Pyx_BufPtrStrided1d(float *, __pyx_bstruct_a.buf, __pyx_t_11, __pyx_bstride_0_a)) - (*__Pyx_BufPtrStrided1d(float *, __pyx_bstruct_r.buf, __pyx_t_12, __pyx_bstride_0_r))));
    goto __pyx_L7;
  }
  /*else*/ {
 42:     else:
struct __pyx_obj_7spatial_8geometry_PointMass {
  struct __pyx_obj_7spatial_8geometry_SpatialObject __pyx_base;
  struct __pyx_obj_7spatial_8geometry_Point *p;
};


struct __pyx_vtabstruct_7spatial_8geometry_PointMass {
  struct __pyx_vtabstruct_7spatial_8geometry_SpatialObject __pyx_base;
  struct __pyx_obj_7spatial_8geometry_Point *(*point)(struct __pyx_obj_7spatial_8geometry_PointMass *, int __pyx_skip_dispatch);
};
static struct __pyx_vtabstruct_7spatial_8geometry_PointMass *__pyx_vtabptr_7spatial_8geometry_PointMass;

 43:         r[0] = bounds[0]
        __pyx_5 = __Pyx_GetItemInt(((PyObject *)__pyx_v_bounds), 0, 0); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_7 = __pyx_PyFloat_AsDouble(__pyx_5); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_DECREF(__pyx_5); __pyx_5 = 0;
    __pyx_t_14 = 0;
    __pyx_t_6 = -1;
    if (__pyx_t_14 < 0) {
      __pyx_t_14 += __pyx_bshape_0_r;
      if (unlikely(__pyx_t_14 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_14 >= __pyx_bshape_0_r)) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_6);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    *__Pyx_BufPtrStrided1d(float *, __pyx_bstruct_r.buf, __pyx_t_14, __pyx_bstride_0_r) = __pyx_7;
 44:         r[-1] = bounds[1]
        __pyx_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_bounds), 1, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_7 = __pyx_PyFloat_AsDouble(__pyx_1); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_DECREF(__pyx_1); __pyx_1 = 0;
    __pyx_t_15 = -1;
    __pyx_t_6 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_15 += __pyx_bshape_0_r;
      if (unlikely(__pyx_t_15 < 0)) __pyx_t_6 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_bshape_0_r)) __pyx_t_6 = 0;
    if (unlikely(__pyx_t_6 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_6);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    *__Pyx_BufPtrStrided1d(float *, __pyx_bstruct_r.buf, __pyx_t_15, __pyx_bstride_0_r) = __pyx_7;
  }
  __pyx_L7:;

  __pyx_r = Py_None; Py_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  Py_XDECREF(__pyx_1);
  Py_XDECREF(__pyx_2);
  Py_XDECREF(__pyx_3);
  Py_XDECREF(__pyx_4);
  Py_XDECREF(__pyx_5);
  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_a);
    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_r);
  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
  __Pyx_AddTraceback("spatial.gridworld._edges_from_center");
  __pyx_r = NULL;
  goto __pyx_L2;
  __pyx_L0:;
  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_a);
  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_r);
  __pyx_L2:;
  Py_XDECREF(__pyx_v_a);
  Py_XDECREF(__pyx_v_r);
  return __pyx_r;
}
 45: 
 46: ######################################################################
 47: # Now the gridworld class
 48: 
 49: cdef class GridWorld:
struct __pyx_obj_7spatial_9gridworld_GridWorld {
  PyObject_HEAD
  PyArrayObject *x_edges;
  PyArrayObject *y_edges;
  PyArrayObject *z_edges;
};
 50:     """
static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/
static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
  int __pyx_v_t;
  char *__pyx_v_f;
  PyArray_Descr *__pyx_v_descr = 0;
  PyObject *__pyx_v_stack;
  int __pyx_v_hasfields;
  PyObject *__pyx_v_iterator;
  int __pyx_r;
  if (__pyx_v_info == NULL) return 0;
  __pyx_v_info->obj = Py_None; Py_INCREF(Py_None);
  __pyx_v_stack = ((PyObject *)Py_None); Py_INCREF(Py_None);
  __pyx_v_iterator = Py_None; Py_INCREF(Py_None);
 51:     Defines a world that has a grid structure.
 52:     """
struct __pyx_obj_7spatial_8geometry_Box {
  struct __pyx_obj_7spatial_8geometry_SpatialObject __pyx_base;
  float xmin;
  float ymin;
  float zmin;
  float xmax;
  float ymax;
  float zmax;
  float wx;
  float wy;
  float wz;
};

struct __pyx_vtabstruct_7spatial_8geometry_Box {
  struct __pyx_vtabstruct_7spatial_8geometry_SpatialObject __pyx_base;
  PyObject *(*get_nonrandom_array_size)(struct __pyx_obj_7spatial_8geometry_Box *, __pyx_t_7spatial_8geometry_size_t);
  __pyx_t_7spatial_8geometry_size_t (*get_gridsize)(struct __pyx_obj_7spatial_8geometry_Box *, __pyx_t_7spatial_8geometry_size_t);
  void (*setNonrandomSamples)(struct __pyx_obj_7spatial_8geometry_Box *, PyArrayObject *, __pyx_t_7spatial_8geometry_size_t);
  void (*setCoordsDirect)(struct __pyx_obj_7spatial_8geometry_Box *, struct __pyx_obj_7spatial_8geometry_Point *, struct __pyx_obj_7spatial_8geometry_Point *);
  void (*_setWidths)(struct __pyx_obj_7spatial_8geometry_Box *);
};
 53: 
 54:     # Class type declarations:
 55:     cdef:
    __pyx_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
  if (__pyx_1) {
 56:         ar x_edges, y_edges, z_edges
        __pyx_2 = PyTuple_New(1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_INCREF(__pyx_kp_1);
    PyTuple_SET_ITEM(__pyx_2, 0, __pyx_kp_1);
    __pyx_3 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_2), NULL); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;
    __Pyx_Raise(__pyx_3, 0, 0);
    Py_DECREF(__pyx_3); __pyx_3 = 0;
    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    goto __pyx_L5;
  }
  __pyx_L5:;
 57: 
 58:     def __init__(self, x_centers, y_centers, z_centers,
static int __pyx_pf_7spatial_9gridworld_9GridWorld___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds);   __pyx_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);
  if (__pyx_1) {
 59:                  tuple x_bounds = None, tuple y_bounds = None, tuple z_bounds = None):
        __pyx_1 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_C_CONTIGUOUS));
  }
  if (__pyx_1) {
 60:         """
        __pyx_2 = PyTuple_New(1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_INCREF(__pyx_kp_2);
    PyTuple_SET_ITEM(__pyx_2, 0, __pyx_kp_2);
    __pyx_3 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_2), NULL); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;
    __Pyx_Raise(__pyx_3, 0, 0);
    Py_DECREF(__pyx_3); __pyx_3 = 0;
    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    goto __pyx_L6;
  }
  __pyx_L6:;
 61:         Borkborkbork
 62:         """
    __pyx_1 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);
  if (__pyx_1) {
 63: 
        __pyx_1 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_F_CONTIGUOUS));
  }
  if (__pyx_1) {
 64:         self.x_edges = _edges_from_center(x_centers, x_bounds)
    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp__edges_from_center); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_2 = PyTuple_New(2); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_INCREF(__pyx_v_x_centers);
  PyTuple_SET_ITEM(__pyx_2, 0, __pyx_v_x_centers);
  Py_INCREF(((PyObject *)__pyx_v_x_bounds));
  PyTuple_SET_ITEM(__pyx_2, 1, ((PyObject *)__pyx_v_x_bounds));
  __pyx_3 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_2), NULL); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_1); __pyx_1 = 0;
  Py_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;
  if (!(__Pyx_TypeTest(__pyx_3, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(((PyObject *)((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->x_edges));
  ((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->x_edges = ((PyArrayObject *)__pyx_3);
  __pyx_3 = 0;

        __pyx_2 = PyTuple_New(1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_INCREF(__pyx_kp_3);
    PyTuple_SET_ITEM(__pyx_2, 0, __pyx_kp_3);
    __pyx_3 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_2), NULL); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;
    __Pyx_Raise(__pyx_3, 0, 0);
    Py_DECREF(__pyx_3); __pyx_3 = 0;
    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    goto __pyx_L7;
  }
  __pyx_L7:;
 65:         self.y_edges = _edges_from_center(y_centers, y_bounds)
    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp__edges_from_center); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_2 = PyTuple_New(2); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_INCREF(__pyx_v_y_centers);
  PyTuple_SET_ITEM(__pyx_2, 0, __pyx_v_y_centers);
  Py_INCREF(((PyObject *)__pyx_v_y_bounds));
  PyTuple_SET_ITEM(__pyx_2, 1, ((PyObject *)__pyx_v_y_bounds));
  __pyx_3 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_2), NULL); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_1); __pyx_1 = 0;
  Py_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;
  if (!(__Pyx_TypeTest(__pyx_3, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(((PyObject *)((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->y_edges));
  ((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->y_edges = ((PyArrayObject *)__pyx_3);
  __pyx_3 = 0;
 66:         self.z_edges = _edges_from_center(z_centers, z_bounds)
    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp__edges_from_center); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_2 = PyTuple_New(2); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_INCREF(__pyx_v_z_centers);
  PyTuple_SET_ITEM(__pyx_2, 0, __pyx_v_z_centers);
  Py_INCREF(((PyObject *)__pyx_v_z_bounds));
  PyTuple_SET_ITEM(__pyx_2, 1, ((PyObject *)__pyx_v_z_bounds));
  __pyx_3 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_2), NULL); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_1); __pyx_1 = 0;
  Py_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;
  if (!(__Pyx_TypeTest(__pyx_3, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(((PyObject *)((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->z_edges));
  ((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->z_edges = ((PyArrayObject *)__pyx_3);
  __pyx_3 = 0;

  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  Py_XDECREF(__pyx_1);
  Py_XDECREF(__pyx_2);
  Py_XDECREF(__pyx_3);
  __Pyx_AddTraceback("spatial.gridworld.GridWorld.__init__");
  __pyx_r = -1;
  __pyx_L0:;
  return __pyx_r;
}

    __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_v_self));
 67: 
    __pyx_v_info->ndim = PyArray_NDIM(((PyArrayObject *)__pyx_v_self));
 68: 
    __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_v_self)));
 69:     @cython.boundscheck(False)
    __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(((PyArrayObject *)__pyx_v_self)));
 70:     def generateCSCoefficients(self, cs_class, mset, size_t samples_per_box):
static PyObject *__pyx_pf_7spatial_9gridworld_9GridWorld_generateCSCoefficients(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds);   __pyx_v_info->suboffsets = NULL;
 71:         """
    __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_v_self));
 72:         Returns a CS problem of type `cs_class` with the coefficients
    __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_v_self)));
 73:         from
 74:         """
 75: 
    __pyx_v_f = NULL;
 76:         # Type the data
    Py_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr));
  __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr;
 77:         cdef ar[float, ndim=3] mdata = mset.data
    __pyx_1 = PyObject_GetAttr(__pyx_v_mset, __pyx_kp_data); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!(__Pyx_TypeTest(__pyx_1, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_1 = ((PyArrayObject *)__pyx_1);
  if (unlikely(__Pyx_GetBuffer_float((PyObject*)__pyx_t_1, &__pyx_bstruct_mdata, PyBUF_FORMAT| PyBUF_STRIDES, 3, 0) == -1)) {
    __pyx_v_mdata = ((PyArrayObject *)Py_None); Py_INCREF(Py_None); __pyx_bstruct_mdata.buf = NULL;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  } else {__pyx_bstride_0_mdata = __pyx_bstruct_mdata.strides[0]; __pyx_bstride_1_mdata = __pyx_bstruct_mdata.strides[1]; __pyx_bstride_2_mdata = __pyx_bstruct_mdata.strides[2];
    __pyx_bshape_0_mdata = __pyx_bstruct_mdata.shape[0]; __pyx_bshape_1_mdata = __pyx_bstruct_mdata.shape[1]; __pyx_bshape_2_mdata = __pyx_bstruct_mdata.shape[2];
  }
  __pyx_t_1 = 0;
  __pyx_v_mdata = ((PyArrayObject *)__pyx_1);
  __pyx_1 = 0;
 78:         cdef ar[float, ndim=2] mpts = mset.measure_pts
    __pyx_1 = PyObject_GetAttr(__pyx_v_mset, __pyx_kp_measure_pts); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!(__Pyx_TypeTest(__pyx_1, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = ((PyArrayObject *)__pyx_1);
  if (unlikely(__Pyx_GetBuffer_float((PyObject*)__pyx_t_2, &__pyx_bstruct_mpts, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0) == -1)) {
    __pyx_v_mpts = ((PyArrayObject *)Py_None); Py_INCREF(Py_None); __pyx_bstruct_mpts.buf = NULL;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  } else {__pyx_bstride_0_mpts = __pyx_bstruct_mpts.strides[0]; __pyx_bstride_1_mpts = __pyx_bstruct_mpts.strides[1];
    __pyx_bshape_0_mpts = __pyx_bstruct_mpts.shape[0]; __pyx_bshape_1_mpts = __pyx_bstruct_mpts.shape[1];
  }
  __pyx_t_2 = 0;
  __pyx_v_mpts = ((PyArrayObject *)__pyx_1);
  __pyx_1 = 0;
 79: 
    __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
 80:         # Init the output array
 81:         cdef ar[float, mode="c", ndim=3] mT = \
 82:             np.empty( (n_boxes, n_measurements), dtype=np.float32)
    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_empty); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_1); __pyx_1 = 0;
  __pyx_1 = PyLong_FromUnsignedLong(__pyx_v_n_boxes); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_3 = PyLong_FromUnsignedLong(__pyx_v_n_measurements); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_4 = PyTuple_New(2); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  PyTuple_SET_ITEM(__pyx_4, 0, __pyx_1);
  PyTuple_SET_ITEM(__pyx_4, 1, __pyx_3);
  __pyx_1 = 0;
  __pyx_3 = 0;
  __pyx_1 = PyTuple_New(1); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  PyTuple_SET_ITEM(__pyx_1, 0, ((PyObject *)__pyx_4));
  __pyx_4 = 0;
  __pyx_3 = PyDict_New(); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_4 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_5 = PyObject_GetAttr(__pyx_4, __pyx_kp_25); if (unlikely(!__pyx_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_4); __pyx_4 = 0;
  if (PyDict_SetItem(__pyx_3, __pyx_kp_dtype, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_5); __pyx_5 = 0;
  __pyx_4 = PyEval_CallObjectWithKeywords(__pyx_2, ((PyObject *)__pyx_1), ((PyObject *)__pyx_3)); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_2); __pyx_2 = 0;
  Py_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
  Py_DECREF(((PyObject *)__pyx_3)); __pyx_3 = 0;
  if (!(__Pyx_TypeTest(__pyx_4, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = ((PyArrayObject *)__pyx_4);
  if (unlikely(__Pyx_GetBuffer_float((PyObject*)__pyx_t_3, &__pyx_bstruct_mT, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS| PyBUF_WRITABLE, 3, 0) == -1)) {
    __pyx_v_mT = ((PyArrayObject *)Py_None); Py_INCREF(Py_None); __pyx_bstruct_mT.buf = NULL;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  } else {__pyx_bstride_0_mT = __pyx_bstruct_mT.strides[0]; __pyx_bstride_1_mT = __pyx_bstruct_mT.strides[1]; __pyx_bstride_2_mT = __pyx_bstruct_mT.strides[2];
    __pyx_bshape_0_mT = __pyx_bstruct_mT.shape[0]; __pyx_bshape_1_mT = __pyx_bstruct_mT.shape[1]; __pyx_bshape_2_mT = __pyx_bstruct_mT.shape[2];
  }
  __pyx_t_3 = 0;
  __pyx_v_mT = ((PyArrayObject *)__pyx_4);
  __pyx_4 = 0;
 83: 
 84:         # Get the temporary objects we need
 85:         cdef Box curbox = Box()
    __pyx_5 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7spatial_8geometry_Box)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!(__Pyx_TypeTest(__pyx_5, __pyx_ptype_7spatial_8geometry_Box))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_curbox = ((struct __pyx_obj_7spatial_8geometry_Box *)__pyx_5);
  __pyx_5 = 0;
 86:         cdef Point measure_pt = Point()
    __pyx_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7spatial_8geometry_Point)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!(__Pyx_TypeTest(__pyx_2, __pyx_ptype_7spatial_8geometry_Point))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_measure_pt = ((struct __pyx_obj_7spatial_8geometry_Point *)__pyx_2);
  __pyx_2 = 0;
 87:         cdef GravityField gf = GravityField()
    __pyx_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7spatial_7gravity_GravityField)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!(__Pyx_TypeTest(__pyx_1, __pyx_ptype_7spatial_7gravity_GravityField))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_gf = ((struct __pyx_obj_7spatial_7gravity_GravityField *)__pyx_1);
  __pyx_1 = 0;
 88: 
 89:         # Get the gridsize:
 90:         cdef size_t grid_size = <size_t>ceil(( <float> samples_per_box)**(1.0/3))
    __pyx_v_grid_size = ((__pyx_t_7spatial_9gridworld_size_t)ceil(pow(((float)__pyx_v_samples_per_box), (1.0 / 3))));

    __pyx_1 = (!__pyx_v_hasfields);
  if (__pyx_1) {
 91: 
        Py_INCREF(Py_None);
    Py_DECREF(__pyx_v_info->obj);
    __pyx_v_info->obj = Py_None;
 92:         # get the arrays for setting the box locations, along with the points
        __pyx_v_t = __pyx_v_descr->type_num;
 93:         cdef:
        switch (__pyx_v_t) {
      case NPY_BYTE:
      __pyx_v_f = __pyx_k_4;
      break;
      case NPY_UBYTE:
 94:             ar[float, mode="c"] x_edges = self.x_edges
    __pyx_t_4 = ((PyArrayObject *)((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->x_edges);
  if (unlikely(__Pyx_GetBuffer_float((PyObject*)__pyx_t_4, &__pyx_bstruct_x_edges, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0) == -1)) {
    __pyx_v_x_edges = ((PyArrayObject *)Py_None); Py_INCREF(Py_None); __pyx_bstruct_x_edges.buf = NULL;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  } else {__pyx_bstride_0_x_edges = __pyx_bstruct_x_edges.strides[0];
    __pyx_bshape_0_x_edges = __pyx_bstruct_x_edges.shape[0];
  }
  __pyx_t_4 = 0;
  Py_INCREF(((PyObject *)((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->x_edges));
  __pyx_v_x_edges = ((PyArrayObject *)((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->x_edges);

            __pyx_v_f = __pyx_k_5;
      break;
      case NPY_SHORT:
 95:             ar[float, mode="c"] y_edges = self.y_edges
    __pyx_t_5 = ((PyArrayObject *)((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->y_edges);
  if (unlikely(__Pyx_GetBuffer_float((PyObject*)__pyx_t_5, &__pyx_bstruct_y_edges, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0) == -1)) {
    __pyx_v_y_edges = ((PyArrayObject *)Py_None); Py_INCREF(Py_None); __pyx_bstruct_y_edges.buf = NULL;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  } else {__pyx_bstride_0_y_edges = __pyx_bstruct_y_edges.strides[0];
    __pyx_bshape_0_y_edges = __pyx_bstruct_y_edges.shape[0];
  }
  __pyx_t_5 = 0;
  Py_INCREF(((PyObject *)((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->y_edges));
  __pyx_v_y_edges = ((PyArrayObject *)((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->y_edges);

            __pyx_v_f = __pyx_k_6;
      break;
      case NPY_USHORT:
 96:             ar[float, mode="c"] z_edges = self.z_edges
    __pyx_t_6 = ((PyArrayObject *)((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->z_edges);
  if (unlikely(__Pyx_GetBuffer_float((PyObject*)__pyx_t_6, &__pyx_bstruct_z_edges, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0) == -1)) {
    __pyx_v_z_edges = ((PyArrayObject *)Py_None); Py_INCREF(Py_None); __pyx_bstruct_z_edges.buf = NULL;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  } else {__pyx_bstride_0_z_edges = __pyx_bstruct_z_edges.strides[0];
    __pyx_bshape_0_z_edges = __pyx_bstruct_z_edges.shape[0];
  }
  __pyx_t_6 = 0;
  Py_INCREF(((PyObject *)((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->z_edges));
  __pyx_v_z_edges = ((PyArrayObject *)((struct __pyx_obj_7spatial_9gridworld_GridWorld *)__pyx_v_self)->z_edges);

            __pyx_v_f = __pyx_k_7;
      break;
      case NPY_INT:
 97:             Point p1=Point(), p2=Point()
    __pyx_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7spatial_8geometry_Point)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!(__Pyx_TypeTest(__pyx_3, __pyx_ptype_7spatial_8geometry_Point))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_p1 = ((struct __pyx_obj_7spatial_8geometry_Point *)__pyx_3);
  __pyx_3 = 0;
  __pyx_4 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7spatial_8geometry_Point)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!(__Pyx_TypeTest(__pyx_4, __pyx_ptype_7spatial_8geometry_Point))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_p2 = ((struct __pyx_obj_7spatial_8geometry_Point *)__pyx_4);
  __pyx_4 = 0;

            __pyx_v_f = __pyx_k_8;
      break;
      case NPY_UINT:
 98: 
            __pyx_v_f = __pyx_k_9;
      break;
      case NPY_LONG:
 99:         # Set up the indexing
            __pyx_v_f = __pyx_k_10;
      break;
      case NPY_ULONG:
 100:         cdef size_t nx, ny, nz, xi, yi, zi, bi, mi, n_boxes, n_measurements
            __pyx_v_f = __pyx_k_11;
      break;
      case NPY_LONGLONG:
 101: 
            __pyx_v_f = __pyx_k_12;
      break;
      case NPY_ULONGLONG:
 102:         nx = x_edges.shape[0] - 1
    __pyx_v_nx = ((__pyx_v_x_edges->dimensions[0]) - 1);

            __pyx_v_f = __pyx_k_13;
      break;
      case NPY_FLOAT:
 103:         ny = y_edges.shape[0] - 1
    __pyx_v_ny = ((__pyx_v_y_edges->dimensions[0]) - 1);

            __pyx_v_f = __pyx_k_14;
      break;
      case NPY_DOUBLE:
 104:         nz = z_edges.shape[0] - 1
    __pyx_v_nz = ((__pyx_v_z_edges->dimensions[0]) - 1);

            __pyx_v_f = __pyx_k_15;
      break;
      case NPY_LONGDOUBLE:
 105:         n_boxes = nx*ny*nz
    __pyx_v_n_boxes = ((__pyx_v_nx * __pyx_v_ny) * __pyx_v_nz);

            __pyx_v_f = __pyx_k_16;
      break;
      case NPY_CFLOAT:
 106:         n_measurements = mdata.shape[0]
    __pyx_v_n_measurements = (__pyx_v_mdata->dimensions[0]);

            __pyx_v_f = __pyx_k_17;
      break;
      case NPY_CDOUBLE:
 107: 
            __pyx_v_f = __pyx_k_18;
      break;
      case NPY_CLONGDOUBLE:
 108:         # Now we're ready to get going
            __pyx_v_f = __pyx_k_19;
      break;
      case NPY_OBJECT:
 109:         curbox.setDensity(0)
    __pyx_5 = ((struct __pyx_vtabstruct_7spatial_8geometry_Box *)__pyx_v_curbox->__pyx_base.__pyx_vtab)->__pyx_base.setDensity(((struct __pyx_obj_7spatial_8geometry_SpatialObject *)__pyx_v_curbox), 0, 0); if (unlikely(!__pyx_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(__pyx_5); __pyx_5 = 0;

            __pyx_v_f = __pyx_k_20;
      break;
      default:
 110: 
 111:         # Now do the looping
            __pyx_2 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_1 = PyNumber_Remainder(__pyx_kp_21, __pyx_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      Py_DECREF(__pyx_2); __pyx_2 = 0;
      __pyx_3 = PyTuple_New(1); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      PyTuple_SET_ITEM(__pyx_3, 0, __pyx_t_1);
      __pyx_t_1 = 0;
      __pyx_2 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_3), NULL); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      Py_DECREF(((PyObject *)__pyx_3)); __pyx_3 = 0;
      __Pyx_Raise(__pyx_2, 0, 0);
      Py_DECREF(__pyx_2); __pyx_2 = 0;
      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      break;
    }
 112:         for bi from 0 <= bi < n_boxes:
    for (__pyx_v_bi = 0; __pyx_v_bi < __pyx_v_n_boxes; __pyx_v_bi++) {

        __pyx_v_info->format = __pyx_v_f;
 113: 
        __pyx_r = 0;
    goto __pyx_L0;
    goto __pyx_L8;
  }
  /*else*/ {
 114:             # Set up the box; this would be easier to cycle through
 115:             # xi, yi, zi, then get the index, but they will probably
        Py_INCREF(__pyx_v_self);
    Py_DECREF(__pyx_v_info->obj);
    __pyx_v_info->obj = __pyx_v_self;
 116:             # both get optimized to the same thing and this keeps
        __pyx_v_info->format = ((char *)malloc(255));
 117:             # consistency with the other routines.
        __pyx_v_f = __pyx_v_info->format;
 118: 
        __pyx_3 = PyObject_GetAttr(__pyx_v_descr->fields, __pyx_kp_iteritems); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_2 = PyObject_Call(__pyx_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_DECREF(__pyx_3); __pyx_3 = 0;
    __pyx_3 = PyObject_GetIter(__pyx_2); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    Py_DECREF(__pyx_2); __pyx_2 = 0;
    __pyx_2 = PyList_New(1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    PyList_SET_ITEM(__pyx_2, 0, __pyx_3);
    __pyx_3 = 0;
    Py_DECREF(((PyObject *)__pyx_v_stack));
    __pyx_v_stack = __pyx_2;
    __pyx_2 = 0;
 119:             xi = _idx_to_xi(bi, nx, ny, nz)
        __pyx_v_xi = __pyx_f_7spatial_9gridworld__idx_to_xi(__pyx_v_bi, __pyx_v_nx, __pyx_v_ny, __pyx_v_nz);
 120:             yi = _idx_to_yi(bi, nx, ny, nz)
        __pyx_v_yi = __pyx_f_7spatial_9gridworld__idx_to_yi(__pyx_v_bi, __pyx_v_nx, __pyx_v_ny, __pyx_v_nz);

        while (1) {
      __pyx_1 = 1;
      if (!__pyx_1) break;
 121:             zi = _idx_to_zi(bi, nx, ny, nz)
        __pyx_v_zi = __pyx_f_7spatial_9gridworld__idx_to_zi(__pyx_v_bi, __pyx_v_nx, __pyx_v_ny, __pyx_v_nz);

            __pyx_3 = __Pyx_GetItemInt(((PyObject *)__pyx_v_stack), -1, 0); if (!__pyx_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      Py_DECREF(__pyx_v_iterator);
      __pyx_v_iterator = __pyx_3;
      __pyx_3 = 0;
 122: 
            Py_INCREF(Py_None);
      Py_DECREF(((PyObject *)__pyx_v_descr));
      __pyx_v_descr = ((PyArray_Descr *)Py_None);
 123:             p1.x = x_edges[xi]
        __pyx_t_7 = __pyx_v_xi;
    __pyx_v_p1->x = (*__Pyx_BufPtrCContig1d(float *, __pyx_bstruct_x_edges.buf, __pyx_t_7, __pyx_bstride_0_x_edges));

            while (1) {
        __pyx_1 = (((PyObject *)__pyx_v_descr) == Py_None);
        if (!__pyx_1) break;
 124:             p2.x = x_edges[xi+1]
        __pyx_t_8 = (__pyx_v_xi + 1);
    __pyx_v_p2->x = (*__Pyx_BufPtrCContig1d(float *, __pyx_bstruct_x_edges.buf, __pyx_t_8, __pyx_bstride_0_x_edges));

                {
          PyObject *__pyx_save_exc_type, *__pyx_save_exc_value, *__pyx_save_exc_tb;
          __Pyx_ExceptionSave(&__pyx_save_exc_type, &__pyx_save_exc_value, &__pyx_save_exc_tb);
          /*try:*/ {
 125:             p1.y = y_edges[yi]
        __pyx_t_9 = __pyx_v_yi;
    __pyx_v_p1->y = (*__Pyx_BufPtrCContig1d(float *, __pyx_bstruct_y_edges.buf, __pyx_t_9, __pyx_bstride_0_y_edges));

                        __pyx_2 = PyObject_GetAttr(__pyx_v_iterator, __pyx_kp_next); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L13_error;}
            __pyx_3 = PyObject_Call(__pyx_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L13_error;}
            Py_DECREF(__pyx_2); __pyx_2 = 0;
            __pyx_2 = __Pyx_GetItemInt(__pyx_3, 1, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L13_error;}
            Py_DECREF(__pyx_3); __pyx_3 = 0;
            __pyx_3 = __Pyx_GetItemInt(__pyx_2, 0, 0); if (!__pyx_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L13_error;}
            Py_DECREF(__pyx_2); __pyx_2 = 0;
            if (!(__Pyx_TypeTest(__pyx_3, __pyx_ptype_5numpy_dtype))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L13_error;}
            Py_DECREF(((PyObject *)__pyx_v_descr));
            __pyx_v_descr = ((PyArray_Descr *)__pyx_3);
            __pyx_3 = 0;
          }
          goto __pyx_L17_try;
          __pyx_L13_error:;
          Py_XDECREF(__pyx_2); __pyx_2 = 0;
          Py_XDECREF(__pyx_3); __pyx_3 = 0;
 126:             p2.y = y_edges[yi+1]
        __pyx_t_10 = (__pyx_v_yi + 1);
    __pyx_v_p2->y = (*__Pyx_BufPtrCContig1d(float *, __pyx_bstruct_y_edges.buf, __pyx_t_10, __pyx_bstride_0_y_edges));

                    __pyx_4 = PyErr_ExceptionMatches(__pyx_builtin_StopIteration);
          if (__pyx_4) {
            __Pyx_AddTraceback("numpy.__getbuffer__");
            if (__Pyx_GetException(&__pyx_2, &__pyx_3, &__pyx_5) < 0) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L15_except_error;}
 127:             p1.z = z_edges[zi]
        __pyx_t_11 = __pyx_v_zi;
    __pyx_v_p1->z = (*__Pyx_BufPtrCContig1d(float *, __pyx_bstruct_z_edges.buf, __pyx_t_11, __pyx_bstride_0_z_edges));

                        __pyx_6 = PyObject_GetAttr(((PyObject *)__pyx_v_stack), __pyx_kp_pop); if (unlikely(!__pyx_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L15_except_error;}
            __pyx_7 = PyObject_Call(__pyx_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L15_except_error;}
            Py_DECREF(__pyx_6); __pyx_6 = 0;
            Py_DECREF(__pyx_7); __pyx_7 = 0;
 128:             p2.z = z_edges[zi+1]
        __pyx_t_12 = (__pyx_v_zi + 1);
    __pyx_v_p2->z = (*__Pyx_BufPtrCContig1d(float *, __pyx_bstruct_z_edges.buf, __pyx_t_12, __pyx_bstride_0_z_edges));

                        __pyx_8 = PyObject_Length(((PyObject *)__pyx_v_stack)); if (unlikely(__pyx_8 == -1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L15_except_error;}
            __pyx_1 = (__pyx_8 > 0);
            if (__pyx_1) {
 129: 
                            (__pyx_v_f[0]) = 125;
 130:             curbox.setCoordsDirect(p1, p2)
        ((struct __pyx_vtabstruct_7spatial_8geometry_Box *)__pyx_v_curbox->__pyx_base.__pyx_vtab)->setCoordsDirect(__pyx_v_curbox, __pyx_v_p1, __pyx_v_p2);

                            __pyx_v_f += 1;
 131: 
                            __pyx_6 = __Pyx_GetItemInt(((PyObject *)__pyx_v_stack), -1, 0); if (!__pyx_6) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L15_except_error;}
              Py_DECREF(__pyx_v_iterator);
              __pyx_v_iterator = __pyx_6;
              __pyx_6 = 0;
              goto __pyx_L18;
            }
            /*else*/ {
 132:             # Now get all the measurements
 133: 
                            (__pyx_v_f[0]) = 0;
 134:             for mi from 0 <= mi < n_measurements:
        for (__pyx_v_mi = 0; __pyx_v_mi < __pyx_v_n_measurements; __pyx_v_mi++) {

                            __pyx_r = 0;
              Py_DECREF(__pyx_2); __pyx_2 = 0;
              Py_DECREF(__pyx_3); __pyx_3 = 0;
              Py_DECREF(__pyx_5); __pyx_5 = 0;
              goto __pyx_L16_except_return;
            }
            __pyx_L18:;
            Py_DECREF(__pyx_2); __pyx_2 = 0;
            Py_DECREF(__pyx_3); __pyx_3 = 0;
            Py_DECREF(__pyx_5); __pyx_5 = 0;
            goto __pyx_L14_exception_handled;
          }
          __pyx_L15_except_error:;
          Py_XDECREF(__pyx_save_exc_type);
          Py_XDECREF(__pyx_save_exc_value);
          Py_XDECREF(__pyx_save_exc_tb);
          goto __pyx_L1_error;
          __pyx_L16_except_return:;
          __Pyx_ExceptionReset(__pyx_save_exc_type, __pyx_save_exc_value, __pyx_save_exc_tb);
          goto __pyx_L0;
          __pyx_L14_exception_handled:;
          __Pyx_ExceptionReset(__pyx_save_exc_type, __pyx_save_exc_value, __pyx_save_exc_tb);
          __pyx_L17_try:;
        }
      }
 135:                 measure_pt.set(mpts[mi, 0], mpts[mi, 1], mpts[mi, 2])
            __pyx_t_13 = __pyx_v_mi;
      __pyx_t_14 = 0;
      if (__pyx_t_14 < 0) __pyx_t_14 += __pyx_bshape_1_mpts;
      __pyx_t_15 = __pyx_v_mi;
      __pyx_t_16 = 1;
      if (__pyx_t_16 < 0) __pyx_t_16 += __pyx_bshape_1_mpts;
      __pyx_t_17 = __pyx_v_mi;
      __pyx_t_18 = 2;
      if (__pyx_t_18 < 0) __pyx_t_18 += __pyx_bshape_1_mpts;
      ((struct __pyx_vtabstruct_7spatial_8geometry_Point *)__pyx_v_measure_pt->__pyx_vtab)->set(__pyx_v_measure_pt, (*__Pyx_BufPtrStrided2d(float *, __pyx_bstruct_mpts.buf, __pyx_t_13, __pyx_bstride_0_mpts, __pyx_t_14, __pyx_bstride_1_mpts)), (*__Pyx_BufPtrStrided2d(float *, __pyx_bstruct_mpts.buf, __pyx_t_15, __pyx_bstride_0_mpts, __pyx_t_16, __pyx_bstride_1_mpts)), (*__Pyx_BufPtrStrided2d(float *, __pyx_bstruct_mpts.buf, __pyx_t_17, __pyx_bstride_0_mpts, __pyx_t_18, __pyx_bstride_1_mpts)));
 136: 
            __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
 137:                 # Set the gravity field
            __pyx_1 = (!__pyx_v_hasfields);
      if (__pyx_1) {
 138:                 setInducedGF_box_nomask_nonrandom(measure_pt, curbox, gf, grid_size)
            __pyx_f_7spatial_7gravity_setInducedGF_box_nomask_nonrandom(__pyx_v_measure_pt, __pyx_v_curbox, __pyx_v_gf, __pyx_v_grid_size);

                __pyx_v_t = __pyx_v_descr->type_num;
 139: 
                __pyx_1 = ((__pyx_v_f - __pyx_v_info->format) > 240);
        if (__pyx_1) {
 140:                 # C is going to be Txx - Tyy, and D is going to be
                    __pyx_7 = PyTuple_New(1); if (unlikely(!__pyx_7)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          Py_INCREF(__pyx_kp_22);
          PyTuple_SET_ITEM(__pyx_7, 0, __pyx_kp_22);
          __pyx_6 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_7), NULL); if (unlikely(!__pyx_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          Py_DECREF(((PyObject *)__pyx_7)); __pyx_7 = 0;
          __Pyx_Raise(__pyx_6, 0, 0);
          Py_DECREF(__pyx_6); __pyx_6 = 0;
          {__pyx_filename = __pyx_f[1]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          goto __pyx_L20;
        }
        __pyx_L20:;
 141:                 # Txy.  This may be open to updating.
 142:                 mT[bi, mi, 0] = gf.Txx
            __pyx_t_19 = __pyx_v_bi;
      __pyx_t_20 = __pyx_v_mi;
      __pyx_t_21 = 0;
      if (__pyx_t_21 < 0) __pyx_t_21 += __pyx_bshape_2_mT;
      *__Pyx_BufPtrCContig3d(float *, __pyx_bstruct_mT.buf, __pyx_t_19, __pyx_bstride_0_mT, __pyx_t_20, __pyx_bstride_1_mT, __pyx_t_21, __pyx_bstride_2_mT) = __pyx_v_gf->Txx;
 143:                 mT[bi, mi, 1] = gf.Txy
            __pyx_t_22 = __pyx_v_bi;
      __pyx_t_23 = __pyx_v_mi;
      __pyx_t_24 = 1;
      if (__pyx_t_24 < 0) __pyx_t_24 += __pyx_bshape_2_mT;
      *__Pyx_BufPtrCContig3d(float *, __pyx_bstruct_mT.buf, __pyx_t_22, __pyx_bstride_0_mT, __pyx_t_23, __pyx_bstride_1_mT, __pyx_t_24, __pyx_bstride_2_mT) = __pyx_v_gf->Txy;

                switch (__pyx_v_t) {
          case NPY_BYTE:
          (__pyx_v_f[0]) = 98;
          break;
          case NPY_UBYTE:
 144:                 mT[bi, mi, 2] = gf.Tyy
            __pyx_t_25 = __pyx_v_bi;
      __pyx_t_26 = __pyx_v_mi;
      __pyx_t_27 = 2;
      if (__pyx_t_27 < 0) __pyx_t_27 += __pyx_bshape_2_mT;
      *__Pyx_BufPtrCContig3d(float *, __pyx_bstruct_mT.buf, __pyx_t_25, __pyx_bstride_0_mT, __pyx_t_26, __pyx_bstride_1_mT, __pyx_t_27, __pyx_bstride_2_mT) = __pyx_v_gf->Tyy;
    }
  }

                    (__pyx_v_f[0]) = 66;
          break;
          case NPY_SHORT:
 145: 
                    (__pyx_v_f[0]) = 104;
          break;
          case NPY_USHORT:
 146:         # We're done, now run with it!
                    (__pyx_v_f[0]) = 72;
          break;
          case NPY_INT:
 147:         return cs_class(mT)
    __pyx_2 = PyTuple_New(1); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_INCREF(((PyObject *)__pyx_v_mT));
  PyTuple_SET_ITEM(__pyx_2, 0, ((PyObject *)__pyx_v_mT));
  __pyx_1 = PyObject_Call(__pyx_v_cs_class, ((PyObject *)__pyx_2), NULL); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_DECREF(((PyObject *)__pyx_2)); __pyx_2 = 0;
  __pyx_r = __pyx_1;
  __pyx_1 = 0;
  goto __pyx_L0;

  __pyx_r = Py_None; Py_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  Py_XDECREF(__pyx_1);
  Py_XDECREF(__pyx_2);
  Py_XDECREF(__pyx_3);
  Py_XDECREF(__pyx_4);
  Py_XDECREF(__pyx_5);
  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_mdata);
    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_x_edges);
    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_mpts);
    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_y_edges);
    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_mT);
    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_z_edges);
  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
  __Pyx_AddTraceback("spatial.gridworld.GridWorld.generateCSCoefficients");
  __pyx_r = NULL;
  goto __pyx_L2;
  __pyx_L0:;
  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_mdata);
  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_x_edges);
  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_mpts);
  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_y_edges);
  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_mT);
  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_z_edges);
  __pyx_L2:;
  Py_XDECREF(__pyx_v_mdata);
  Py_XDECREF(__pyx_v_mpts);
  Py_XDECREF(__pyx_v_mT);
  Py_XDECREF((PyObject *)__pyx_v_curbox);
  Py_XDECREF(__pyx_v_measure_pt);
  Py_XDECREF(__pyx_v_gf);
  Py_XDECREF(__pyx_v_x_edges);
  Py_XDECREF(__pyx_v_y_edges);
  Py_XDECREF(__pyx_v_z_edges);
  Py_XDECREF(__pyx_v_p1);
  Py_XDECREF(__pyx_v_p2);
  return __pyx_r;
}

                    (__pyx_v_f[0]) = 105;
          break;
          case NPY_UINT:
 148: 
                    (__pyx_v_f[0]) = 73;
          break;
          case NPY_LONG: