Created
May 28, 2009 10:35
-
-
Save tkf/119216 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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