Transform atom⊸⌽⎉k into a single high-rank ⌽ call

This commit is contained in:
Marshall Lochbaum 2024-07-04 09:58:14 -04:00
parent 3b49294145
commit ce98efc525
2 changed files with 10 additions and 1 deletions

View File

@ -16,6 +16,7 @@ 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
B try_interleave_cells(B w, B x, ur xr, ur xk, usz* xsh); // from transpose.c
// 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
@ -687,6 +688,14 @@ NOINLINE B for_cells_SA(B f, B w, B x, ur xcr, ur xr, u32 chr) {
ap[xk] = o2fG(w);
return takedrop_highrank(take, a, x);
} break;
case n_reverse: {
if (xcr==0 || !isF64(w)) break;
f64* ap;
B a = m_f64arrv(&ap, xk+1);
FILL_TO(ap, el_f64, 0, m_f64(0), xk);
ap[xk] = o2fG(w);
return rotate_highrank(0, a, x);
}
case n_transp:
if (q_usz(w)) { usz a=o2sG(w); if (a<xcr) return transp_cells(a+xk, xk, x); }
break;

View File

@ -1122,7 +1122,7 @@ B reverse_c1(B t, B x) {
B reverse_c2(B t, B w, B x);
#define WRAP_ROT(V, L) ({ i64 v_ = (V); usz l_ = (L); if ((u64)v_ >= (u64)l_) { v_%= (i64)l_; if(v_<0) v_+= l_; } v_; })
static NOINLINE B rotate_highrank(bool inv, B w, B x) {
NOINLINE B rotate_highrank(bool inv, B w, B x) {
#define INV (inv? "⁼" : "")
if (RNK(w)>1) thrF("⌽%U: 𝕨 must have rank at most 1 (%H ≡ ≢𝕨)", INV, w);
B r;