fix ≍˘ error checking, start of generalizing to join_cells
This commit is contained in:
parent
1679d957e8
commit
fff96b9475
@ -23,7 +23,7 @@ B scan_rows_bit(u8, B x, usz m);
|
|||||||
B takedrop_highrank(bool take, B w, B x);
|
B takedrop_highrank(bool take, B w, B x);
|
||||||
B rotate_highrank(bool inv, B w, B x);
|
B rotate_highrank(bool inv, B w, B x);
|
||||||
|
|
||||||
B interleave_cells(B w, B x, ur xr, ur xk, usz* xsh); // from transpose.c
|
B interleave_cells(B w, B x, ur k); // from transpose.c
|
||||||
|
|
||||||
// from select.c:
|
// from select.c:
|
||||||
B select_rows_B(B x, ux csz, ux cam, B inds);
|
B select_rows_B(B x, ux csz, ux cam, B inds);
|
||||||
@ -694,7 +694,7 @@ NOINLINE B for_cells_AS(B f, B w, B x, ur wcr, ur wr, u32 chr) { // F⟜x⎉wcr
|
|||||||
case n_rtack: return const_cells(w, wk, wsh, x, chr);
|
case n_rtack: return const_cells(w, wk, wsh, x, chr);
|
||||||
case n_couple: if (RNK(w)==1) {
|
case n_couple: if (RNK(w)==1) {
|
||||||
x = taga(arr_shVec(reshape_one(IA(w), x)));
|
x = taga(arr_shVec(reshape_one(IA(w), x)));
|
||||||
return interleave_cells(w, x, 1, 1, wsh);
|
return interleave_cells(w, x, 1);
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
if (IA(w)!=0 && isPervasiveDy(f)) {
|
if (IA(w)!=0 && isPervasiveDy(f)) {
|
||||||
@ -745,7 +745,7 @@ NOINLINE B for_cells_SA(B f, B w, B x, ur xcr, ur xr, u32 chr) { // w⊸F⎉xcr
|
|||||||
break;
|
break;
|
||||||
case n_couple: if (RNK(x)==1) {
|
case n_couple: if (RNK(x)==1) {
|
||||||
w = taga(arr_shVec(reshape_one(IA(x), w)));
|
w = taga(arr_shVec(reshape_one(IA(x), w)));
|
||||||
return interleave_cells(w, x, 1, 1, xsh);
|
return interleave_cells(w, x, 1);
|
||||||
} break;
|
} break;
|
||||||
case n_pick: if (isF64(w) && xcr==1 && TI(x,arrD1)) {
|
case n_pick: if (isF64(w) && xcr==1 && TI(x,arrD1)) {
|
||||||
usz l = xsh[xk];
|
usz l = xsh[xk];
|
||||||
@ -848,8 +848,8 @@ NOINLINE B for_cells_AA(B f, B w, B x, ur wcr, ur xcr, u32 chr) { // w F⎉wcr
|
|||||||
if (rsh) shcpy(rsh, zsh, zk);
|
if (rsh) shcpy(rsh, zsh, zk);
|
||||||
decG(w); decG(x); return taga(r);
|
decG(w); decG(x); return taga(r);
|
||||||
}
|
}
|
||||||
if (rtid==n_couple && wr==xr) {
|
if (rtid==n_couple && wr==xr && eqShPart(wsh+wk, xsh+wk, wcr)) {
|
||||||
return interleave_cells(w, x, xr, xk, xsh);
|
return interleave_cells(w, x, wk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isPervasiveDy(f)) {
|
if (isPervasiveDy(f)) {
|
||||||
|
|||||||
@ -93,13 +93,7 @@ static void interleave_bits(u64* rp, void* x0v, void* x1v, usz n) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
B toBPtrAny(B x) {
|
NOINLINE B toElTypeArr(u8 re, B x) { // consumes; returns an array with the given element type (re==el_B guarantees TO_BPTR working)
|
||||||
if (arr_bptr(x)!=NULL) return x;
|
|
||||||
return taga(cpyHArr(x));
|
|
||||||
}
|
|
||||||
|
|
||||||
NOINLINE
|
|
||||||
B toElTypeArr(u8 re, B x) { // consumes; returns an array with the given element type (re==el_B guarantees TO_BPTR working)
|
|
||||||
switch (re) { default: UD;
|
switch (re) { default: UD;
|
||||||
case el_bit: return toBitAny(x);
|
case el_bit: return toBitAny(x);
|
||||||
case el_i8: return toI8Any(x);
|
case el_i8: return toI8Any(x);
|
||||||
@ -109,14 +103,11 @@ B toElTypeArr(u8 re, B x) { // consumes; returns an array with the given element
|
|||||||
case el_c8: return toC8Any(x);
|
case el_c8: return toC8Any(x);
|
||||||
case el_c16: return toC16Any(x);
|
case el_c16: return toC16Any(x);
|
||||||
case el_c32: return toC32Any(x);
|
case el_c32: return toC32Any(x);
|
||||||
case el_B: return toBPtrAny(x);
|
case el_B: TO_BPTR(x); return x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Arr* join_cells(B w, B x, ur k) { // consumes w,x; join k-cells, 𝕨 ∾○⥊⎉(-k) 𝕩; result has unset shape
|
||||||
// interleave arrays, 𝕨≍⎉(-xk)𝕩
|
|
||||||
B interleave_cells(B w, B x, ur xr, ur xk, usz* xsh) { // consumes w,x
|
|
||||||
assert(RNK(w)==xr && xr>=1);
|
|
||||||
u8 we = TI(w,elType);
|
u8 we = TI(w,elType);
|
||||||
u8 xe = TI(x,elType);
|
u8 xe = TI(x,elType);
|
||||||
|
|
||||||
@ -125,44 +116,47 @@ B interleave_cells(B w, B x, ur xr, ur xk, usz* xsh) { // consumes w,x
|
|||||||
// delay doing this until it's known that there will be code that can utilize it
|
// delay doing this until it's known that there will be code that can utilize it
|
||||||
if (re!=we) w = toElTypeArr(re, w);
|
if (re!=we) w = toElTypeArr(re, w);
|
||||||
if (re!=xe) x = toElTypeArr(re, x);
|
if (re!=xe) x = toElTypeArr(re, x);
|
||||||
return interleave_cells(w, x, xr, xk, SH(x));
|
return join_cells(w, x, k);
|
||||||
}
|
}
|
||||||
|
|
||||||
Arr *r;
|
Arr *r;
|
||||||
u8 xlw = elwBitLog(re);
|
u8 xlw = elwBitLog(re);
|
||||||
usz n = shProd(xsh, 0, xk);
|
usz n = shProd(SH(w), 0, k);
|
||||||
usz csz = shProd(xsh, xk, xr);
|
usz wcsz = shProd(SH(w), k, RNK(w));
|
||||||
usz ia = 2*n*csz;
|
usz xcsz = shProd(SH(x), k, RNK(x));
|
||||||
|
usz ia = IA(w)+IA(x);
|
||||||
if (csz & (csz-1)) {
|
if (wcsz == xcsz) {
|
||||||
goto generic;
|
usz csz = wcsz;
|
||||||
} else if (csz==1 && xlw==0) { // we & xe are trivially el_bit
|
if (csz & (csz-1)) {
|
||||||
u64* rp; r=m_bitarrp(&rp, ia);
|
goto generic;
|
||||||
interleave_bits(rp, bitany_ptr(w), bitany_ptr(x), ia);
|
} else if (csz==1 && xlw==0) { // we & xe are trivially el_bit
|
||||||
#if SINGELI
|
u64* rp; r=m_bitarrp(&rp, ia);
|
||||||
} else if (csz==1 && re==el_B) {
|
interleave_bits(rp, bitany_ptr(w), bitany_ptr(x), ia);
|
||||||
if (we!=xe) goto to_equal_types;
|
#if SINGELI
|
||||||
B* wp = TO_BPTR(w); B* xp = TO_BPTR_RUN(x, xsh = SH(x));
|
} else if (csz==1 && re==el_B) {
|
||||||
|
if (we!=xe) goto to_equal_types;
|
||||||
HArr_p p = m_harrUv(ia); // Debug build complains with harrUp
|
B* wp = TO_BPTR(w); B* xp = TO_BPTR(x);
|
||||||
interleave_fns[3](p.a, wp, xp, n);
|
|
||||||
for (usz i=0; i<ia; i++) inc(p.a[i]);
|
HArr_p p = m_harrUv(ia); // Debug build complains with harrUp
|
||||||
NOGC_E;
|
interleave_fns[3](p.a, wp, xp, n);
|
||||||
r = (Arr*) p.c;
|
for (usz i=0; i<ia; i++) inc(p.a[i]);
|
||||||
goto add_fill;
|
NOGC_E;
|
||||||
} else if (csz<=64>>xlw && csz<<xlw>=8) { // Require CPU-sized cells
|
r = (Arr*) p.c;
|
||||||
if (we!=xe) goto to_equal_types;
|
goto add_fill;
|
||||||
assert(re!=el_B);
|
} else if (csz<=64>>xlw && csz<<xlw>=8) { // Require CPU-sized cells
|
||||||
void* rv;
|
if (we!=xe) goto to_equal_types;
|
||||||
if (xlw==0) { u64* rp; r = m_bitarrp(&rp, ia); rv=rp; }
|
assert(re!=el_B);
|
||||||
else rv = m_tyarrp(&r,elWidth(re),ia,el2t(re));
|
void* rv;
|
||||||
interleave_fns[CTZ(csz<<xlw)-3](rv, tyany_ptr(w), tyany_ptr(x), n);
|
if (xlw==0) { u64* rp; r = m_bitarrp(&rp, ia); rv=rp; }
|
||||||
#endif
|
else rv = m_tyarrp(&r,elWidth(re),ia,el2t(re));
|
||||||
|
interleave_fns[CTZ(csz<<xlw)-3](rv, tyany_ptr(w), tyany_ptr(x), n);
|
||||||
|
#endif
|
||||||
|
} else goto generic;
|
||||||
} else { generic:;
|
} else { generic:;
|
||||||
MAKE_MUT_INIT(rm, ia, re); MUTG_INIT(rm);
|
MAKE_MUT_INIT(rm, ia, re); MUTG_INIT(rm);
|
||||||
for (ux o = 0; o < n*csz; o+= csz) {
|
for (ux ow=0, ox=0, or=0; or < ia; or+= wcsz+xcsz) {
|
||||||
mut_copyG(rm, o*2, w, o, csz);
|
mut_copyG(rm, or, w, ow, wcsz); ow+= wcsz;
|
||||||
mut_copyG(rm, o*2+csz, x, o, csz);
|
mut_copyG(rm, or+wcsz, x, ox, xcsz); ox+= xcsz;
|
||||||
}
|
}
|
||||||
r = a(mut_fv(rm));
|
r = a(mut_fv(rm));
|
||||||
goto add_fill;
|
goto add_fill;
|
||||||
@ -172,10 +166,21 @@ B interleave_cells(B w, B x, ur xr, ur xk, usz* xsh) { // consumes w,x
|
|||||||
if (SFNS_FILLS) r = a(qWithFill(taga(r), fill_both(w, x)));
|
if (SFNS_FILLS) r = a(qWithFill(taga(r), fill_both(w, x)));
|
||||||
}
|
}
|
||||||
|
|
||||||
usz* sh = arr_shAlloc(r, xr+1);
|
|
||||||
shcpy(sh, xsh, xk); sh[xk]=2; shcpy(sh+xk+1, xsh+xk, xr-xk);
|
|
||||||
decG(w); decG(x);
|
decG(w); decG(x);
|
||||||
return taga(r);
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
B join_c2(B, B, B);
|
||||||
|
|
||||||
|
B interleave_cells(B w, B x, ur k) { // consumes w,x; interleave arrays, 𝕨 ≍⎉(-xk) 𝕩; assumes equal-shape args
|
||||||
|
ux xr = RNK(x);
|
||||||
|
if (xr==0) return C2(join, w, x);
|
||||||
|
ShArr* rsh = m_shArr(xr+1); // TODO handle leak if join_cells fails
|
||||||
|
usz* xsh = SH(x);
|
||||||
|
shcpy(rsh->a, xsh, k);
|
||||||
|
rsh->a[k] = 2;
|
||||||
|
shcpy(rsh->a+k+1, xsh+k, xr-k);
|
||||||
|
return taga(arr_shSetUG(join_cells(w, x, k), xr+1, rsh));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void transpose_move(void* rv, void* xv, u8 xe, usz w, usz h) {
|
static void transpose_move(void* rv, void* xv, u8 xe, usz w, usz h) {
|
||||||
|
|||||||
@ -124,6 +124,11 @@
|
|||||||
%USE eqvar ⋄ ≍˘⟜1e9 _eqvar 100⥊7↑1 %% 100‿2⥊ (1e9× 2|↕200) ⌈ 2/0=7|↕100
|
%USE eqvar ⋄ ≍˘⟜1e9 _eqvar 100⥊7↑1 %% 100‿2⥊ (1e9× 2|↕200) ⌈ 2/0=7|↕100
|
||||||
%USE eqvar ⋄ ≍˘⟜'!' _eqvar 100⥊7↑1 %% ∾⟜'!'○•internal.Keep˘ 0=7|↕100
|
%USE eqvar ⋄ ≍˘⟜'!' _eqvar 100⥊7↑1 %% ∾⟜'!'○•internal.Keep˘ 0=7|↕100
|
||||||
%USE eqvar ⋄ ≍˘_eqvar˜ 3‿3⥊↕9 %% 3‿2‿3⥊0‿1‿2‿0‿1‿2‿3‿4‿5‿3‿4‿5‿6‿7‿8‿6‿7‿8
|
%USE eqvar ⋄ ≍˘_eqvar˜ 3‿3⥊↕9 %% 3‿2‿3⥊0‿1‿2‿0‿1‿2‿3‿4‿5‿3‿4‿5‿6‿7‿8‿6‿7‿8
|
||||||
|
%USE eqvar ⋄ (2‿3‿4‿5‿1⥊↕11) ≍⎉2 _eqvar 2‿3‿4‿5‿1⥊↕7 %% (2‿3‿4‿5‿1⥊↕11) ≍○•internal.PureKeep⎉2 2‿3‿4‿5‿1⥊↕7
|
||||||
|
!"˘: Argument frames don't agree (3‿4 ≡ ≢𝕨, 5‿4 ≡ ≢𝕩, common frame of 1 axes)" % (3‿4⥊2) ≍˘ 5‿4⥊2
|
||||||
|
!"≍: 𝕨 and 𝕩 must have equal shapes (⟨4⟩ ≡ ≢𝕨, ⟨5⟩ ≡ ≢𝕩)" % (3‿4⥊2) ≍˘ 3‿5⥊2
|
||||||
|
!"≍: 𝕨 and 𝕩 must have equal shapes (2‿2‿2 ≡ ≢𝕨, 2‿3‿2 ≡ ≢𝕩)" % (3‿2‿2‿2⥊2) ≍˘ 3‿2‿3‿2⥊2
|
||||||
|
!"≍: 𝕨 and 𝕩 must have equal shapes (4‿1 ≡ ≢𝕨, ⟨4⟩ ≡ ≢𝕩)" % (3‿4‿1⥊0) ≍˘ 3‿4⥊0
|
||||||
|
|
||||||
(
|
(
|
||||||
%USE IS_HEAPVERIFY
|
%USE IS_HEAPVERIFY
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user