Skip to content

Instantly share code, notes, and snippets.

@tkf
Created May 28, 2009 10:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tkf/119216 to your computer and use it in GitHub Desktop.
Save tkf/119216 to your computer and use it in GitHub Desktop.
#ifdef NUMPY_DEBUG
static void *NumPyDebug_CheckAndGetPtr(PyArrayObject *aobj,
char *name, int ndim, int *ind)
{
int i;
void *dptr = PyArray_DATA(aobj);
PyGILState_STATE gstate;
if(ndim != PyArray_NDIM(aobj)){
/* specified number of dimentions is not same of its of array */
gstate = PyGILState_Ensure();/* get GIL to raise IndexError */
PyErr_Format(PyExc_IndexError,
"degree of array is not correct. %s->nd = %d != ndim =%d\n",
name, (int)PyArray_NDIM(aobj), ndim);
PyGILState_Release(gstate);
}
for(i=0; i<ndim; ++i){
if(ind[i] >= PyArray_DIM(aobj,i)){
/* index ind[i] is out of range */
gstate = PyGILState_Ensure();/* get GIL to raise IndexError */
PyErr_Format(PyExc_IndexError,
"array %s's %d-th index %d is out of bounds(=%d).\n",
name, i, ind[i], (int)PyArray_DIM(aobj,i));
PyGILState_Release(gstate);
break;
}
dptr += ind[i] * PyArray_STRIDE(aobj, i);
}
return dptr;
}
static void *NumPyDebug_CheckAndGetPtr1(PyArrayObject *aobj, char *name,
int i)
{
int ind[] = {i};
return NumPyDebug_CheckAndGetPtr(aobj, name, 1, ind);
}
static void *NumPyDebug_CheckAndGetPtr2(PyArrayObject *aobj, char *name,
int i, int j)
{
int ind[] = {i,j};
return NumPyDebug_CheckAndGetPtr(aobj, name, 2, ind);
}
static void *NumPyDebug_CheckAndGetPtr3(PyArrayObject *aobj, char *name,
int i, int j, int k)
{
int ind[] = {i,j,k};
return NumPyDebug_CheckAndGetPtr(aobj, name, 3, ind);
}
static void *NumPyDebug_CheckAndGetPtr4(PyArrayObject *aobj, char *name,
int i, int j, int k, int l)
{
int ind[] = {i,j,k,l};
return NumPyDebug_CheckAndGetPtr(aobj, name, 4, ind);
}
static int NumPyDebug_CheckError(void)
{
int return_val=0;
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();/* get GIL to check IndexError */
if(PyErr_Occurred()!=NULL){/* error is occured */
return_val = -1;
}
PyGILState_Release(gstate);
return return_val;
}
#define NPD_IF_ERR_OCCURRED_DO(dothis) \
if(NumPyDebug_CheckError()<0){ dothis; }
#define NPD_CHECKANDGETPTR1(a,i) NumPyDebug_CheckAndGetPtr1(a,#a,i)
#define NPD_CHECKANDGETPTR2(a,i,j) NumPyDebug_CheckAndGetPtr2(a,#a,i,j)
#define NPD_CHECKANDGETPTR3(a,i,j,k) NumPyDebug_CheckAndGetPtr3(a,#a,i,j,k)
#define NPD_CHECKANDGETPTR4(a,i,j,k,l) NumPyDebug_CheckAndGetPtr4(a,#a,i,j,k,l)
#define Da1(a, i) (*((double *) NPD_CHECKANDGETPTR1(a, i)))
#define Da2(a, i, j) (*((double *) NPD_CHECKANDGETPTR2(a, i, j)))
#define Da3(a, i, j, k) (*((double *) NPD_CHECKANDGETPTR3(a, i, j, k)))
#define Da4(a, i, j, k, l) (*((double *) NPD_CHECKANDGETPTR4(a, i, j, k, l)))
#define Da2T(a, j, i) (*((double *) NPD_CHECKANDGETPTR2(a, i, j)))
#define Da3T(a, k, j, i) (*((double *) NPD_CHECKANDGETPTR3(a, i, j, k)))
#define Da4T(a, l, k, j, i) (*((double *) NPD_CHECKANDGETPTR4(a, i, j, k, l)))
#define Ia1(a, i) (*((int *) NPD_CHECKANDGETPTR1(a, i)))
#define Ia2(a, i, j) (*((int *) NPD_CHECKANDGETPTR2(a, i, j)))
#define Ia3(a, i, j, k) (*((int *) NPD_CHECKANDGETPTR3(a, i, j, k)))
#define Ia4(a, i, j, k, l) (*((int *) NPD_CHECKANDGETPTR4(a, i, j, k, l)))
#define Ia2T(a, j, i) (*((int *) NPD_CHECKANDGETPTR2(a, i, j)))
#define Ia3T(a, k, j, i) (*((int *) NPD_CHECKANDGETPTR3(a, i, j, k)))
#define Ia4T(a, l, k, j, i) (*((int *) NPD_CHECKANDGETPTR4(a, i, j, k, l)))
#else
#define NPD_IF_ERR_OCCURRED_DO(dothis)
#define Da1(a, i) (*((double *) PyArray_GETPTR1(a, i)))
#define Da2(a, i, j) (*((double *) PyArray_GETPTR2(a, i, j)))
#define Da3(a, i, j, k) (*((double *) PyArray_GETPTR3(a, i, j, k)))
#define Da4(a, i, j, k, l) (*((double *) PyArray_GETPTR4(a, i, j, k, l)))
#define Da2T(a, j, i) (*((double *) PyArray_GETPTR2(a, i, j)))
#define Da3T(a, k, j, i) (*((double *) PyArray_GETPTR3(a, i, j, k)))
#define Da4T(a, l, k, j, i) (*((double *) PyArray_GETPTR4(a, i, j, k, l)))
#define Ia1(a, i) (*((int *) PyArray_GETPTR1(a, i)))
#define Ia2(a, i, j) (*((int *) PyArray_GETPTR2(a, i, j)))
#define Ia3(a, i, j, k) (*((int *) PyArray_GETPTR3(a, i, j, k)))
#define Ia4(a, i, j, k, l) (*((int *) PyArray_GETPTR4(a, i, j, k, l)))
#define Ia2T(a, j, i) (*((int *) PyArray_GETPTR2(a, i, j)))
#define Ia3T(a, k, j, i) (*((int *) PyArray_GETPTR3(a, i, j, k)))
#define Ia4T(a, l, k, j, i) (*((int *) PyArray_GETPTR4(a, i, j, k, l)))
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment