⌽⎉1 x via (⌽↕¯1⊑≢x)⊸⊏⎉1 x
This commit is contained in:
parent
081b928cb4
commit
3a722b552f
@ -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≤cr<xr, k≡xr-cr
|
||||
assert(isArr(x) && xr>0 && k>0 && cr<xr && k == xr-cr);
|
||||
@ -495,8 +500,22 @@ B for_cells_c1(B f, u32 xr, u32 cr, u32 k, B x, u32 chr) { // F⎉cr x; array x,
|
||||
case n_transp: {
|
||||
return cr<=1? x : transp_cells(xr-1, k, x);
|
||||
}
|
||||
case n_reverse: {
|
||||
if (cr == 0) break;
|
||||
ux csz = xsh[k];
|
||||
if (csz <= 1) return x;
|
||||
u8 xe = TI(x,elType);
|
||||
if (cr==1 && csz<=64 && xe!=el_bit && xe!=el_B && csz < (128*8 >> 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;
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user