Convert list⊸↑˘ to a single ↑ call, likewise ↓ and ⌽
This commit is contained in:
parent
ce98efc525
commit
46704defb6
@ -7,6 +7,8 @@
|
|||||||
B fne_c1(B, B);
|
B fne_c1(B, B);
|
||||||
B shape_c2(B, B, B);
|
B shape_c2(B, B, B);
|
||||||
B transp_c2(B, B, B);
|
B transp_c2(B, B, B);
|
||||||
|
B take_c2(B, B, B);
|
||||||
|
B join_c2(B, B, B);
|
||||||
|
|
||||||
// from fold.c:
|
// from fold.c:
|
||||||
B fold_rows(Md1D* d, B x);
|
B fold_rows(Md1D* d, B x);
|
||||||
@ -679,21 +681,38 @@ NOINLINE B for_cells_SA(B f, B w, B x, ur xcr, ur xr, u32 chr) {
|
|||||||
return shift_cells(w, x, cam, xsh[xk], el_or(TI(x,elType), selfElType(w)), rtid);
|
return shift_cells(w, x, cam, xsh[xk], el_or(TI(x,elType), selfElType(w)), rtid);
|
||||||
} break;
|
} break;
|
||||||
case n_take: case n_drop: {
|
case n_take: case n_drop: {
|
||||||
if (xcr==0 || !isF64(w)) break;
|
|
||||||
bool take = rtid==n_take;
|
bool take = rtid==n_take;
|
||||||
f64* ap;
|
B a;
|
||||||
B a = m_f64arrv(&ap, xk+1);
|
if (isF64(w)) {
|
||||||
if (!take) { FILL_TO(ap, el_f64, 0, m_f64(0), xk); }
|
if (xcr < 1) break;
|
||||||
else { PLAINLOOP for (usz i=0; i<xk; i++) ap[i] = xsh[i]; }
|
f64* ap;
|
||||||
ap[xk] = o2fG(w);
|
a = m_f64arrv(&ap, xk+1);
|
||||||
|
if (!take) { FILL_TO(ap, el_f64, 0, m_f64(0), xk); }
|
||||||
|
else { PLAINLOOP for (usz i=0; i<xk; i++) ap[i] = xsh[i]; }
|
||||||
|
ap[xk] = o2fG(w);
|
||||||
|
} else {
|
||||||
|
if (!isArr(w) || RNK(w)>1) break;
|
||||||
|
usz wia = IA(w);
|
||||||
|
if (xcr < wia) break; // needs rank extension in the middle of x's shape
|
||||||
|
if (!take) a = C2(take, m_f64(-(i32)(xk+wia)), w);
|
||||||
|
else a = C2(join, C2(take, m_f64(xk), C1(fne, incG(x))), w); // (k↑≢𝕩)∾𝕨
|
||||||
|
}
|
||||||
return takedrop_highrank(take, a, x);
|
return takedrop_highrank(take, a, x);
|
||||||
} break;
|
} break;
|
||||||
case n_reverse: {
|
case n_reverse: {
|
||||||
if (xcr==0 || !isF64(w)) break;
|
B a;
|
||||||
f64* ap;
|
if (isF64(w)) {
|
||||||
B a = m_f64arrv(&ap, xk+1);
|
if (xcr < 1) break;
|
||||||
FILL_TO(ap, el_f64, 0, m_f64(0), xk);
|
f64* ap;
|
||||||
ap[xk] = o2fG(w);
|
a = m_f64arrv(&ap, xk+1);
|
||||||
|
FILL_TO(ap, el_f64, 0, m_f64(0), xk);
|
||||||
|
ap[xk] = o2fG(w);
|
||||||
|
} else {
|
||||||
|
if (!isArr(w) || RNK(w)>1) break;
|
||||||
|
usz wia = IA(w);
|
||||||
|
if (xcr < wia) break;
|
||||||
|
a = C2(take, m_f64(-(i32)(xk+wia)), w);
|
||||||
|
}
|
||||||
return rotate_highrank(0, a, x);
|
return rotate_highrank(0, a, x);
|
||||||
}
|
}
|
||||||
case n_transp:
|
case n_transp:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user