diff --git a/src/builtins/cells.c b/src/builtins/cells.c index fd30c71a..e261b493 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -17,13 +17,17 @@ B fold_rows_bit(Md1D* d, B x, usz n, usz m); B insert_cells_join(B x, usz* xsh, ur cr, ur k); B insert_cells_identity(B x, B f, usz* xsh, ur xr, ur k, u8 rtid); -B scan_rows_bit(u8, B x, usz m); // from scan.c -B takedrop_highrank(bool take, B w, B x); // from sfns.c -B rotate_highrank(bool inv, B w, B x); // from sfns.c +// from scan.c: +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 select_rows_B(B x, ux csz, ux cam, B inds); // from select.c B try_interleave_cells(B w, B x, ur xr, ur xk, usz* xsh); // from transpose.c +// from select.c: +B select_rows_B(B x, ux csz, ux cam, B inds); +B select_rows_typed(B x, ux csz, ux cam, void* inds, ux indn, u8 ie); + // X - variable name; XSH - its shape; K - number of leading axes that get iterated over; SLN - number of slices that will be made; DX - additional refcount count to add to x #define S_KSLICES(X, XSH, K, SLN, DX)\ usz X##_sn = (SLN); \ @@ -442,6 +446,7 @@ NOINLINE B for_cells_AA(B f, B w, B x, ur wcr, ur xcr, u32 chr); static NOINLINE B c1wrap(B f, B x) { B r = c1(f, x); return isAtm(r)? m_unit(r) : r; } static NOINLINE B c2wrap(B f, B w, B x) { B r = c2(f, w, x); return isAtm(r)? m_unit(r) : r; } +static u8 reverse_inds_64[128] = {63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0}; // 64 trailing elements for overreading loads // monadic ˘ & ⎉ B for_cells_c1(B f, u32 xr, u32 cr, u32 k, B x, u32 chr) { // F⎉cr x; array x, xr>0, 0≤cr0 && k>0 && cr> arrTypeBitsLog(TY(x)))) { + incG(x); // TODO proper shape moving + Arr* r = customizeShape(select_rows_typed(x, csz, cam, reverse_inds_64+64-csz, csz, el_i8)); + arr_shCopy(r, x); + decG(x); + return taga(r); + } + break; + } // trivial cases for unhandled functions - case n_reverse: case n_and: case n_or: case n_find: + case n_and: case n_or: case n_find: if (cr == 0) break; if (xsh[k] <= 1) return x; break; diff --git a/src/builtins/select.c b/src/builtins/select.c index 5d7aa30a..1cff811f 100644 --- a/src/builtins/select.c +++ b/src/builtins/select.c @@ -56,6 +56,7 @@ // COULD have a more direct call that avoids overflow checking & wrapping // COULD generate full list of indices via arith // 1-element cells: use (≠inds)/⥊x after checking ∧´0=inds +// Used for ⌽⎉1 // SHOULD use for atom⊸⊏⎉k, /⎉k, ⌽⎉k, ↑⎉k, ⍉⎉k, probably more #include "../core.h" diff --git a/test/cases/cells.bqn b/test/cases/cells.bqn index 952530e0..d73ec933 100644 --- a/test/cases/cells.bqn +++ b/test/cases/cells.bqn @@ -4,7 +4,6 @@ %DEF evar %USE tvar ⋄ _evar ← {ok←{⇐} ⋄ r←⥊𝕨 ok∘𝔽⎊{𝕊: •CurrentError@} _tvar 𝕩 ⋄ {⊑ok∊r? !"TEST FAIL: variation didn't error"; ("TEST FAIL: varying error messages"⊸⋈ ! 1=≠)⍷r ⋄ !⊑r}} %DEF eqerr %USE eqvar ⋄ _eqerr ← {ok←{⇐} ⋄ r←⥊𝕨 ok∘𝔽⎊{𝕊: •CurrentError@}⌜ 𝕩 ⋄ {⊑ok∊r? !"TEST FAIL: case didn't error"; ("TEST FAIL: varying error messages"⊸⋈ ! 1=≠)⍷r ⋄ !⊑r}} %DEF k _k ← {𝔽○•internal.Keep} -%DEF tcc %USE k ⋄ %USE var ⋄ _tcc ← { ! ∧´ (<𝕨 𝔽_k˘⎊'e' 𝕩) ≡¨ (𝕨 𝔽˘⎊'e'V⟜𝕩)¨ "i"LV𝕩} 1‿2 1⎉0 1 %% 1‿1 1 1⎉0 1‿2 %% 1‿1 @@ -76,12 +75,11 @@ {∾˝˘ (2+↕𝕩)⥊<"hi"}¨ 2‿3‿4‿5 %% ⥊⟜(<"hi")¨ ⟨2‿3,2‿12,2‿12‿5,2‿12‿5‿6⟩ {∾˝⎉¯2 ⥊⟜(↕×´) 2+↕𝕩}¨ 3‿4‿5 %% ⥊⟜(↕×´)¨ ⟨2‿3‿4,2‿3‿20,2‿3‿20‿6⟩ -%USE tcc ⋄ ⟨2, 20, ¯2, ¯20, 0⟩ {𝕨 ↑_tcc 𝕩 ⋄ 𝕨 ↓_tcc 𝕩}⌜ ⟨<4, ↕5, 4‿5⥊↕20, 4‿5‿6⥊↕120⟩ -%USE tcc ⋄ ⟨<, ≍, ⊏, ⥊⟩ {𝕎 _tcc 𝕩}⌜ ⟨<4, ↕5, 4‿5⥊↕20, 4‿5‿6⥊↕120, 2‿3‿4‿5⥊↕120⟩ -%USE tcc ⋄ ⟨<, ≍, ⥊⟩ {𝕎 _tcc 𝕩}⌜ ⟨<4, ↕5, 4‿5⥊↕20, 4‿5‿6⥊↕120, 2‿3‿4‿5⥊↕120⟩ -%USE tcc ⋄ ⟨⊏⟩ {𝕎 _tcc 𝕩}⌜ ⟨4‿5⥊↕20, 4‿5‿6⥊↕120, 2‿3‿4‿5⥊↕120⟩ -%USE tcc ⋄ ⊏_tcc 4‿2⥊↕8 ⋄ 1⊏_tcc 4‿2⥊↕8 ⋄ ⊏_tcc ↕4‿2 ⋄ 1⊏_tcc ↕4‿2 -%USE tcc ⋄ ⊑_tcc 4‿2⥊↕8 ⋄ 1⊑_tcc 4‿2⥊↕8 ⋄ ⊑_tcc ↕4‿2 ⋄ 1⊑_tcc ↕4‿2 +%DEF tcc %USE k ⋄ %USE var ⋄ _tcc_ ← { ! ∧´ (<𝕨 𝔽_k⎉𝕘⎊'e' 𝕩) ≡¨ (𝕨 𝔽⎉𝕘⎊'e'V⟜𝕩)¨ "i"LV𝕩} +%USE tcc ⋄ ⟨2, 20, ¯2, ¯20, 0⟩ {𝕨 ↑_tcc_ ¯1 𝕩 ⋄ 𝕨 ↓_tcc_ ¯1 𝕩}⌜ ⟨<4, ↕5, 4‿5⥊↕20, 4‿5‿6⥊↕120⟩ +%USE tcc ⋄ ⟨⌽, ⍉, ⊏, <, ≍, ⥊⟩ {𝕎 _tcc_ ¯1 𝕩 ⋄ 𝕎 _tcc_ 1 𝕩 ⋄ 𝕎 _tcc_ 2 𝕩}⌜ ⟨<4, ↕5, 4‿5⥊↕20, 4‿5‿6⥊↕120, 2‿3‿4‿5⥊↕120⟩ +%USE tcc ⋄ ⊏_tcc_ ¯1 4‿2⥊↕8 ⋄ 1⊏_tcc_ ¯1 4‿2⥊↕8 ⋄ ⊏_tcc_ ¯1 ↕4‿2 ⋄ 1⊏_tcc_ ¯1 ↕4‿2 +%USE tcc ⋄ ⊑_tcc_ ¯1 4‿2⥊↕8 ⋄ 1⊑_tcc_ ¯1 4‿2⥊↕8 ⋄ ⊑_tcc_ ¯1 ↕4‿2 ⋄ 1⊑_tcc_ ¯1 ↕4‿2 %USE eqvar ⋄ 0‿0‿0‿0 {𝕨⊸⊏˘𝕩}_eqvar ≍˘↕5 %% 5‿4⥊⌊4÷˜↕20 %USE eqvar ⋄ 0‿¯1‿0‿¯1 {𝕨⊸⊏˘𝕩}_eqvar ≍˘↕5 %% 5‿4⥊⌊4÷˜↕20