From bbe4549aff210093598a80c241b92a33d2f8c389 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Mon, 10 Mar 2025 12:00:09 -0400 Subject: [PATCH 1/7] =?UTF-8?q?Scalar=20implementation=20of=20=F0=9D=94=BD?= =?UTF-8?q?=CB=9D=20for=20generic=20arithmetic=20=F0=9D=94=BD=20and=20shor?= =?UTF-8?q?t=20rows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/fold.c | 74 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/src/builtins/fold.c b/src/builtins/fold.c index bb9312ca..90b38382 100644 --- a/src/builtins/fold.c +++ b/src/builtins/fold.c @@ -383,6 +383,32 @@ static B m1c1(B t, B f, B x) { // consumes x } extern B insert_base(B f, B x, bool has_w, B w); // from cells.c +// Do arithmetic 𝔽˝ with short rows like 𝔽¨˝ to cut per-row overhead +static B insert_scal(B f, FC2 fc2, B x, bool has_w, B fxw, usz xia, ur rr) { + usz csz = arr_csz(x); + HArr_p r = m_harr0p(csz); + usz* rsh = arr_shAlloc((Arr*)r.c, rr); + if (rr>1) shcpy(rsh, SH(x)+1, rr); + usz xi = xia - csz; + SGet(x) + B rf; + if (has_w) { + rf = getFillR(fxw); + SGet(fxw) // (⊢˝𝕩)𝔽𝕨 so errors have been caught + for (usz i=0; if; ur xr; if (isAtm(x) || (xr=RNK(x))==0) thrM("𝔽˝𝕩: 𝕩 must have rank at least 1"); @@ -410,7 +436,8 @@ B insert_c1(Md1D* d, B x) { B f = d->f; if (RARE(!isFun(f))) { decG(x); if (isMd(f)) thrM("Calling a modifier"); return inc(f); } if (isPervasiveDyExt(f)) { if (xr==1) return m_unit(fold_c1(d, x)); - if (len==IA(x)) { + usz xia = IA(x); + if (len==xia) { B r = m_vec1(fold_c1(d, C1(shape, x))); ur rr = xr - 1; if (rr > 1) { @@ -420,6 +447,9 @@ B insert_c1(Md1D* d, B x) { B f = d->f; } return r; } + if (len>2 && xia<6*(u64)len) { + return insert_scal(f, c2fn(f), x, 0, m_f64(0), xia, xr-1); + } } if (RTID(f) != RTID_NONE) { u8 rtid = RTID(f); @@ -448,26 +478,34 @@ B insert_c2(Md1D* d, B w, B x) { B f = d->f; usz len = *SH(x); if (len==0) { decG(x); return w; } if (RARE(!isFun(f))) { dec(w); decG(x); if (isMd(f)) thrM("Calling a modifier"); return inc(f); } - if (isPervasiveDyExt(f) && len==IA(x)) { - // 1-element arrays are always conformable - // final rank is higher of w, cell rank of x + if (isPervasiveDyExt(f)) { + usz xia = IA(x); ur rr = xr - 1; - if (isArr(w)) { - if (IA(w) != 1) goto skip; - ur wr = RNK(w); if (wr>rr) rr = wr; - w = TO_GET(w, 0); - } - if (xr > 1) x = C1(shape, x); - B r = m_unit(fold_c2(d, w, x)); - if (rr > 0) { - if (rr == 1) arr_shVec(a(r)); - else { - ShArr* rsh = m_shArr(rr); - PLAINLOOP for (ur i=0; ia[i] = 1; - arr_shReplace(a(r), rr, rsh); + if (len==xia) { + // 1-element arrays are always conformable + // final rank is higher of w, cell rank of x + if (isArr(w)) { + if (IA(w) != 1) goto skip; + ur wr = RNK(w); if (wr>rr) rr = wr; + w = TO_GET(w, 0); } + if (xr > 1) x = C1(shape, x); + B r = m_unit(fold_c2(d, w, x)); + if (rr > 0) { + if (rr == 1) arr_shVec(a(r)); + else { + ShArr* rsh = m_shArr(rr); + PLAINLOOP for (ur i=0; ia[i] = 1; + arr_shReplace(a(r), rr, rsh); + } + } + return r; + } + if (len>2 && xia<6*(u64)len && !(isArr(w) && RNK(w)>rr)) { + FC2 fc2 = c2fn(f); + w = fc2(f, C2(select, m_f64(-1), incG(x)), w); + return insert_scal(f, fc2, x, 1, w, xia, rr); } - return r; skip:; } if (RTID(f) != RTID_NONE) { From e42273bfe894bacad9f472b92c2080b656fdfe7c Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Mon, 10 Mar 2025 12:50:54 -0400 Subject: [PATCH 2/7] =?UTF-8?q?Generic=20stride-1=20=F0=9D=94=BD`=CB=98=20?= =?UTF-8?q?implementation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/cells.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/builtins/cells.c b/src/builtins/cells.c index cf7934a6..6d3450b9 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -102,6 +102,21 @@ B select_cells_base(B inds, B x0, ux csz, ux cam) { // consumes inds,x0; Used by return taga(APD_SH_GET(r, '\0')); } +static B scan_cells_stride1(B f, B x, usz m) { + // m is cell size == scan axis length + B xf = getFillR(x); + HArr_p r = m_harr0c(x); + SGet(x) + FC2 fc2 = c2fn(f); + for (usz i=0, ia=IA(x); if)) break; - u8 frtid = RTID(fd->f); + B f = fd->f; + if (!isFun(f)) break; + u8 frtid = RTID(f); if (frtid==n_rtack) return x; - if (TI(x,elType)==el_bit && (isPervasiveDyExt(fd->f)||frtid==n_ltack) - && 1==shProd(xsh, k+1, xr)) { - B r = scan_rows_bit(frtid, x, m); if (!q_N(r)) return r; + if (1 == shProd(xsh, k+1, xr)) { + if (TI(x,elType)==el_bit && (isPervasiveDyExt(f)||frtid==n_ltack)) { + B r = scan_rows_bit(frtid, x, m); if (!q_N(r)) return r; + } + if (m <= 6) return scan_cells_stride1(f, x, m); } break; } From f1972fc408a0eb4e03d5aa2207dc81434e93ecbb Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Mon, 10 Mar 2025 12:57:25 -0400 Subject: [PATCH 3/7] Faster stride-1 check --- src/builtins/cells.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/builtins/cells.c b/src/builtins/cells.c index 6d3450b9..6ccc7d39 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -556,7 +556,7 @@ B for_cells_c1(B f, u32 xr, u32 cr, u32 k, B x, u32 chr) { // F⎉cr x; array x, if (!isFun(f)) break; u8 frtid = RTID(f); if (frtid==n_rtack) return x; - if (1 == shProd(xsh, k+1, xr)) { + if (cr==1 || cam*m == IA(x)) { if (TI(x,elType)==el_bit && (isPervasiveDyExt(f)||frtid==n_ltack)) { B r = scan_rows_bit(frtid, x, m); if (!q_N(r)) return r; } From bcf32838f4aedd13c3795795c1a2fe2696ba04bf Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 11 Mar 2025 00:15:44 +0200 Subject: [PATCH 4/7] =?UTF-8?q?some=20more=20=CB=9D=20tests,=20use=20COPY?= =?UTF-8?q?=5FTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit not much of a difference, but prettier --- src/builtins/fold.c | 9 +++++---- test/cases/prims.bqn | 7 +++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/builtins/fold.c b/src/builtins/fold.c index 90b38382..5682568f 100644 --- a/src/builtins/fold.c +++ b/src/builtins/fold.c @@ -390,17 +390,18 @@ static B insert_scal(B f, FC2 fc2, B x, bool has_w, B fxw, usz xia, ur rr) { usz* rsh = arr_shAlloc((Arr*)r.c, rr); if (rr>1) shcpy(rsh, SH(x)+1, rr); usz xi = xia - csz; - SGet(x) + B rf; if (has_w) { rf = getFillR(fxw); - SGet(fxw) // (⊢˝𝕩)𝔽𝕨 so errors have been caught - for (usz i=0; i Date: Mon, 10 Mar 2025 20:30:45 +0200 Subject: [PATCH 5/7] =?UTF-8?q?remove=20unnecessary=20F=CB=9C`=CB=98=20acc?= =?UTF-8?q?eptance=20from=20F`=CB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scan_rows_bit only checks frtid, which is 0 for such --- src/builtins/cells.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/builtins/cells.c b/src/builtins/cells.c index 6ccc7d39..1378e36c 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -557,7 +557,7 @@ B for_cells_c1(B f, u32 xr, u32 cr, u32 k, B x, u32 chr) { // F⎉cr x; array x, u8 frtid = RTID(f); if (frtid==n_rtack) return x; if (cr==1 || cam*m == IA(x)) { - if (TI(x,elType)==el_bit && (isPervasiveDyExt(f)||frtid==n_ltack)) { + if (TI(x,elType)==el_bit && (isPervasiveDy(f) || frtid==n_ltack)) { B r = scan_rows_bit(frtid, x, m); if (!q_N(r)) return r; } if (m <= 6) return scan_cells_stride1(f, x, m); From dcecc70c259682fe3729e7b0b1121d2b1ffe3aa9 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Mon, 10 Mar 2025 20:26:38 -0400 Subject: [PATCH 6/7] More careful fill handling with characters in insert_scal --- src/builtins/fold.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/builtins/fold.c b/src/builtins/fold.c index 5682568f..68d13eec 100644 --- a/src/builtins/fold.c +++ b/src/builtins/fold.c @@ -383,6 +383,19 @@ static B m1c1(B t, B f, B x) { // consumes x } extern B insert_base(B f, B x, bool has_w, B w); // from cells.c +static bool fillNumeric(B x) { + if (x.u==0) return true; + if (isAtm(x)) return false; + u8 xe = TI(x,elType); + usz ia = IA(x); + if (xe!=el_B) return ia==0 || elNum(xe); + if (!fillNumeric(getFillN(x))) return false; + if (ia==0) return true; + SGetU(x) + for (usz i=0; i1) shcpy(rsh, SH(x)+1, rr); usz xi = xia - csz; + B xf = getFillN(x); B rf; if (has_w) { + // fxw is (⊢˝𝕩)𝔽𝕨 so shape errors have been caught rf = getFillR(fxw); - COPY_TO(r.a, el_B, 0, fxw, 0, csz); // (⊢˝𝕩)𝔽𝕨 so errors have been caught + COPY_TO(r.a, el_B, 0, fxw, 0, csz); decG(fxw); } else { - rf = getFillR(x); + rf = inc(xf); COPY_TO(r.a, el_B, 0, x, xi, csz); } @@ -406,6 +421,26 @@ static B insert_scal(B f, FC2 fc2, B x, bool has_w, B fxw, usz xia, ur rr) { xi -= csz; for (usz i=0; i 2); + #if SEMANTIC_CATCH + if (CATCH) { + freeThrown(); + rf = bi_noFill; + } else { + if (!has_w) rf = fc2(f, inc(xf), rf); + if (n%2 == !has_w) rf = fc2(f, inc(xf), rf); + else fc2(f, inc(xf), inc(rf)); // could error, -˜˝"abc" + popCatch(); + } + #else + if (n%2 == 0) { dec(rf); rf = bi_noFill; } + #endif + } decG(x); return withFill(r.b, rf); } From f5fdd50f75c6ef2fc44c52a42ae803bf654c224e Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 11 Mar 2025 04:32:14 +0200 Subject: [PATCH 7/7] =?UTF-8?q?test=20alternating=20fills=20of=20=CB=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/cases/fills.bqn | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/cases/fills.bqn b/test/cases/fills.bqn index c2f2635f..5cf46826 100644 --- a/test/cases/fills.bqn +++ b/test/cases/fills.bqn @@ -30,6 +30,10 @@ %USE fill ⋄ Fill ⊢¨"" %EACH_FILLS %% ' ' %USE fill ⋄ Fill ⊢∘⊢¨"" %EACH_FILLS %% ' ' +{3↑ -˝𝕩‿2⥊<<'a'}¨ 5‿6 %!HEAPVERIFY %% <¨¨ ⟨"aa ", 3⥊0⟩ +{3↑ (2⥊2)-˝𝕩‿2⥊<<'x'}¨ 5‿6 %!HEAPVERIFY %% <¨¨ ⟨"vv ", 2‿2‿0⟩ +{3↑ "ee"-˝𝕩‿2⥊<<'a'}¨ 5‿6 %!HEAPVERIFY %% <¨¨ ⟨¯4‿¯4‿0, "ee "⟩ + # TODO: # ⟨↑‿3⥊↕10 ⋄ ↑‿3⥊<¨↕10 ⋄ ↑‿3⥊<˘↕10⟩ # 5‿¯5↑⌜⟨↕2 ⋄ "ab" ⋄ <¨↕2 ⋄ <˘↕2⟩