From 5cd2cab26ebf267a9ced95214dbb0acf676704b1 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Wed, 24 Aug 2022 18:27:11 -0400 Subject: [PATCH] =?UTF-8?q?Small-number=20integer=20=E2=88=8A=20with=20all?= =?UTF-8?q?-pairs=20comparison=20and=202-byte=20radix+table?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/selfsearch.c | 52 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/src/builtins/selfsearch.c b/src/builtins/selfsearch.c index f2d79d0a..2d3c0169 100644 --- a/src/builtins/selfsearch.c +++ b/src/builtins/selfsearch.c @@ -10,6 +10,15 @@ B memberOf_c1(B t, B x) { if (RNK(x)>1) x = toCells(x); u8 xe = TI(x,elType); + #define BRUTE(T) \ + i##T* xp = i##T##any_ptr(x); \ + u64* rp; B r = m_bitarrv(&rp, n); bitp_set(rp, 0, 1); \ + for (usz i=1; i=16 && xe==el_i8) { LOOKUP(8); } - if (n>=256 && xe==el_i16) { LOOKUP(16); } + if (xe==el_i8) { if (n<8) { BRUTE(8); } else { LOOKUP(8); } } + if (xe==el_i16) { + if (n<16) { BRUTE(16); } + if (n>=256) { LOOKUP(16); } + // Radix-assisted lookup + usz rx = 256, tn = 256; // Radix; table length + u16* v0 = (u16*)i16any_ptr(x); + i8* r0; B r = m_i8arrv(&r0, n); + TALLOC(u8, alloc, 4*n+(tn+rx)); + u8 *c0 = alloc; + u8 *k0 = c0+rx; + u16 *v1 = (u16*)(k0+n); + u8 *r1 = (u8*)(v1+n); + u8 *tab= r1+n; + // Count keys + for (usz j=0; j>8)]++; + // Exclusive prefix sum + usz s=0; for (usz j=0; j>8); usz c=c0[k]++; v1[c]=v; } + // Table lookup + for (usz j=0; j>8; + for (usz i=0, e=0; i>8; + if (tv!=t0) { for (; e=256 && xe==el_i32) { usz rx = 256, tn = 1<<16; // Radix; table length u32* v0 = (u32*)i32any_ptr(x); @@ -69,6 +112,7 @@ B memberOf_c1(B t, B x) { decG(x); TFREE(alloc); return num_squeeze(r); } + #undef BRUTE u64* rp; B r = m_bitarrv(&rp, n); H_Sb* set = m_Sb(64); @@ -93,7 +137,7 @@ B count_c1(B t, B x) { for (usz j=0; j=16 && xe==el_i8 && n<=(usz)I32_MAX+1) { LOOKUP(8); } if (n>=256 && xe==el_i16 && n<=(usz)I32_MAX+1) { LOOKUP(16); } #undef LOOKUP @@ -129,7 +173,7 @@ B indexOf_c1(B t, B x) { if (t==n) rp[i]=tab[j]=u++; else rp[i]=t; \ } \ decG(x); TFREE(tab); \ - return r + return num_squeeze(r) if (n>=16 && xe==el_i8 && n<=(usz)I32_MAX+1) { LOOKUP(8); } if (n>=256 && xe==el_i16 && n<=(usz)I32_MAX+1) { LOOKUP(16); } #undef LOOKUP