diff --git a/src/builtins/selfsearch.c b/src/builtins/selfsearch.c index 1b2ae2c9..2c219045 100644 --- a/src/builtins/selfsearch.c +++ b/src/builtins/selfsearch.c @@ -39,7 +39,7 @@ B memberOf_c1(B t, B x) { u32* v0 = (u32*)i32any_ptr(x); i8* r0; B r = m_i8arrv(&r0, n); - TALLOC(u8, alloc, 9*n+(1+tn+2*rx*sizeof(usz))); + TALLOC(u8, alloc, 9*n+(4+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 @@ -94,18 +94,76 @@ B count_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); \ + i8* rp; B r = m_i8arrv(&rp, n); rp[0]=0; \ + for (usz i=1; i8 && 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); } + if (n<=(usz)I32_MAX+1) { + if (xe==el_i8) { if (n<12) { BRUTE(8); } else { LOOKUP(8); } } + if (xe==el_i16) { if (n<12) { BRUTE(16); } else { LOOKUP(16); } } + } #undef LOOKUP + if (xe==el_i32) { + if (n<=32) { BRUTE(32); } + // Radix-assisted lookup + usz rx = 256, tn = 1<<16; // Radix; table length + u32* v0 = (u32*)i32any_ptr(x); + i32* r0; B r = m_i32arrv(&r0, n); + + TALLOC(u8, alloc, 10*n+(4+4*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); // n X-X + u32 *v2 = (u32*)(v1+n); // n X----------X + u32 *r2 = (u32*)v2; + u32 *r1 = (u32*)v1; + u32 *tab= (u32*)(v2+n+1); // 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 + u32 tv=v2[0]>>16; v2[n]=~v2[n-1]; + for (usz l=0, i=0; l>16; if (tv!=t0) break; tab[(u16)v]=0; } + for (; i