From 8c8c6a9253ec2876f67217a8f10755b4ad7f3ec1 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Sun, 26 Apr 2020 19:21:19 -0700 Subject: fix: now properly sort arrays with inline functions --- sys/libbio/align.c | 46 +++++++++++++++++++++++++++++++++++----------- sys/libbio/test.c | 2 +- 2 files changed, 36 insertions(+), 12 deletions(-) (limited to 'sys') diff --git a/sys/libbio/align.c b/sys/libbio/align.c index bcb6fd3..8d1c119 100644 --- a/sys/libbio/align.c +++ b/sys/libbio/align.c @@ -1,5 +1,6 @@ #include #include +#include #include // ----------------------------------------------------------------------- @@ -70,6 +71,22 @@ murmurhash(uint64 x, uint64 mask) // ----------------------------------------------------------------------- // Locality sensitive hashing (with spatial extent) +static +void +sortpos(uintptr len, uint64 vals[], int locs[]) +{ + int tmpi; + uint64 tmpu64; + +#define LESS(i, j) (locs[i] < locs[j]) +#define SWAP(i, j) (tmpu64 = vals[i], tmpi = locs[i], \ + vals[i] = vals[j], locs[i] = locs[j], \ + vals[j] = tmpu64 , locs[j] = tmpi) + QSORT(len, LESS, SWAP); +#undef LESS +#undef SWAP +} + error aln·sketch(byte *seq, int L, uint64 *vals[aln·N], int *locs[aln·N]) { @@ -113,32 +130,39 @@ aln·sketch(byte *seq, int L, uint64 *vals[aln·N], int *locs[aln·N]) } } - // TODO: Sort vals by their locs + for (n = 0; n < aln·N; n++) { + sortpos(L, vals[n], locs[n]); + } return 0; } static int -compare(void *a, void *b) +cmparrs(int L, uint64 a[], uint64 b[]) { int l; - uint64 *a64, *b64; - a64 = (uint64*)a; - b64 = (uint64*)b; - for (l = 0; l < aln·L; l++) { - if (a64 < b64) return -1; - if (a64 > b64) return +1; + for (l = 0; l < L; l++) { + if (a[l] < b[l]) return -1; } - return 0; + return +1; } // TODO: replace with inlined version error -aln·sort(int len, int l, uint64 *vals) +aln·sort(uintptr len, int L, uint64 *vals) { - qsort(vals, len, l*sizeof(uint64), &compare); + uint64 tmp[128]; +#define LESS(i, j) (cmparrs((L), (vals+(i)*L), (vals+(j)*L))) +#define SWAP(i, j) (memcpy(tmp, (vals+(i)*L), (sizeof(uint64)*L)), \ + memcpy((vals+(i)*L), (vals+(j)*L), (sizeof(uint64)*L)), \ + memcpy((vals+(j)*L), tmp, (sizeof(uint64)*L))) + + QSORT(len, LESS, SWAP); +#undef LESS +#undef SWAP + // qsort(vals, len, l*sizeof(uint64), &compare); return 0; } diff --git a/sys/libbio/test.c b/sys/libbio/test.c index fec0a0c..aa14382 100644 --- a/sys/libbio/test.c +++ b/sys/libbio/test.c @@ -241,7 +241,7 @@ main() for (i = 0; i < arrlen(SEQ); i++) { printf("["); for (l = 0; l < aln·L; l++) { - printf("%d,", loc[n][i][l]); + printf("%lu,", mem[n][i][l]); } printf("]"); if (i == 0) printf(" ~ "); -- cgit v1.2.1