mirror of
https://github.com/explosion/spaCy.git
synced 2024-12-30 20:06:30 +03:00
91 lines
1.8 KiB
C
91 lines
1.8 KiB
C
|
#ifndef _NPY_INCLUDE_NEIGHBORHOOD_IMP
|
||
|
#error You should not include this header directly
|
||
|
#endif
|
||
|
/*
|
||
|
* Private API (here for inline)
|
||
|
*/
|
||
|
static NPY_INLINE int
|
||
|
_PyArrayNeighborhoodIter_IncrCoord(PyArrayNeighborhoodIterObject* iter);
|
||
|
|
||
|
/*
|
||
|
* Update to next item of the iterator
|
||
|
*
|
||
|
* Note: this simply increment the coordinates vector, last dimension
|
||
|
* incremented first , i.e, for dimension 3
|
||
|
* ...
|
||
|
* -1, -1, -1
|
||
|
* -1, -1, 0
|
||
|
* -1, -1, 1
|
||
|
* ....
|
||
|
* -1, 0, -1
|
||
|
* -1, 0, 0
|
||
|
* ....
|
||
|
* 0, -1, -1
|
||
|
* 0, -1, 0
|
||
|
* ....
|
||
|
*/
|
||
|
#define _UPDATE_COORD_ITER(c) \
|
||
|
wb = iter->coordinates[c] < iter->bounds[c][1]; \
|
||
|
if (wb) { \
|
||
|
iter->coordinates[c] += 1; \
|
||
|
return 0; \
|
||
|
} \
|
||
|
else { \
|
||
|
iter->coordinates[c] = iter->bounds[c][0]; \
|
||
|
}
|
||
|
|
||
|
static NPY_INLINE int
|
||
|
_PyArrayNeighborhoodIter_IncrCoord(PyArrayNeighborhoodIterObject* iter)
|
||
|
{
|
||
|
npy_intp i, wb;
|
||
|
|
||
|
for (i = iter->nd - 1; i >= 0; --i) {
|
||
|
_UPDATE_COORD_ITER(i)
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Version optimized for 2d arrays, manual loop unrolling
|
||
|
*/
|
||
|
static NPY_INLINE int
|
||
|
_PyArrayNeighborhoodIter_IncrCoord2D(PyArrayNeighborhoodIterObject* iter)
|
||
|
{
|
||
|
npy_intp wb;
|
||
|
|
||
|
_UPDATE_COORD_ITER(1)
|
||
|
_UPDATE_COORD_ITER(0)
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
#undef _UPDATE_COORD_ITER
|
||
|
|
||
|
/*
|
||
|
* Advance to the next neighbour
|
||
|
*/
|
||
|
static NPY_INLINE int
|
||
|
PyArrayNeighborhoodIter_Next(PyArrayNeighborhoodIterObject* iter)
|
||
|
{
|
||
|
_PyArrayNeighborhoodIter_IncrCoord (iter);
|
||
|
iter->dataptr = iter->translate((PyArrayIterObject*)iter, iter->coordinates);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Reset functions
|
||
|
*/
|
||
|
static NPY_INLINE int
|
||
|
PyArrayNeighborhoodIter_Reset(PyArrayNeighborhoodIterObject* iter)
|
||
|
{
|
||
|
npy_intp i;
|
||
|
|
||
|
for (i = 0; i < iter->nd; ++i) {
|
||
|
iter->coordinates[i] = iter->bounds[i][0];
|
||
|
}
|
||
|
iter->dataptr = iter->translate((PyArrayIterObject*)iter, iter->coordinates);
|
||
|
|
||
|
return 0;
|
||
|
}
|