/* W W AAA RRRR N N III N N GGG !!! ** W W A A R R NN N I NN N G G !!! ** W W W AAAAA RRRR N N N I N N N G ! ** W W W A A R R N NN I N NN G GG ** W W A A R R N N III N N GGG !!! ** ** WARNING: This file is program generated by codegenerator.py. ** ** DO NOT EDIT THIS FILE! Any changes made to this file will be lost! */ #include #include #include "libnumarray.h" #define STDC_LT(a,b) ((a) < (b)) #define STDC_LE(a,b) ((a) <= (b)) #define STDC_EQ(a,b) ((a) == (b)) #define SWAP(a,b) { SWAP_temp = a; a = b; b = SWAP_temp;} #define swap(i, j) { temp=v[i]; v[i]=v[j]; v[j]=temp; } #define wswap(i, j) { temp=v[i]; v[i]=v[j]; v[j]=temp; wtemp=w[i]; w[i]=w[j]; w[j]=wtemp; } /****************** Bool *******************/ void quicksort0Bool(Bool *pl, Bool *pr) { Bool vp, SWAP_temp; Bool *stack[100], **sptr = stack, *pm, *pi, *pj, *pt; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); if (STDC_LT(*pr,*pm)) SWAP(*pr,*pm); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(*pi,vp)); do --pj; while (STDC_LT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortBool(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Bool *pl = (Bool *) buffers[0]; Bool *pr = pl + niter - 1; quicksort0Bool(pl, pr); return 0; } UFUNC_DESCR1(quicksortBool, sizeof(Bool)); void aquicksort0Bool(long *pl, long *pr, Bool *v) { Bool vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (STDC_LT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(v[*pi],vp)); do --pj; while (STDC_LT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortBool(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Bool *v = (Bool *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0Bool(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortBool, sizeof(Bool), sizeof(long)); void mergesort0Bool(Bool *pl, Bool *pr, Bool *pw) { Bool vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0Bool(pl,pm-1,pw); mergesort0Bool(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortBool(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Bool *pl = (Bool *) buffers[0]; Bool *pr = pl + niter - 1; Bool *pw = (Bool *) malloc(((1 + niter/2))*sizeof(Bool)); if (pw != NULL) { mergesort0Bool(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortBool, sizeof(Bool)); void amergesort0Bool(long *pl, long *pr, Bool *v, long *pw) { Bool vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0Bool(pl,pm-1,v,pw); amergesort0Bool(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortBool(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Bool *v = (Bool *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0Bool(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortBool, sizeof(Bool), sizeof(long)); void heapsort0Bool(Bool *a, long n) { Bool tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j += 1; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j++; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortBool(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Bool *pl = (Bool *) buffers[0]; heapsort0Bool(pl, niter); return 0; } UFUNC_DESCR1(heapsortBool, sizeof(Bool)); void aheapsort0Bool(long *a, long n, Bool *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j += 1; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j++; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortBool(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Bool *v = (Bool *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0Bool(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortBool, sizeof(Bool), sizeof(long)); void sort0Bool(Bool *v, long left, long right) { Bool temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; sort0Bool(v, left, lastl); sort0Bool(v, lastr, right); } static int sortBool(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0Bool( (Bool *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortBool, sizeof(Bool)); void asort0Bool(Bool *v, long *w, long left, long right) { Bool temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; asort0Bool(v, w, left, lastl); asort0Bool(v, w, lastr, right); } static int asortBool(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0Bool( (Bool *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortBool, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(Bool), sizeof(long), 0, 0, 0, 0); static long searchBool(long na, Bool *a, Bool v) { long i = 0; Bool *b; while(na > 10) { long mid = na>>1; if (STDC_LE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((STDC_LT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedBool(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; Bool *bins; Bool *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedBool", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedBool", nbins, buffers[1], bsizes[1], sizeof(Bool))) return -1; bins = (Bool *) buffers[1]; if (NA_checkOneCBuffer("searchsortedBool", niter, buffers[2], bsizes[2], sizeof(Bool))) return -1; values = (Bool *) buffers[2]; if (NA_checkOneCBuffer("searchsortedBool", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedBool", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsBool: insufficient index space.\n"); return -1; } for(j=0; j 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); if (STDC_LT(*pr,*pm)) SWAP(*pr,*pm); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(*pi,vp)); do --pj; while (STDC_LT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int8 *pl = (Int8 *) buffers[0]; Int8 *pr = pl + niter - 1; quicksort0Int8(pl, pr); return 0; } UFUNC_DESCR1(quicksortInt8, sizeof(Int8)); void aquicksort0Int8(long *pl, long *pr, Int8 *v) { Int8 vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (STDC_LT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(v[*pi],vp)); do --pj; while (STDC_LT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int8 *v = (Int8 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0Int8(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortInt8, sizeof(Int8), sizeof(long)); void mergesort0Int8(Int8 *pl, Int8 *pr, Int8 *pw) { Int8 vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0Int8(pl,pm-1,pw); mergesort0Int8(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int8 *pl = (Int8 *) buffers[0]; Int8 *pr = pl + niter - 1; Int8 *pw = (Int8 *) malloc(((1 + niter/2))*sizeof(Int8)); if (pw != NULL) { mergesort0Int8(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortInt8, sizeof(Int8)); void amergesort0Int8(long *pl, long *pr, Int8 *v, long *pw) { Int8 vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0Int8(pl,pm-1,v,pw); amergesort0Int8(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int8 *v = (Int8 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0Int8(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortInt8, sizeof(Int8), sizeof(long)); void heapsort0Int8(Int8 *a, long n) { Int8 tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j += 1; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j++; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int8 *pl = (Int8 *) buffers[0]; heapsort0Int8(pl, niter); return 0; } UFUNC_DESCR1(heapsortInt8, sizeof(Int8)); void aheapsort0Int8(long *a, long n, Int8 *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j += 1; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j++; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int8 *v = (Int8 *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0Int8(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortInt8, sizeof(Int8), sizeof(long)); void sort0Int8(Int8 *v, long left, long right) { Int8 temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; sort0Int8(v, left, lastl); sort0Int8(v, lastr, right); } static int sortInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0Int8( (Int8 *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortInt8, sizeof(Int8)); void asort0Int8(Int8 *v, long *w, long left, long right) { Int8 temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; asort0Int8(v, w, left, lastl); asort0Int8(v, w, lastr, right); } static int asortInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0Int8( (Int8 *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortInt8, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(Int8), sizeof(long), 0, 0, 0, 0); static long searchInt8(long na, Int8 *a, Int8 v) { long i = 0; Int8 *b; while(na > 10) { long mid = na>>1; if (STDC_LE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((STDC_LT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedInt8(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; Int8 *bins; Int8 *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedInt8", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedInt8", nbins, buffers[1], bsizes[1], sizeof(Int8))) return -1; bins = (Int8 *) buffers[1]; if (NA_checkOneCBuffer("searchsortedInt8", niter, buffers[2], bsizes[2], sizeof(Int8))) return -1; values = (Int8 *) buffers[2]; if (NA_checkOneCBuffer("searchsortedInt8", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedInt8", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsInt8: insufficient index space.\n"); return -1; } for(j=0; j 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); if (STDC_LT(*pr,*pm)) SWAP(*pr,*pm); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(*pi,vp)); do --pj; while (STDC_LT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortUInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt8 *pl = (UInt8 *) buffers[0]; UInt8 *pr = pl + niter - 1; quicksort0UInt8(pl, pr); return 0; } UFUNC_DESCR1(quicksortUInt8, sizeof(UInt8)); void aquicksort0UInt8(long *pl, long *pr, UInt8 *v) { UInt8 vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (STDC_LT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(v[*pi],vp)); do --pj; while (STDC_LT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortUInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt8 *v = (UInt8 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0UInt8(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortUInt8, sizeof(UInt8), sizeof(long)); void mergesort0UInt8(UInt8 *pl, UInt8 *pr, UInt8 *pw) { UInt8 vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0UInt8(pl,pm-1,pw); mergesort0UInt8(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortUInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt8 *pl = (UInt8 *) buffers[0]; UInt8 *pr = pl + niter - 1; UInt8 *pw = (UInt8 *) malloc(((1 + niter/2))*sizeof(UInt8)); if (pw != NULL) { mergesort0UInt8(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortUInt8, sizeof(UInt8)); void amergesort0UInt8(long *pl, long *pr, UInt8 *v, long *pw) { UInt8 vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0UInt8(pl,pm-1,v,pw); amergesort0UInt8(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortUInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt8 *v = (UInt8 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0UInt8(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortUInt8, sizeof(UInt8), sizeof(long)); void heapsort0UInt8(UInt8 *a, long n) { UInt8 tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j += 1; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j++; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortUInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt8 *pl = (UInt8 *) buffers[0]; heapsort0UInt8(pl, niter); return 0; } UFUNC_DESCR1(heapsortUInt8, sizeof(UInt8)); void aheapsort0UInt8(long *a, long n, UInt8 *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j += 1; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j++; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortUInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt8 *v = (UInt8 *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0UInt8(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortUInt8, sizeof(UInt8), sizeof(long)); void sort0UInt8(UInt8 *v, long left, long right) { UInt8 temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; sort0UInt8(v, left, lastl); sort0UInt8(v, lastr, right); } static int sortUInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0UInt8( (UInt8 *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortUInt8, sizeof(UInt8)); void asort0UInt8(UInt8 *v, long *w, long left, long right) { UInt8 temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; asort0UInt8(v, w, left, lastl); asort0UInt8(v, w, lastr, right); } static int asortUInt8(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0UInt8( (UInt8 *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortUInt8, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(UInt8), sizeof(long), 0, 0, 0, 0); static long searchUInt8(long na, UInt8 *a, UInt8 v) { long i = 0; UInt8 *b; while(na > 10) { long mid = na>>1; if (STDC_LE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((STDC_LT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedUInt8(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; UInt8 *bins; UInt8 *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedUInt8", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedUInt8", nbins, buffers[1], bsizes[1], sizeof(UInt8))) return -1; bins = (UInt8 *) buffers[1]; if (NA_checkOneCBuffer("searchsortedUInt8", niter, buffers[2], bsizes[2], sizeof(UInt8))) return -1; values = (UInt8 *) buffers[2]; if (NA_checkOneCBuffer("searchsortedUInt8", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedUInt8", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsUInt8: insufficient index space.\n"); return -1; } for(j=0; j 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); if (STDC_LT(*pr,*pm)) SWAP(*pr,*pm); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(*pi,vp)); do --pj; while (STDC_LT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int16 *pl = (Int16 *) buffers[0]; Int16 *pr = pl + niter - 1; quicksort0Int16(pl, pr); return 0; } UFUNC_DESCR1(quicksortInt16, sizeof(Int16)); void aquicksort0Int16(long *pl, long *pr, Int16 *v) { Int16 vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (STDC_LT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(v[*pi],vp)); do --pj; while (STDC_LT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int16 *v = (Int16 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0Int16(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortInt16, sizeof(Int16), sizeof(long)); void mergesort0Int16(Int16 *pl, Int16 *pr, Int16 *pw) { Int16 vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0Int16(pl,pm-1,pw); mergesort0Int16(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int16 *pl = (Int16 *) buffers[0]; Int16 *pr = pl + niter - 1; Int16 *pw = (Int16 *) malloc(((1 + niter/2))*sizeof(Int16)); if (pw != NULL) { mergesort0Int16(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortInt16, sizeof(Int16)); void amergesort0Int16(long *pl, long *pr, Int16 *v, long *pw) { Int16 vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0Int16(pl,pm-1,v,pw); amergesort0Int16(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int16 *v = (Int16 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0Int16(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortInt16, sizeof(Int16), sizeof(long)); void heapsort0Int16(Int16 *a, long n) { Int16 tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j += 1; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j++; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int16 *pl = (Int16 *) buffers[0]; heapsort0Int16(pl, niter); return 0; } UFUNC_DESCR1(heapsortInt16, sizeof(Int16)); void aheapsort0Int16(long *a, long n, Int16 *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j += 1; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j++; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int16 *v = (Int16 *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0Int16(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortInt16, sizeof(Int16), sizeof(long)); void sort0Int16(Int16 *v, long left, long right) { Int16 temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; sort0Int16(v, left, lastl); sort0Int16(v, lastr, right); } static int sortInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0Int16( (Int16 *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortInt16, sizeof(Int16)); void asort0Int16(Int16 *v, long *w, long left, long right) { Int16 temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; asort0Int16(v, w, left, lastl); asort0Int16(v, w, lastr, right); } static int asortInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0Int16( (Int16 *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortInt16, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(Int16), sizeof(long), 0, 0, 0, 0); static long searchInt16(long na, Int16 *a, Int16 v) { long i = 0; Int16 *b; while(na > 10) { long mid = na>>1; if (STDC_LE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((STDC_LT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedInt16(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; Int16 *bins; Int16 *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedInt16", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedInt16", nbins, buffers[1], bsizes[1], sizeof(Int16))) return -1; bins = (Int16 *) buffers[1]; if (NA_checkOneCBuffer("searchsortedInt16", niter, buffers[2], bsizes[2], sizeof(Int16))) return -1; values = (Int16 *) buffers[2]; if (NA_checkOneCBuffer("searchsortedInt16", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedInt16", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsInt16: insufficient index space.\n"); return -1; } for(j=0; j 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); if (STDC_LT(*pr,*pm)) SWAP(*pr,*pm); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(*pi,vp)); do --pj; while (STDC_LT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortUInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt16 *pl = (UInt16 *) buffers[0]; UInt16 *pr = pl + niter - 1; quicksort0UInt16(pl, pr); return 0; } UFUNC_DESCR1(quicksortUInt16, sizeof(UInt16)); void aquicksort0UInt16(long *pl, long *pr, UInt16 *v) { UInt16 vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (STDC_LT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(v[*pi],vp)); do --pj; while (STDC_LT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortUInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt16 *v = (UInt16 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0UInt16(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortUInt16, sizeof(UInt16), sizeof(long)); void mergesort0UInt16(UInt16 *pl, UInt16 *pr, UInt16 *pw) { UInt16 vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0UInt16(pl,pm-1,pw); mergesort0UInt16(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortUInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt16 *pl = (UInt16 *) buffers[0]; UInt16 *pr = pl + niter - 1; UInt16 *pw = (UInt16 *) malloc(((1 + niter/2))*sizeof(UInt16)); if (pw != NULL) { mergesort0UInt16(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortUInt16, sizeof(UInt16)); void amergesort0UInt16(long *pl, long *pr, UInt16 *v, long *pw) { UInt16 vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0UInt16(pl,pm-1,v,pw); amergesort0UInt16(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortUInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt16 *v = (UInt16 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0UInt16(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortUInt16, sizeof(UInt16), sizeof(long)); void heapsort0UInt16(UInt16 *a, long n) { UInt16 tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j += 1; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j++; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortUInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt16 *pl = (UInt16 *) buffers[0]; heapsort0UInt16(pl, niter); return 0; } UFUNC_DESCR1(heapsortUInt16, sizeof(UInt16)); void aheapsort0UInt16(long *a, long n, UInt16 *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j += 1; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j++; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortUInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt16 *v = (UInt16 *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0UInt16(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortUInt16, sizeof(UInt16), sizeof(long)); void sort0UInt16(UInt16 *v, long left, long right) { UInt16 temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; sort0UInt16(v, left, lastl); sort0UInt16(v, lastr, right); } static int sortUInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0UInt16( (UInt16 *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortUInt16, sizeof(UInt16)); void asort0UInt16(UInt16 *v, long *w, long left, long right) { UInt16 temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; asort0UInt16(v, w, left, lastl); asort0UInt16(v, w, lastr, right); } static int asortUInt16(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0UInt16( (UInt16 *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortUInt16, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(UInt16), sizeof(long), 0, 0, 0, 0); static long searchUInt16(long na, UInt16 *a, UInt16 v) { long i = 0; UInt16 *b; while(na > 10) { long mid = na>>1; if (STDC_LE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((STDC_LT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedUInt16(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; UInt16 *bins; UInt16 *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedUInt16", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedUInt16", nbins, buffers[1], bsizes[1], sizeof(UInt16))) return -1; bins = (UInt16 *) buffers[1]; if (NA_checkOneCBuffer("searchsortedUInt16", niter, buffers[2], bsizes[2], sizeof(UInt16))) return -1; values = (UInt16 *) buffers[2]; if (NA_checkOneCBuffer("searchsortedUInt16", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedUInt16", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsUInt16: insufficient index space.\n"); return -1; } for(j=0; j 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); if (STDC_LT(*pr,*pm)) SWAP(*pr,*pm); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(*pi,vp)); do --pj; while (STDC_LT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int32 *pl = (Int32 *) buffers[0]; Int32 *pr = pl + niter - 1; quicksort0Int32(pl, pr); return 0; } UFUNC_DESCR1(quicksortInt32, sizeof(Int32)); void aquicksort0Int32(long *pl, long *pr, Int32 *v) { Int32 vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (STDC_LT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(v[*pi],vp)); do --pj; while (STDC_LT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int32 *v = (Int32 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0Int32(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortInt32, sizeof(Int32), sizeof(long)); void mergesort0Int32(Int32 *pl, Int32 *pr, Int32 *pw) { Int32 vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0Int32(pl,pm-1,pw); mergesort0Int32(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int32 *pl = (Int32 *) buffers[0]; Int32 *pr = pl + niter - 1; Int32 *pw = (Int32 *) malloc(((1 + niter/2))*sizeof(Int32)); if (pw != NULL) { mergesort0Int32(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortInt32, sizeof(Int32)); void amergesort0Int32(long *pl, long *pr, Int32 *v, long *pw) { Int32 vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0Int32(pl,pm-1,v,pw); amergesort0Int32(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int32 *v = (Int32 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0Int32(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortInt32, sizeof(Int32), sizeof(long)); void heapsort0Int32(Int32 *a, long n) { Int32 tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j += 1; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j++; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int32 *pl = (Int32 *) buffers[0]; heapsort0Int32(pl, niter); return 0; } UFUNC_DESCR1(heapsortInt32, sizeof(Int32)); void aheapsort0Int32(long *a, long n, Int32 *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j += 1; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j++; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int32 *v = (Int32 *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0Int32(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortInt32, sizeof(Int32), sizeof(long)); void sort0Int32(Int32 *v, long left, long right) { Int32 temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; sort0Int32(v, left, lastl); sort0Int32(v, lastr, right); } static int sortInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0Int32( (Int32 *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortInt32, sizeof(Int32)); void asort0Int32(Int32 *v, long *w, long left, long right) { Int32 temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; asort0Int32(v, w, left, lastl); asort0Int32(v, w, lastr, right); } static int asortInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0Int32( (Int32 *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortInt32, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(Int32), sizeof(long), 0, 0, 0, 0); static long searchInt32(long na, Int32 *a, Int32 v) { long i = 0; Int32 *b; while(na > 10) { long mid = na>>1; if (STDC_LE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((STDC_LT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedInt32(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; Int32 *bins; Int32 *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedInt32", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedInt32", nbins, buffers[1], bsizes[1], sizeof(Int32))) return -1; bins = (Int32 *) buffers[1]; if (NA_checkOneCBuffer("searchsortedInt32", niter, buffers[2], bsizes[2], sizeof(Int32))) return -1; values = (Int32 *) buffers[2]; if (NA_checkOneCBuffer("searchsortedInt32", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedInt32", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsInt32: insufficient index space.\n"); return -1; } for(j=0; j 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); if (STDC_LT(*pr,*pm)) SWAP(*pr,*pm); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(*pi,vp)); do --pj; while (STDC_LT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortUInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt32 *pl = (UInt32 *) buffers[0]; UInt32 *pr = pl + niter - 1; quicksort0UInt32(pl, pr); return 0; } UFUNC_DESCR1(quicksortUInt32, sizeof(UInt32)); void aquicksort0UInt32(long *pl, long *pr, UInt32 *v) { UInt32 vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (STDC_LT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(v[*pi],vp)); do --pj; while (STDC_LT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortUInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt32 *v = (UInt32 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0UInt32(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortUInt32, sizeof(UInt32), sizeof(long)); void mergesort0UInt32(UInt32 *pl, UInt32 *pr, UInt32 *pw) { UInt32 vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0UInt32(pl,pm-1,pw); mergesort0UInt32(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortUInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt32 *pl = (UInt32 *) buffers[0]; UInt32 *pr = pl + niter - 1; UInt32 *pw = (UInt32 *) malloc(((1 + niter/2))*sizeof(UInt32)); if (pw != NULL) { mergesort0UInt32(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortUInt32, sizeof(UInt32)); void amergesort0UInt32(long *pl, long *pr, UInt32 *v, long *pw) { UInt32 vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0UInt32(pl,pm-1,v,pw); amergesort0UInt32(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortUInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt32 *v = (UInt32 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0UInt32(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortUInt32, sizeof(UInt32), sizeof(long)); void heapsort0UInt32(UInt32 *a, long n) { UInt32 tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j += 1; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j++; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortUInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt32 *pl = (UInt32 *) buffers[0]; heapsort0UInt32(pl, niter); return 0; } UFUNC_DESCR1(heapsortUInt32, sizeof(UInt32)); void aheapsort0UInt32(long *a, long n, UInt32 *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j += 1; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j++; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortUInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt32 *v = (UInt32 *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0UInt32(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortUInt32, sizeof(UInt32), sizeof(long)); void sort0UInt32(UInt32 *v, long left, long right) { UInt32 temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; sort0UInt32(v, left, lastl); sort0UInt32(v, lastr, right); } static int sortUInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0UInt32( (UInt32 *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortUInt32, sizeof(UInt32)); void asort0UInt32(UInt32 *v, long *w, long left, long right) { UInt32 temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; asort0UInt32(v, w, left, lastl); asort0UInt32(v, w, lastr, right); } static int asortUInt32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0UInt32( (UInt32 *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortUInt32, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(UInt32), sizeof(long), 0, 0, 0, 0); static long searchUInt32(long na, UInt32 *a, UInt32 v) { long i = 0; UInt32 *b; while(na > 10) { long mid = na>>1; if (STDC_LE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((STDC_LT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedUInt32(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; UInt32 *bins; UInt32 *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedUInt32", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedUInt32", nbins, buffers[1], bsizes[1], sizeof(UInt32))) return -1; bins = (UInt32 *) buffers[1]; if (NA_checkOneCBuffer("searchsortedUInt32", niter, buffers[2], bsizes[2], sizeof(UInt32))) return -1; values = (UInt32 *) buffers[2]; if (NA_checkOneCBuffer("searchsortedUInt32", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedUInt32", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsUInt32: insufficient index space.\n"); return -1; } for(j=0; j 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); if (STDC_LT(*pr,*pm)) SWAP(*pr,*pm); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(*pi,vp)); do --pj; while (STDC_LT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortFloat32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Float32 *pl = (Float32 *) buffers[0]; Float32 *pr = pl + niter - 1; quicksort0Float32(pl, pr); return 0; } UFUNC_DESCR1(quicksortFloat32, sizeof(Float32)); void aquicksort0Float32(long *pl, long *pr, Float32 *v) { Float32 vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (STDC_LT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(v[*pi],vp)); do --pj; while (STDC_LT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortFloat32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Float32 *v = (Float32 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0Float32(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortFloat32, sizeof(Float32), sizeof(long)); void mergesort0Float32(Float32 *pl, Float32 *pr, Float32 *pw) { Float32 vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0Float32(pl,pm-1,pw); mergesort0Float32(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortFloat32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Float32 *pl = (Float32 *) buffers[0]; Float32 *pr = pl + niter - 1; Float32 *pw = (Float32 *) malloc(((1 + niter/2))*sizeof(Float32)); if (pw != NULL) { mergesort0Float32(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortFloat32, sizeof(Float32)); void amergesort0Float32(long *pl, long *pr, Float32 *v, long *pw) { Float32 vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0Float32(pl,pm-1,v,pw); amergesort0Float32(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortFloat32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Float32 *v = (Float32 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0Float32(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortFloat32, sizeof(Float32), sizeof(long)); void heapsort0Float32(Float32 *a, long n) { Float32 tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j += 1; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j++; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortFloat32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Float32 *pl = (Float32 *) buffers[0]; heapsort0Float32(pl, niter); return 0; } UFUNC_DESCR1(heapsortFloat32, sizeof(Float32)); void aheapsort0Float32(long *a, long n, Float32 *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j += 1; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j++; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortFloat32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Float32 *v = (Float32 *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0Float32(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortFloat32, sizeof(Float32), sizeof(long)); void sort0Float32(Float32 *v, long left, long right) { Float32 temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; sort0Float32(v, left, lastl); sort0Float32(v, lastr, right); } static int sortFloat32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0Float32( (Float32 *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortFloat32, sizeof(Float32)); void asort0Float32(Float32 *v, long *w, long left, long right) { Float32 temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; asort0Float32(v, w, left, lastl); asort0Float32(v, w, lastr, right); } static int asortFloat32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0Float32( (Float32 *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortFloat32, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(Float32), sizeof(long), 0, 0, 0, 0); static long searchFloat32(long na, Float32 *a, Float32 v) { long i = 0; Float32 *b; while(na > 10) { long mid = na>>1; if (STDC_LE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((STDC_LT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedFloat32(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; Float32 *bins; Float32 *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedFloat32", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedFloat32", nbins, buffers[1], bsizes[1], sizeof(Float32))) return -1; bins = (Float32 *) buffers[1]; if (NA_checkOneCBuffer("searchsortedFloat32", niter, buffers[2], bsizes[2], sizeof(Float32))) return -1; values = (Float32 *) buffers[2]; if (NA_checkOneCBuffer("searchsortedFloat32", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedFloat32", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsFloat32: insufficient index space.\n"); return -1; } for(j=0; j 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); if (STDC_LT(*pr,*pm)) SWAP(*pr,*pm); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(*pi,vp)); do --pj; while (STDC_LT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortFloat64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Float64 *pl = (Float64 *) buffers[0]; Float64 *pr = pl + niter - 1; quicksort0Float64(pl, pr); return 0; } UFUNC_DESCR1(quicksortFloat64, sizeof(Float64)); void aquicksort0Float64(long *pl, long *pr, Float64 *v) { Float64 vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (STDC_LT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(v[*pi],vp)); do --pj; while (STDC_LT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortFloat64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Float64 *v = (Float64 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0Float64(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortFloat64, sizeof(Float64), sizeof(long)); void mergesort0Float64(Float64 *pl, Float64 *pr, Float64 *pw) { Float64 vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0Float64(pl,pm-1,pw); mergesort0Float64(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortFloat64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Float64 *pl = (Float64 *) buffers[0]; Float64 *pr = pl + niter - 1; Float64 *pw = (Float64 *) malloc(((1 + niter/2))*sizeof(Float64)); if (pw != NULL) { mergesort0Float64(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortFloat64, sizeof(Float64)); void amergesort0Float64(long *pl, long *pr, Float64 *v, long *pw) { Float64 vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0Float64(pl,pm-1,v,pw); amergesort0Float64(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortFloat64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Float64 *v = (Float64 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0Float64(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortFloat64, sizeof(Float64), sizeof(long)); void heapsort0Float64(Float64 *a, long n) { Float64 tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j += 1; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j++; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortFloat64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Float64 *pl = (Float64 *) buffers[0]; heapsort0Float64(pl, niter); return 0; } UFUNC_DESCR1(heapsortFloat64, sizeof(Float64)); void aheapsort0Float64(long *a, long n, Float64 *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j += 1; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j++; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortFloat64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Float64 *v = (Float64 *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0Float64(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortFloat64, sizeof(Float64), sizeof(long)); void sort0Float64(Float64 *v, long left, long right) { Float64 temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; sort0Float64(v, left, lastl); sort0Float64(v, lastr, right); } static int sortFloat64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0Float64( (Float64 *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortFloat64, sizeof(Float64)); void asort0Float64(Float64 *v, long *w, long left, long right) { Float64 temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; asort0Float64(v, w, left, lastl); asort0Float64(v, w, lastr, right); } static int asortFloat64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0Float64( (Float64 *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortFloat64, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(Float64), sizeof(long), 0, 0, 0, 0); static long searchFloat64(long na, Float64 *a, Float64 v) { long i = 0; Float64 *b; while(na > 10) { long mid = na>>1; if (STDC_LE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((STDC_LT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedFloat64(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; Float64 *bins; Float64 *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedFloat64", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedFloat64", nbins, buffers[1], bsizes[1], sizeof(Float64))) return -1; bins = (Float64 *) buffers[1]; if (NA_checkOneCBuffer("searchsortedFloat64", niter, buffers[2], bsizes[2], sizeof(Float64))) return -1; values = (Float64 *) buffers[2]; if (NA_checkOneCBuffer("searchsortedFloat64", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedFloat64", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsFloat64: insufficient index space.\n"); return -1; } for(j=0; j 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (NUM_CLT(*pm,*pl)) SWAP(*pm,*pl); if (NUM_CLT(*pr,*pm)) SWAP(*pr,*pm); if (NUM_CLT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (NUM_CLT(*pi,vp)); do --pj; while (NUM_CLT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && NUM_CLT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortComplex32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Complex32 *pl = (Complex32 *) buffers[0]; Complex32 *pr = pl + niter - 1; quicksort0Complex32(pl, pr); return 0; } UFUNC_DESCR1(quicksortComplex32, sizeof(Complex32)); void aquicksort0Complex32(long *pl, long *pr, Complex32 *v) { Complex32 vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (NUM_CLT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (NUM_CLT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (NUM_CLT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (NUM_CLT(v[*pi],vp)); do --pj; while (NUM_CLT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && NUM_CLT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortComplex32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Complex32 *v = (Complex32 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0Complex32(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortComplex32, sizeof(Complex32), sizeof(long)); void mergesort0Complex32(Complex32 *pl, Complex32 *pr, Complex32 *pw) { Complex32 vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0Complex32(pl,pm-1,pw); mergesort0Complex32(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (NUM_CLE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && NUM_CLT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortComplex32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Complex32 *pl = (Complex32 *) buffers[0]; Complex32 *pr = pl + niter - 1; Complex32 *pw = (Complex32 *) malloc(((1 + niter/2))*sizeof(Complex32)); if (pw != NULL) { mergesort0Complex32(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortComplex32, sizeof(Complex32)); void amergesort0Complex32(long *pl, long *pr, Complex32 *v, long *pw) { Complex32 vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0Complex32(pl,pm-1,v,pw); amergesort0Complex32(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (NUM_CLE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && NUM_CLT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortComplex32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Complex32 *v = (Complex32 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0Complex32(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortComplex32, sizeof(Complex32), sizeof(long)); void heapsort0Complex32(Complex32 *a, long n) { Complex32 tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && NUM_CLT(a[j], a[j+1])) j += 1; if (NUM_CLT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && NUM_CLT(a[j], a[j+1])) j++; if (NUM_CLT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortComplex32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Complex32 *pl = (Complex32 *) buffers[0]; heapsort0Complex32(pl, niter); return 0; } UFUNC_DESCR1(heapsortComplex32, sizeof(Complex32)); void aheapsort0Complex32(long *a, long n, Complex32 *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && NUM_CLT(v[a[j]], v[a[j+1]])) j += 1; if (NUM_CLT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && NUM_CLT(v[a[j]], v[a[j+1]])) j++; if (NUM_CLT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortComplex32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Complex32 *v = (Complex32 *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0Complex32(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortComplex32, sizeof(Complex32), sizeof(long)); void sort0Complex32(Complex32 *v, long left, long right) { Complex32 temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (NUM_CLT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && NUM_CEQ(v[last],v[lastl])) --lastl; while((lastr < right) && NUM_CEQ(v[last],v[lastr])) ++lastr; sort0Complex32(v, left, lastl); sort0Complex32(v, lastr, right); } static int sortComplex32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0Complex32( (Complex32 *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortComplex32, sizeof(Complex32)); void asort0Complex32(Complex32 *v, long *w, long left, long right) { Complex32 temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (NUM_CLT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && NUM_CEQ(v[last],v[lastl])) --lastl; while((lastr < right) && NUM_CEQ(v[last],v[lastr])) ++lastr; asort0Complex32(v, w, left, lastl); asort0Complex32(v, w, lastr, right); } static int asortComplex32(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0Complex32( (Complex32 *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortComplex32, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(Complex32), sizeof(long), 0, 0, 0, 0); static long searchComplex32(long na, Complex32 *a, Complex32 v) { long i = 0; Complex32 *b; while(na > 10) { long mid = na>>1; if (NUM_CLE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((NUM_CLT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedComplex32(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; Complex32 *bins; Complex32 *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedComplex32", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedComplex32", nbins, buffers[1], bsizes[1], sizeof(Complex32))) return -1; bins = (Complex32 *) buffers[1]; if (NA_checkOneCBuffer("searchsortedComplex32", niter, buffers[2], bsizes[2], sizeof(Complex32))) return -1; values = (Complex32 *) buffers[2]; if (NA_checkOneCBuffer("searchsortedComplex32", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedComplex32", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsComplex32: insufficient index space.\n"); return -1; } for(j=0; j 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (NUM_CLT(*pm,*pl)) SWAP(*pm,*pl); if (NUM_CLT(*pr,*pm)) SWAP(*pr,*pm); if (NUM_CLT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (NUM_CLT(*pi,vp)); do --pj; while (NUM_CLT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && NUM_CLT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortComplex64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Complex64 *pl = (Complex64 *) buffers[0]; Complex64 *pr = pl + niter - 1; quicksort0Complex64(pl, pr); return 0; } UFUNC_DESCR1(quicksortComplex64, sizeof(Complex64)); void aquicksort0Complex64(long *pl, long *pr, Complex64 *v) { Complex64 vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (NUM_CLT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (NUM_CLT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (NUM_CLT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (NUM_CLT(v[*pi],vp)); do --pj; while (NUM_CLT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && NUM_CLT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortComplex64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Complex64 *v = (Complex64 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0Complex64(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortComplex64, sizeof(Complex64), sizeof(long)); void mergesort0Complex64(Complex64 *pl, Complex64 *pr, Complex64 *pw) { Complex64 vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0Complex64(pl,pm-1,pw); mergesort0Complex64(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (NUM_CLE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && NUM_CLT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortComplex64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Complex64 *pl = (Complex64 *) buffers[0]; Complex64 *pr = pl + niter - 1; Complex64 *pw = (Complex64 *) malloc(((1 + niter/2))*sizeof(Complex64)); if (pw != NULL) { mergesort0Complex64(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortComplex64, sizeof(Complex64)); void amergesort0Complex64(long *pl, long *pr, Complex64 *v, long *pw) { Complex64 vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0Complex64(pl,pm-1,v,pw); amergesort0Complex64(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (NUM_CLE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && NUM_CLT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortComplex64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Complex64 *v = (Complex64 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0Complex64(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortComplex64, sizeof(Complex64), sizeof(long)); void heapsort0Complex64(Complex64 *a, long n) { Complex64 tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && NUM_CLT(a[j], a[j+1])) j += 1; if (NUM_CLT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && NUM_CLT(a[j], a[j+1])) j++; if (NUM_CLT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortComplex64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Complex64 *pl = (Complex64 *) buffers[0]; heapsort0Complex64(pl, niter); return 0; } UFUNC_DESCR1(heapsortComplex64, sizeof(Complex64)); void aheapsort0Complex64(long *a, long n, Complex64 *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && NUM_CLT(v[a[j]], v[a[j+1]])) j += 1; if (NUM_CLT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && NUM_CLT(v[a[j]], v[a[j+1]])) j++; if (NUM_CLT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortComplex64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Complex64 *v = (Complex64 *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0Complex64(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortComplex64, sizeof(Complex64), sizeof(long)); void sort0Complex64(Complex64 *v, long left, long right) { Complex64 temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (NUM_CLT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && NUM_CEQ(v[last],v[lastl])) --lastl; while((lastr < right) && NUM_CEQ(v[last],v[lastr])) ++lastr; sort0Complex64(v, left, lastl); sort0Complex64(v, lastr, right); } static int sortComplex64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0Complex64( (Complex64 *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortComplex64, sizeof(Complex64)); void asort0Complex64(Complex64 *v, long *w, long left, long right) { Complex64 temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (NUM_CLT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && NUM_CEQ(v[last],v[lastl])) --lastl; while((lastr < right) && NUM_CEQ(v[last],v[lastr])) ++lastr; asort0Complex64(v, w, left, lastl); asort0Complex64(v, w, lastr, right); } static int asortComplex64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0Complex64( (Complex64 *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortComplex64, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(Complex64), sizeof(long), 0, 0, 0, 0); static long searchComplex64(long na, Complex64 *a, Complex64 v) { long i = 0; Complex64 *b; while(na > 10) { long mid = na>>1; if (NUM_CLE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((NUM_CLT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedComplex64(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; Complex64 *bins; Complex64 *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedComplex64", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedComplex64", nbins, buffers[1], bsizes[1], sizeof(Complex64))) return -1; bins = (Complex64 *) buffers[1]; if (NA_checkOneCBuffer("searchsortedComplex64", niter, buffers[2], bsizes[2], sizeof(Complex64))) return -1; values = (Complex64 *) buffers[2]; if (NA_checkOneCBuffer("searchsortedComplex64", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedComplex64", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsComplex64: insufficient index space.\n"); return -1; } for(j=0; j 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); if (STDC_LT(*pr,*pm)) SWAP(*pr,*pm); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(*pi,vp)); do --pj; while (STDC_LT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int64 *pl = (Int64 *) buffers[0]; Int64 *pr = pl + niter - 1; quicksort0Int64(pl, pr); return 0; } UFUNC_DESCR1(quicksortInt64, sizeof(Int64)); void aquicksort0Int64(long *pl, long *pr, Int64 *v) { Int64 vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (STDC_LT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(v[*pi],vp)); do --pj; while (STDC_LT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int64 *v = (Int64 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0Int64(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortInt64, sizeof(Int64), sizeof(long)); void mergesort0Int64(Int64 *pl, Int64 *pr, Int64 *pw) { Int64 vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0Int64(pl,pm-1,pw); mergesort0Int64(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int64 *pl = (Int64 *) buffers[0]; Int64 *pr = pl + niter - 1; Int64 *pw = (Int64 *) malloc(((1 + niter/2))*sizeof(Int64)); if (pw != NULL) { mergesort0Int64(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortInt64, sizeof(Int64)); void amergesort0Int64(long *pl, long *pr, Int64 *v, long *pw) { Int64 vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0Int64(pl,pm-1,v,pw); amergesort0Int64(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int64 *v = (Int64 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0Int64(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortInt64, sizeof(Int64), sizeof(long)); void heapsort0Int64(Int64 *a, long n) { Int64 tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j += 1; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j++; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int64 *pl = (Int64 *) buffers[0]; heapsort0Int64(pl, niter); return 0; } UFUNC_DESCR1(heapsortInt64, sizeof(Int64)); void aheapsort0Int64(long *a, long n, Int64 *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j += 1; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j++; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { Int64 *v = (Int64 *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0Int64(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortInt64, sizeof(Int64), sizeof(long)); void sort0Int64(Int64 *v, long left, long right) { Int64 temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; sort0Int64(v, left, lastl); sort0Int64(v, lastr, right); } static int sortInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0Int64( (Int64 *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortInt64, sizeof(Int64)); void asort0Int64(Int64 *v, long *w, long left, long right) { Int64 temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; asort0Int64(v, w, left, lastl); asort0Int64(v, w, lastr, right); } static int asortInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0Int64( (Int64 *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortInt64, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(Int64), sizeof(long), 0, 0, 0, 0); static long searchInt64(long na, Int64 *a, Int64 v) { long i = 0; Int64 *b; while(na > 10) { long mid = na>>1; if (STDC_LE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((STDC_LT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedInt64(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; Int64 *bins; Int64 *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedInt64", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedInt64", nbins, buffers[1], bsizes[1], sizeof(Int64))) return -1; bins = (Int64 *) buffers[1]; if (NA_checkOneCBuffer("searchsortedInt64", niter, buffers[2], bsizes[2], sizeof(Int64))) return -1; values = (Int64 *) buffers[2]; if (NA_checkOneCBuffer("searchsortedInt64", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedInt64", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsInt64: insufficient index space.\n"); return -1; } for(j=0; j 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); if (STDC_LT(*pr,*pm)) SWAP(*pr,*pm); if (STDC_LT(*pm,*pl)) SWAP(*pm,*pl); vp = *pm; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(*pi,vp)); do --pj; while (STDC_LT(vp,*pj)); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, *pt);) { *pj-- = *pt--; } *pj = vp; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int quicksortUInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt64 *pl = (UInt64 *) buffers[0]; UInt64 *pr = pl + niter - 1; quicksort0UInt64(pl, pr); return 0; } UFUNC_DESCR1(quicksortUInt64, sizeof(UInt64)); void aquicksort0UInt64(long *pl, long *pr, UInt64 *v) { UInt64 vp; long SWAP_temp; long *stack[100], **sptr = stack, *pm, *pi, *pj, *pt, vi; for(;;) { while ((pr - pl) > 15) { /* quicksort partition */ pm = pl + ((pr - pl) >> 1); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); if (STDC_LT(v[*pr],v[*pm])) SWAP(*pr,*pm); if (STDC_LT(v[*pm],v[*pl])) SWAP(*pm,*pl); vp = v[*pm]; pi = pl; pj = pr - 1; SWAP(*pm,*pj); for(;;) { do ++pi; while (STDC_LT(v[*pi],vp)); do --pj; while (STDC_LT(vp,v[*pj])); if (pi >= pj) break; SWAP(*pi,*pj); } SWAP(*pi,*(pr-1)); /* push largest partition on stack */ if (pi - pl < pr - pi) { *sptr++ = pi + 1; *sptr++ = pr; pr = pi - 1; }else{ *sptr++ = pl; *sptr++ = pi - 1; pl = pi + 1; } } /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pt = pi - 1; pj > pl && STDC_LT(vp, v[*pt]);) { *pj-- = *pt--; } *pj = vi; } if (sptr == stack) break; pr = *(--sptr); pl = *(--sptr); } } static int aquicksortUInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt64 *v = (UInt64 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; aquicksort0UInt64(pl, pr, v); return 0; } UFUNC_DESCR2(aquicksortUInt64, sizeof(UInt64), sizeof(long)); void mergesort0UInt64(UInt64 *pl, UInt64 *pr, UInt64 *pw) { UInt64 vp, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); mergesort0UInt64(pl,pm-1,pw); mergesort0UInt64(pm,pr,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(*pk,*pj)) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vp = *pi; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, *pk); --pj, --pk) { *pj = *pk; } *pj = vp; } } } static int mergesortUInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt64 *pl = (UInt64 *) buffers[0]; UInt64 *pr = pl + niter - 1; UInt64 *pw = (UInt64 *) malloc(((1 + niter/2))*sizeof(UInt64)); if (pw != NULL) { mergesort0UInt64(pl, pr, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR1(mergesortUInt64, sizeof(UInt64)); void amergesort0UInt64(long *pl, long *pr, UInt64 *v, long *pw) { UInt64 vp; long vi, *pi, *pj, *pk, *pm; if (pr - pl > 20) { /* merge sort */ pm = pl + ((pr - pl + 1)>>1); amergesort0UInt64(pl,pm-1,v,pw); amergesort0UInt64(pm,pr,v,pw); for(pi = pw, pj = pl; pj < pm; ++pi, ++pj) { *pi = *pj; } for(pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) { if (STDC_LE(v[*pk],v[*pj])) { *pm = *pk; ++pk; }else{ *pm = *pj; ++pj; } } for(; pk < pi; ++pm, ++pk) { *pm = *pk; } }else{ /* insertion sort */ for(pi = pl + 1; pi <= pr; ++pi) { vi = *pi; vp = v[vi]; for(pj = pi, pk = pi - 1; pj > pl && STDC_LT(vp, v[*pk]); --pj, --pk) { *pj = *pk; } *pj = vi; } } } static int amergesortUInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt64 *v = (UInt64 *) buffers[0]; long *pl = (long *) buffers[1]; long *pr = pl + niter - 1; long *pw = (long *) malloc(((1 + niter/2))*sizeof(long)); if (pw != NULL) { amergesort0UInt64(pl, pr, v, pw); free(pw); return 0; }else{ return -1; } } UFUNC_DESCR2(amergesortUInt64, sizeof(UInt64), sizeof(long)); void heapsort0UInt64(UInt64 *a, long n) { UInt64 tmp; long i,j,l; /* The array needs to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j += 1; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(a[j], a[j+1])) j++; if (STDC_LT(tmp, a[j])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int heapsortUInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt64 *pl = (UInt64 *) buffers[0]; heapsort0UInt64(pl, niter); return 0; } UFUNC_DESCR1(heapsortUInt64, sizeof(UInt64)); void aheapsort0UInt64(long *a, long n, UInt64 *v) { long i,j,l, tmp; /* The arrays need to be offset by one for heapsort indexing */ a -= 1; for (l = n>>1; l > 0; --l) { tmp = a[l]; for (i = l, j = l<<1; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j += 1; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } for (; n > 1;) { tmp = a[n]; a[n] = a[1]; n -= 1; for (i = 1, j = 2; j <= n;) { if (j < n && STDC_LT(v[a[j]], v[a[j+1]])) j++; if (STDC_LT(v[tmp], v[a[j]])) { a[i] = a[j]; i = j; j += j; }else break; } a[i] = tmp; } } static int aheapsortUInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { UInt64 *v = (UInt64 *) buffers[0]; long *pl = (long *) buffers[1]; aheapsort0UInt64(pl, niter, v); return 0; } UFUNC_DESCR2(aheapsortUInt64, sizeof(UInt64), sizeof(long)); void sort0UInt64(UInt64 *v, long left, long right) { UInt64 temp; long i, last, lastl, lastr, diff; diff = right - left; if (diff <= 0) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); /* Split array into values < pivot, and values > pivot. */ swap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; swap(last, i); } swap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; sort0UInt64(v, left, lastl); sort0UInt64(v, lastr, right); } static int sortUInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS sort0UInt64( (UInt64 *) buffers[0], 0, niter-1); END_THREADS return 0; } UFUNC_DESCR1(sortUInt64, sizeof(UInt64)); void asort0UInt64(UInt64 *v, long *w, long left, long right) { UInt64 temp; long wtemp, i, last, lastl, lastr; if (left >= right) return; /* choose the pivot randomly. */ i = left + (int) (((right-left)*1.0*rand())/(RAND_MAX+1.0)); wswap(left, i); last = left; for(i=left+1; i<=right; i++) if (STDC_LT(v[i], v[left])) { ++ last; wswap(last, i); } wswap(left, last); lastl = last-1; lastr = last+1; /* Exclude values equal to pivot from recursion */ while((left < lastl) && STDC_EQ(v[last],v[lastl])) --lastl; while((lastr < right) && STDC_EQ(v[last],v[lastr])) ++lastr; asort0UInt64(v, w, left, lastl); asort0UInt64(v, w, lastr, right); } static int asortUInt64(long niter, long ninargs, long noutargs, void **buffers, long *bsizes) { BEGIN_THREADS asort0UInt64( (UInt64 *) buffers[0], (long *) buffers[1], 0, niter-1); END_THREADS return 0; } CFUNC_DESCR(asortUInt64, CFUNC_UFUNC, CHECK_ALIGN, 0, 2, sizeof(UInt64), sizeof(long), 0, 0, 0, 0); static long searchUInt64(long na, UInt64 *a, UInt64 v) { long i = 0; UInt64 *b; while(na > 10) { long mid = na>>1; if (STDC_LE(v, a[mid])) na = mid; else { i += mid; a += mid; na -= mid; } } b = a; while((STDC_LT(*b, v)) && na--) ++ b; return i+(b-a); } static int searchsortedUInt64(int niter, int ninargs, int noutargs, void **buffers, long *bsizes) { maybelong nbins; UInt64 *bins; UInt64 *values; long *indices; maybelong i; if (NA_checkOneCBuffer("searchsortedUInt64", 1, buffers[0], bsizes[0], sizeof(maybelong))) return -1; nbins = *(maybelong *) buffers[0]; if (NA_checkOneCBuffer("searchsortedUInt64", nbins, buffers[1], bsizes[1], sizeof(UInt64))) return -1; bins = (UInt64 *) buffers[1]; if (NA_checkOneCBuffer("searchsortedUInt64", niter, buffers[2], bsizes[2], sizeof(UInt64))) return -1; values = (UInt64 *) buffers[2]; if (NA_checkOneCBuffer("searchsortedUInt64", niter, buffers[3], bsizes[3], sizeof(long))) return -1; indices = (long *) buffers[3]; if (NA_checkIo("searchsortedUInt64", 3, 1, ninargs, noutargs)) return -1; BEGIN_THREADS for(i=0; i= minbsize) { PyErr_Format(PyExc_ValueError, "nonzeroCoordsUInt64: insufficient index space.\n"); return -1; } for(j=0; j