⌽⎉1 x via (⌽↕¯1⊑≢x)⊸⊏⎉1 x

This commit is contained in:
dzaima 2024-07-28 21:43:10 +03:00
parent 081b928cb4
commit 3a722b552f
3 changed files with 30 additions and 12 deletions

View File

@ -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;

View File

@ -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"

View File

@ -4,7 +4,6 @@
%DEF evar %USE tvar _evar {ok{} r𝕨 ok𝔽{𝕊: •CurrentError@} _tvar 𝕩 {okr? !"TEST FAIL: variation didn't error"; ("TEST FAIL: varying error messages" ! 1=)r !r}}
%DEF eqerr %USE eqvar _eqerr {ok{} r𝕨 ok𝔽{𝕊: •CurrentError@} 𝕩 {okr? !"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𝕩}
12 10 1 %% 11
1 10 12 %% 11
@ -76,12 +75,11 @@
{˝˘ (2+𝕩)<"hi"}¨ 2345 %% (<"hi")¨ 23,212,2125,21256
{˝¯2 (×´) 2+𝕩}¨ 345 %% (×´)¨ 234,2320,23206
%USE tcc 2, 20, ¯2, ¯20, 0 {𝕨 _tcc 𝕩 𝕨 _tcc 𝕩} <4, 5, 4520, 456120
%USE tcc <, , , {𝕎 _tcc 𝕩} <4, 5, 4520, 456120, 2345120
%USE tcc <, , {𝕎 _tcc 𝕩} <4, 5, 4520, 456120, 2345120
%USE tcc {𝕎 _tcc 𝕩} 4520, 456120, 2345120
%USE tcc _tcc 428 1_tcc 428 _tcc 42 1_tcc 42
%USE tcc _tcc 428 1_tcc 428 _tcc 42 1_tcc 42
%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, 4520, 456120
%USE tcc , , , <, , {𝕎 _tcc_ ¯1 𝕩 𝕎 _tcc_ 1 𝕩 𝕎 _tcc_ 2 𝕩} <4, 5, 4520, 456120, 2345120
%USE tcc _tcc_ ¯1 428 1_tcc_ ¯1 428 _tcc_ ¯1 42 1_tcc_ ¯1 42
%USE tcc _tcc_ ¯1 428 1_tcc_ ¯1 428 _tcc_ ¯1 42 1_tcc_ ¯1 42
%USE eqvar 0000 {𝕨˘𝕩}_eqvar ˘5 %% 544÷˜20
%USE eqvar 0¯10¯1 {𝕨˘𝕩}_eqvar ˘5 %% 544÷˜20