From 633e790099b75a503c50e82a2964ea6b73ee094b Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Tue, 23 Aug 2022 21:48:10 -0400 Subject: [PATCH] =?UTF-8?q?Radix-assisted=20lookup=20implementation=20for?= =?UTF-8?q?=20=E2=88=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/fns.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/builtins/fns.c b/src/builtins/fns.c index 4912d416..aa83f32c 100644 --- a/src/builtins/fns.c +++ b/src/builtins/fns.c @@ -239,6 +239,55 @@ B memberOf_c1(B t, B x) { if (isAtm(x) || RNK(x)==0) thrM("∊: Argument cannot have rank 0"); if (RNK(x)!=1) x = toCells(x); usz xia = IA(x); + + // Radix-assisted lookup + if (xia>=256 && TI(x,elType)==el_i32) { + usz rx = 256, tn = 1<<16; // Radix; table length + usz n = xia; + u32* v0 = (u32*)i32any_ptr(x); + i8* r0; B r = m_i8arrv(&r0, n); + + TALLOC(u8, alloc, 9*n+(tn+2*rx*sizeof(usz))); + // Allocations count radix hash deradix + usz *c0 = (usz*)(alloc); // rx X-----------------X + usz *c1 = (usz*)(c0+rx); // rx X-----------------X + u8 *k0 = (u8 *)(c1+rx); // n X-----------------X + u8 *k1 = (u8 *)(k0+n); // --/----------X + u32 *v1 = (u32*)(k1); // n X-X + u32 *v2 = (u32*)(v1+n); // n X----------X + u8 *r2 = (u8 *)(k1+n); + u8 *r1 = (u8 *)(r2+n); + u8 *tab= (u8 *)(v2+n); // tn + + // Count keys + for (usz j=0; j<2*rx; j++) c0[j] = 0; + for (usz i=0; i>24)]++; c1[(u8)(v>>16)]++; } + // Exclusive prefix sum + usz s0=0, s1=0; + for (usz j=0; j>24); usz c=c0[k]++; v1[c]=v; } + for (usz i=0; i>16); usz c=c1[k]++; v2[c]=v; } + // Table lookup + for (usz j=0; j>16; usz e=0; + for (usz i=0; i>16; + // Clear table when top bytes change + if (RARE(tv!=t0)) { for (; e