From fff96b94756061fd38f3bdd80ccfb7e007a22000 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 13 Sep 2024 22:05:31 +0300 Subject: [PATCH] =?UTF-8?q?fix=20=E2=89=8D=CB=98=20error=20checking,=20sta?= =?UTF-8?q?rt=20of=20generalizing=20to=20join=5Fcells?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/cells.c | 10 ++-- src/builtins/transpose.c | 99 +++++++++++++++++++++------------------- test/cases/cells.bqn | 5 ++ 3 files changed, 62 insertions(+), 52 deletions(-) diff --git a/src/builtins/cells.c b/src/builtins/cells.c index 65bc885e..97f2cf7f 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -23,7 +23,7 @@ B scan_rows_bit(u8, B x, usz m); B takedrop_highrank(bool take, 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: 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_couple: if (RNK(w)==1) { x = taga(arr_shVec(reshape_one(IA(w), x))); - return interleave_cells(w, x, 1, 1, wsh); + return interleave_cells(w, x, 1); } break; } 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; case n_couple: if (RNK(x)==1) { w = taga(arr_shVec(reshape_one(IA(x), w))); - return interleave_cells(w, x, 1, 1, xsh); + return interleave_cells(w, x, 1); } break; case n_pick: if (isF64(w) && xcr==1 && TI(x,arrD1)) { 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); decG(w); decG(x); return taga(r); } - if (rtid==n_couple && wr==xr) { - return interleave_cells(w, x, xr, xk, xsh); + if (rtid==n_couple && wr==xr && eqShPart(wsh+wk, xsh+wk, wcr)) { + return interleave_cells(w, x, wk); } } if (isPervasiveDy(f)) { diff --git a/src/builtins/transpose.c b/src/builtins/transpose.c index b8983bfd..e5758e4a 100644 --- a/src/builtins/transpose.c +++ b/src/builtins/transpose.c @@ -93,13 +93,7 @@ static void interleave_bits(u64* rp, void* x0v, void* x1v, usz n) { } } -B toBPtrAny(B x) { - 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) +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; case el_bit: return toBitAny(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_c16: return toC16Any(x); case el_c32: return toC32Any(x); - case el_B: return toBPtrAny(x); + case el_B: TO_BPTR(x); return x; } } - -// 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); +Arr* join_cells(B w, B x, ur k) { // consumes w,x; join k-cells, 𝕨 ∾○⥊⎉(-k) 𝕩; result has unset shape u8 we = TI(w,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 if (re!=we) w = toElTypeArr(re, w); if (re!=xe) x = toElTypeArr(re, x); - return interleave_cells(w, x, xr, xk, SH(x)); + return join_cells(w, x, k); } Arr *r; u8 xlw = elwBitLog(re); - usz n = shProd(xsh, 0, xk); - usz csz = shProd(xsh, xk, xr); - usz ia = 2*n*csz; - - if (csz & (csz-1)) { - goto generic; - } else if (csz==1 && xlw==0) { // we & xe are trivially el_bit - u64* rp; r=m_bitarrp(&rp, ia); - interleave_bits(rp, bitany_ptr(w), bitany_ptr(x), ia); - #if SINGELI - } else if (csz==1 && re==el_B) { - if (we!=xe) goto to_equal_types; - B* wp = TO_BPTR(w); B* xp = TO_BPTR_RUN(x, xsh = SH(x)); - - HArr_p p = m_harrUv(ia); // Debug build complains with harrUp - interleave_fns[3](p.a, wp, xp, n); - for (usz i=0; i>xlw && csz<=8) { // Require CPU-sized cells - if (we!=xe) goto to_equal_types; - assert(re!=el_B); - void* rv; - if (xlw==0) { u64* rp; r = m_bitarrp(&rp, ia); rv=rp; } - else rv = m_tyarrp(&r,elWidth(re),ia,el2t(re)); - interleave_fns[CTZ(csz<>xlw && csz<=8) { // Require CPU-sized cells + if (we!=xe) goto to_equal_types; + assert(re!=el_B); + void* rv; + if (xlw==0) { u64* rp; r = m_bitarrp(&rp, ia); rv=rp; } + else rv = m_tyarrp(&r,elWidth(re),ia,el2t(re)); + interleave_fns[CTZ(csz<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) { diff --git a/test/cases/cells.bqn b/test/cases/cells.bqn index fc32e2d7..30ea0a9b 100644 --- a/test/cases/cells.bqn +++ b/test/cases/cells.bqn @@ -124,6 +124,11 @@ %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˜ 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