aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2020-04-26 19:21:19 -0700
committerNicholas Noll <nbnoll@eml.cc>2020-04-26 19:21:19 -0700
commit8c8c6a9253ec2876f67217a8f10755b4ad7f3ec1 (patch)
tree9f225c0f0157c15fd09954394948b1a9a8b11161 /sys
parentea845a58272658b7716345855b05631bcb296605 (diff)
fix: now properly sort arrays with inline functions
Diffstat (limited to 'sys')
-rw-r--r--sys/libbio/align.c46
-rw-r--r--sys/libbio/test.c2
2 files changed, 36 insertions, 12 deletions
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 <u.h>
#include <libn.h>
+#include <libn/macro/qsort.h>
#include <libbio.h>
// -----------------------------------------------------------------------
@@ -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(" ~ ");