From 7b3c69f9dad650eacde490dbeb913051a675d803 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Mon, 7 Nov 2022 15:35:53 -0500 Subject: [PATCH] Take sum first in boolean plus-scan; special code for sparse or boolean sum --- src/builtins/md1.c | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index a87b339f..5fc42dec 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -156,6 +156,8 @@ static i64 bit_diff(u64* x, u64 am) { static u64 vg_rand(u64 x) { return x; } #endif +B slash_c1(B f, B x); + B scan_c1(Md1D* d, B x) { B f = d->f; if (isAtm(x) || RNK(x)==0) thrM("`: Argument cannot have rank 0"); ur xr = RNK(x); @@ -167,15 +169,35 @@ B scan_c1(Md1D* d, B x) { B f = d->f; u8 rtid = v(f)->flags-1; if (xe==el_bit) { u64* xp=bitarr_ptr(x); - if (rtid==n_add && iaI32_MAX) goto base; + if (xs<=1) { if (xs==0) return x; goto bit_or; } + if (xs < ia/128) { + B ones = slash_c1(m_f64(0), x); + u8 re = xs<=I8_MAX? el_i8 : xs<=I16_MAX? el_i16 : el_i32; + MAKE_MUT(r0, ia) mut_init(r0, re); MUTG_INIT(r0); + SGetU(ones) + usz ri = 0; + for (usz i = 0; i < xs; i++) { + usz e = o2s(GetU(ones, i)); + mut_fillG(r0, ri, m_i32(i), e-ri); + ri = e; + } + if (ri