Port all the integer monadic ∊ methods to ⊒
This commit is contained in:
parent
f54942f175
commit
98cd80c13d
@ -39,7 +39,7 @@ B memberOf_c1(B t, B x) {
|
|||||||
u32* v0 = (u32*)i32any_ptr(x);
|
u32* v0 = (u32*)i32any_ptr(x);
|
||||||
i8* r0; B r = m_i8arrv(&r0, n);
|
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
|
// Allocations count radix hash deradix
|
||||||
usz *c0 = (usz*)(alloc); // rx X-----------------X
|
usz *c0 = (usz*)(alloc); // rx X-----------------X
|
||||||
usz *c1 = (usz*)(c0+rx); // 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);
|
if (RNK(x)>1) x = toCells(x);
|
||||||
u8 xe = TI(x,elType);
|
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; i<n; i++) { \
|
||||||
|
usz c=0; i##T xi=xp[i]; \
|
||||||
|
for (usz j=0; j<i; j++) c += xi==xp[j]; \
|
||||||
|
rp[i] = c; \
|
||||||
|
} \
|
||||||
|
decG(x); return r;
|
||||||
#define LOOKUP(T) \
|
#define LOOKUP(T) \
|
||||||
usz tn = 1<<T; \
|
usz tn = 1<<T; \
|
||||||
u##T* xp = (u##T*)i##T##any_ptr(x); \
|
u##T* xp = (u##T*)i##T##any_ptr(x); \
|
||||||
i32* rp; B r = m_i32arrv(&rp, n); \
|
i32* rp; B r = m_i32arrv(&rp, n); \
|
||||||
TALLOC(i32, tab, tn); \
|
TALLOC(i32, tab, tn); \
|
||||||
for (usz j=0; j<tn; j++) tab[j]=0; \
|
if (T>8 && n<tn/16) for (usz i=0; i<n; i++) tab[xp[i]]=0; \
|
||||||
for (usz i=0; i<n; i++) rp[i]=tab[xp[i]]++; \
|
else for (usz j=0; j<tn; j++) tab[j]=0; \
|
||||||
decG(x); TFREE(tab); \
|
for (usz i=0; i<n; i++) rp[i]=tab[xp[i]]++; \
|
||||||
|
decG(x); TFREE(tab); \
|
||||||
return num_squeeze(r)
|
return num_squeeze(r)
|
||||||
if (n>=16 && xe==el_i8 && n<=(usz)I32_MAX+1) { LOOKUP(8); }
|
if (n<=(usz)I32_MAX+1) {
|
||||||
if (n>=256 && xe==el_i16 && n<=(usz)I32_MAX+1) { LOOKUP(16); }
|
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
|
#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<n; i++) { u32 v=v0[i]; c0[(u8)(v>>24)]++; c1[(u8)(v>>16)]++; }
|
||||||
|
// Exclusive prefix sum
|
||||||
|
usz s0=0, s1=0;
|
||||||
|
for (usz j=0; j<rx; j++) {
|
||||||
|
usz p0 = s0, p1 = s1;
|
||||||
|
s0 += c0[j]; s1 += c1[j];
|
||||||
|
c0[j] = p0; c1[j] = p1;
|
||||||
|
}
|
||||||
|
// Radix moves
|
||||||
|
for (usz i=0; i<n; i++) { u32 v=v0[i]; u8 k=k0[i]=(u8)(v>>24); usz c=c0[k]++; v1[c]=v; }
|
||||||
|
for (usz i=0; i<n; i++) { u32 v=v1[i]; u8 k=k1[i]=(u8)(v>>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<n; ) {
|
||||||
|
for (; ; l++) { u32 v=v2[l], t0=tv; tv=v>>16; if (tv!=t0) break; tab[(u16)v]=0; }
|
||||||
|
for (; i<l; i++) { u32 j=(u16)v2[i]; r2[i]=tab[j]++; }
|
||||||
|
}
|
||||||
|
// Radix unmoves
|
||||||
|
memmove(c0+1, c0, (2*rx-1)*sizeof(usz)); c0[0]=c1[0]=0;
|
||||||
|
for (usz i=0; i<n; i++) { r1[i]=r2[c1[k1[i]]++]; }
|
||||||
|
for (usz i=0; i<n; i++) { r0[i]=r1[c0[k0[i]]++]; }
|
||||||
|
decG(x); TFREE(alloc);
|
||||||
|
return num_squeeze(r);
|
||||||
|
}
|
||||||
|
#undef BRUTE
|
||||||
|
|
||||||
i32* rp; B r = m_i32arrv(&rp, n);
|
i32* rp; B r = m_i32arrv(&rp, n);
|
||||||
H_b2i* map = m_b2i(64);
|
H_b2i* map = m_b2i(64);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user