more cleanup

This commit is contained in:
dzaima 2022-09-20 18:57:19 +03:00
parent f231a30057
commit 42e36851b9
2 changed files with 39 additions and 38 deletions

View File

@ -62,25 +62,25 @@ B group_c2(B t, B w, B x) {
#undef CASE #undef CASE
if (bad) thrM("⊔: 𝕨 can't contain elements less than ¯1"); if (bad) thrM("⊔: 𝕨 can't contain elements less than ¯1");
if (ria > (i64)(USZ_MAX)) thrOOM(); if (ria > (i64)(USZ_MAX)) thrOOM();
Arr* r = arr_shVec(m_fillarrp(ria)); fillarr_setFill(r, m_f64(0)); Arr* r = arr_shVec(m_fillarrp(ria)); fillarr_setFill(r, m_f64(0));
B* rp = fillarr_ptr(r); B* rp = fillarr_ptr(r);
for (usz i = 0; i < ria; i++) rp[i] = m_f64(0); // don't break if allocation errors for (usz i = 0; i < ria; i++) rp[i] = m_f64(0); // don't break if allocation errors
B xf = getFillQ(x); B xf = getFillQ(x);
Arr* rf = m_fillarrp(0); if (xr==1) arr_shVec(rf); else arr_shChangeLen(rf, xr, xsh, 0); Arr* rf = m_fillarrp(0); if (xr==1) arr_shVec(rf); else arr_shChangeLen(rf, xr, xsh, 0);
fillarr_setFill(rf, m_f64(0)); fillarr_setFill(rf, m_f64(0));
B z = taga(rf); B z = taga(rf);
fillarr_setFill(r, z); fillarr_setFill(r, z);
TALLOC(i32, pos, 2*ria+1); i32* len = pos+ria+1;
// Both cases needed to make sure wia>0 for ip[wia-1] below // Both cases needed to make sure wia>0 for ip[wia-1] below
if (ria==0) goto intvec_ret; if (ria==0) goto setfill_dec_ret;
if (neg==xia) { if (neg==xia) {
for (usz i = 0; i < ria; i++) rp[i] = inc(z); for (usz i = 0; i < ria; i++) rp[i] = inc(z);
goto intvec_ret; goto setfill_dec_ret;
} }
TALLOC(i32, pos, 2*ria+1); i32* len = pos+ria+1;
bool notB = TI(x,elType) != el_B; bool notB = TI(x,elType) != el_B;
u8 xt = arrNewType(TY(x)); u8 xt = arrNewType(TY(x));
u8 xl = arrTypeBitsLog(TY(x)); u8 xl = arrTypeBitsLog(TY(x));
@ -90,7 +90,7 @@ B group_c2(B t, B w, B x) {
if (RARE(xr>1)) { if (RARE(xr>1)) {
width *= csz = arr_csz(x); width *= csz = arr_csz(x);
xl += CTZ(csz); xl += CTZ(csz);
if (bits && xl>=3) { bits=1; width>>=3; } if (bits && xl>=3) { bits=0; width>>=3; }
if ((csz & (csz-1)) || xl>7) xl = 7; if ((csz & (csz-1)) || xl>7) xl = 7;
} }
if (xia>64 && notB && !bits && change<(xia*width)/32) { if (xia>64 && notB && !bits && change<(xia*width)/32) {
@ -106,7 +106,7 @@ B group_c2(B t, B w, B x) {
if (TI(ind,elType)!=el_i32) ind = taga(cpyI32Arr(ind)); if (TI(ind,elType)!=el_i32) ind = taga(cpyI32Arr(ind));
if (TI(w ,elType)!=el_i32) w = taga(cpyI32Arr(w )); if (TI(w ,elType)!=el_i32) w = taga(cpyI32Arr(w ));
wia = IA(ind); wia = IA(ind);
i32* ip = i32any_ptr(ind); i32* ip = i32any_ptr(ind);
i32* wp = i32any_ptr(w); i32* wp = i32any_ptr(w);
usz i0 = ip[0]; usz i0 = ip[0];
@ -114,9 +114,9 @@ B group_c2(B t, B w, B x) {
ip[wia-1] = xia-ip[wia-1]; ip[wia-1] = xia-ip[wia-1];
for (usz i = 0; i < ria; i++) len[i] = pos[i] = 0; for (usz i = 0; i < ria; i++) len[i] = pos[i] = 0;
for (usz i = 0; i < wia; i++) len[wp[i]]+=ip[i]; for (usz i = 0; i < wia; i++) len[wp[i]]+=ip[i];
void* xp = tyany_ptr(x); void* xp = tyany_ptr(x);
allocGroups(rp, ria, z, xt, xr, xsh, len, width, csz); allocGroups(rp, ria, z, xt, xr, xsh, len, width, csz);
for (u64 i=0, k=i0*width; i<wia; i++) { for (u64 i=0, k=i0*width; i<wia; i++) {
u64 k0 = k; u64 k0 = k;
@ -138,7 +138,7 @@ B group_c2(B t, B w, B x) {
i32* wp = i32any_ptr(w); i32* wp = i32any_ptr(w);
for (usz i = 0; i < ria; i++) len[i] = pos[i] = 0; for (usz i = 0; i < ria; i++) len[i] = pos[i] = 0;
for (usz i = 0; i < xia; i++) len[wp[i]]++; // overallocation makes this safe after n<-1 check for (usz i = 0; i < xia; i++) len[wp[i]]++; // overallocation makes this safe after n<-1 check
u8 xk = xl - 3; u8 xk = xl - 3;
if (notB && !bits && sort) { if (notB && !bits && sort) {
void* xp = tyany_ptr(x); void* xp = tyany_ptr(x);
@ -162,7 +162,7 @@ B group_c2(B t, B w, B x) {
case 0: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((u8* )tyarr_ptr(rp[n]))[pos[n]++] = ((u8* )xp)[i]; } break; case 0: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((u8* )tyarr_ptr(rp[n]))[pos[n]++] = ((u8* )xp)[i]; } break;
case 1: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((u16*)tyarr_ptr(rp[n]))[pos[n]++] = ((u16*)xp)[i]; } break; case 1: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((u16*)tyarr_ptr(rp[n]))[pos[n]++] = ((u16*)xp)[i]; } break;
case 2: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((u32*)tyarr_ptr(rp[n]))[pos[n]++] = ((u32*)xp)[i]; } break; case 2: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((u32*)tyarr_ptr(rp[n]))[pos[n]++] = ((u32*)xp)[i]; } break;
case 3: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((f64*)tyarr_ptr(rp[n]))[pos[n]++] = ((f64*)xp)[i]; } break; case 3: for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) ((u64*)tyarr_ptr(rp[n]))[pos[n]++] = ((u64*)xp)[i]; } break;
} }
} else { } else {
for (usz i = 0; i < ria; i++) { for (usz i = 0; i < ria; i++) {
@ -192,9 +192,10 @@ B group_c2(B t, B w, B x) {
for (usz i = 0; i < ria; i++) a(rp[i])->ia = len[i]*csz; for (usz i = 0; i < ria; i++) a(rp[i])->ia = len[i]*csz;
} }
} }
intvec_ret: TFREE(pos);
setfill_dec_ret:
fillarr_setFill(rf, xf); fillarr_setFill(rf, xf);
decG(w); decG(x); TFREE(pos); decG(w); decG(x);
return taga(r); return taga(r);
} else if (xr==1) { } else if (xr==1) {
SLOW2("𝕨⊔𝕩", w, x); SLOW2("𝕨⊔𝕩", w, x);

View File

@ -347,7 +347,7 @@ static B compress(B w, B x, usz wia, u8 xl, u8 xt) {
wia = 64*(ie+1) - CLZ(we); wia = 64*(ie+1) - CLZ(we);
usz wsum = bit_sum(wp, wia); usz wsum = bit_sum(wp, wia);
if (wsum == wia0) return inc(x); if (wsum == wia0) return inc(x);
B r; B r;
switch(xl) { switch(xl) {
default: r = compress_grouped(wp, x, wia, wsum, xt); break; default: r = compress_grouped(wp, x, wia, wsum, xt); break;
@ -404,27 +404,27 @@ static B compress(B w, B x, usz wia, u8 xl, u8 xt) {
#undef WITH_SPARSE #undef WITH_SPARSE
#define BLOCK_OR_GROUPED(T) \ #define BLOCK_OR_GROUPED(T) \
if (wsum>=wia/8 && groups_lt(wp,wia, wia/16)) r = compress_grouped(wp, x, wia, wsum, xt); \ if (wsum>=wia/8 && groups_lt(wp,wia, wia/16)) r = compress_grouped(wp, x, wia, wsum, xt); \
else { T* xp=tyany_ptr(x); T* rp=m_tyarrv(&r,sizeof(T),wsum,xt); COMPRESS_BLOCK(T); break; } \ else { T* xp=tyany_ptr(x); T* rp=m_tyarrv(&r,sizeof(T),wsum,xt); COMPRESS_BLOCK(T); }
break; case 5: BLOCK_OR_GROUPED(i32) break;
case 5: BLOCK_OR_GROUPED(i32) case 6:
case 6: if (TI(x,elType)!=el_B) { BLOCK_OR_GROUPED(u64) } if (TI(x,elType)!=el_B) { BLOCK_OR_GROUPED(u64) }
#undef BLOCK_OR_GROUPED else {
else { B xf = getFillQ(x);
B xf = getFillQ(x); B* xp = arr_bptr(x);
B* xp = arr_bptr(x); if (xp!=NULL) {
if (xp!=NULL) { HArr_p rh = m_harrUv(wsum);
HArr_p rh = m_harrUv(wsum); B *rp = rh.a; COMPRESS_BLOCK(B);
B *rp = rh.a; COMPRESS_BLOCK(B); for (usz i=0; i<wsum; i++) inc(rh.a[i]);
for (usz i=0; i<wsum; i++) inc(rh.a[i]); r = withFill(rh.b, xf);
r = withFill(rh.b, xf); } else {
} else { SLOW2("𝕨/𝕩", w, x);
SLOW2("𝕨/𝕩", w, x); M_HARR(rp, wsum) SGet(x)
M_HARR(rp, wsum) SGet(x) for (usz i = 0; i < wia; i++) if (bitp_get(wp,i)) HARR_ADDA(rp, Get(x,i));
for (usz i = 0; i < wia; i++) if (bitp_get(wp,i)) HARR_ADDA(rp, Get(x,i)); r = withFill(HARR_FV(rp), xf);
r = withFill(HARR_FV(rp), xf); }
} }
break; break;
} #undef BLOCK_OR_GROUPED
#undef COMPRESS_BLOCK #undef COMPRESS_BLOCK
} }
ur xr = RNK(x); ur xr = RNK(x);
@ -510,10 +510,10 @@ B slash_c2(B t, B w, B x) {
ur xr = RNK(x); ur xr = RNK(x);
usz xlen = *SH(x); usz xlen = *SH(x);
if (RARE(wia!=xlen)) thrF("/: Lengths of components of 𝕨 must match 𝕩 (%s ≠ %s)", wia, xlen); if (RARE(wia!=xlen)) thrF("/: Lengths of components of 𝕨 must match 𝕩 (%s ≠ %s)", wia, xlen);
u8 xl = cellWidthLog(x); u8 xl = cellWidthLog(x);
u8 xt = arrNewType(TY(x)); u8 xt = arrNewType(TY(x));
u8 we = TI(w,elType); u8 we = TI(w,elType);
if (!elInt(we)) { if (!elInt(we)) {
w=any_squeeze(w); we=TI(w,elType); w=any_squeeze(w); we=TI(w,elType);
@ -559,7 +559,7 @@ B slash_c2(B t, B w, B x) {
sh[0] = s; sh[0] = s;
shcpy(sh+1, SH(x)+1, xr-1); shcpy(sh+1, SH(x)+1, xr-1);
} }
if (xl == 0) { if (xl == 0) {
u64* xp = bitarr_ptr(x); u64* xp = bitarr_ptr(x);
u64* rp; r = m_bitarrv(&rp, s); if (rsh) { SPRNK(a(r),xr); SH(r) = rsh; } u64* rp; r = m_bitarrv(&rp, s); if (rsh) { SPRNK(a(r),xr); SH(r) = rsh; }