From 9028ebfe8bd0ef61f70063125316e85a4647fcd6 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Mon, 29 Aug 2022 07:38:36 -0400 Subject: [PATCH 1/7] =?UTF-8?q?Native=20Windows=20(=E2=86=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/fns.c | 75 ++++++++++++++++++++++++++++++++++++++++++++-- src/load.c | 3 +- 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/src/builtins/fns.c b/src/builtins/fns.c index 9f1e55a4..293cce00 100644 --- a/src/builtins/fns.c +++ b/src/builtins/fns.c @@ -76,9 +76,80 @@ B ud_c1(B t, B x) { return taga(r); } -extern B rt_ud; B ud_c2(B t, B w, B x) { - return c2(rt_ud, w, x); + usz wia=1; + if (isArr(w)) { + if (RNK(w)>1) thrM("↕: 𝕨 must have rank at most 1"); + wia = IA(w); + if (wia==0) { decG(w); return x; } + } + ur xr; + if (isAtm(x) || (xr=RNK(x)) UR_MAX) thrM("↕: Result rank too large"); + ur wr = wia; + ur rr = xr + wr; + ShArr* sh = m_shArr(rr); + usz* rsh = sh->a; + usz* wsh = rsh + wr; + if (isAtm(w)) { + wsh[0] = o2s(w); + } else { + SGetU(w) + for (usz i=0; i Date: Mon, 29 Aug 2022 21:05:46 -0400 Subject: [PATCH 2/7] Extend self-search typed code to characters by treating as numbers --- src/builtins/selfsearch.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/builtins/selfsearch.c b/src/builtins/selfsearch.c index 8a77794f..5eb430ca 100644 --- a/src/builtins/selfsearch.c +++ b/src/builtins/selfsearch.c @@ -9,9 +9,10 @@ B memberOf_c1(B t, B x) { if (n==0) { decG(x); return emptyIVec(); } if (RNK(x)>1) x = toCells(x); u8 xe = TI(x,elType); + if (elChr(xe)) xe -= el_c8-el_i8; #define BRUTE(T) \ - i##T* xp = i##T##any_ptr(x); \ + i##T* xp = tyany_ptr(x); \ u64* rp; B r = m_bitarrv(&rp, n); bitp_set(rp, 0, 1); \ for (usz i=1; i8 && n3*n?tn:3*n)+(2*rx+1)*sizeof(usz))); @@ -95,9 +96,10 @@ B count_c1(B t, B x) { if (n>(usz)I32_MAX+1) thrM("βŠ’: Argument length >2⋆31 not supported"); if (RNK(x)>1) x = toCells(x); u8 xe = TI(x,elType); + if (elChr(xe)) xe -= el_c8-el_i8; #define BRUTE(T) \ - i##T* xp = i##T##any_ptr(x); \ + i##T* xp = tyany_ptr(x); \ i8* rp; B r = m_i8arrv(&rp, n); rp[0]=0; \ for (usz i=1; i8 && nn?tn:n)+(2*rx+1)*sizeof(usz))); @@ -186,9 +188,10 @@ B indexOf_c1(B t, B x) { if (n>(usz)I32_MAX+1) thrM("⊐: Argument length >2⋆31 not supported"); if (RNK(x)>1) x = toCells(x); u8 xe = TI(x,elType); + if (elChr(xe)) xe -= el_c8-el_i8; #define BRUTE(T) \ - i##T* xp = i##T##any_ptr(x); \ + i##T* xp = tyany_ptr(x); \ i8* rp; B r = m_i8arrv(&rp, n); rp[0]=0; \ TALLOC(i##T, uniq, n); uniq[0]=xp[0]; \ for (usz i=1, u=1; i8 && n Date: Tue, 30 Aug 2022 09:36:33 -0400 Subject: [PATCH 3/7] =?UTF-8?q?Use=20or-equals=20for=20dyadic=20=E2=88=8A?= =?UTF-8?q?=20when=20=F0=9D=95=A9=20is=20small=20and=20arguments=20are=20f?= =?UTF-8?q?lat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/fns.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/builtins/fns.c b/src/builtins/fns.c index 293cce00..db917d34 100644 --- a/src/builtins/fns.c +++ b/src/builtins/fns.c @@ -242,6 +242,8 @@ B indexOf_c2(B t, B w, B x) { B enclosed_0; B enclosed_1; extern B rt_memberOf; +extern B eq_c2(B,B,B); +extern B or_c2(B,B,B); B memberOf_c2(B t, B w, B x) { if (isAtm(x) || RNK(x)!=1) goto bad; if (isAtm(w)) goto single; @@ -269,8 +271,15 @@ B memberOf_c2(B t, B w, B x) { many: { - usz xia = IA(x); - usz wia = IA(w); + u8 we = TI(w,elType); usz wia = IA(w); + u8 xe = TI(x,elType); usz xia = IA(x); + if (xia<=16 && wia>16 && we Date: Tue, 30 Aug 2022 18:39:36 -0400 Subject: [PATCH 4/7] =?UTF-8?q?Optimistic=20special=20case=20to=20quickly?= =?UTF-8?q?=20invert=20permutations=20with=20=E2=8D=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/grade.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/builtins/grade.h b/src/builtins/grade.h index 95aaca74..afca9910 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -220,13 +220,22 @@ B GRADE_CAT(c1)(B t, B x) { if (xe==el_i32 || xe==el_c32) { // safe to use the same comparison for i32 & c32 as c32 is 0≀x≀1114111 i32* xp = tyany_ptr(x); i32 min=I32_MAX, max=I32_MIN; + i32 sum=0; for (usz i = 0; i < ia; i++) { i32 c = xp[i]; + sum += c; if (cmax) max=c; } i64 range = max - (i64)min + 1; if (range/2 < ia) { + // First try to invert it as a permutation + if (range==ia && sum==(i32)((i64)ia*(min+max)/2)) { + for (usz i = 0; i < ia; i++) rp[i]=ia; + for (usz i = 0; i < ia; i++) { i32 v=xp[i]; GRADE_UD(rp[v-min],rp[max-v])=i; } + bool done=1; for (usz i = 0; i < ia; i++) done &= rp[i]!=ia; + if (done) { decG(x); return r; } + } TALLOC(usz, tmp, range+1); for (i64 i = 0; i < range+1; i++) tmp[i] = 0; GRADE_UD( // i32 range-based From 6f02705d9f732286fe91d0397a80aa6d78150a73 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Tue, 30 Aug 2022 18:50:21 -0400 Subject: [PATCH 5/7] Make small-range Grade code style more like radix code --- src/builtins/grade.h | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/builtins/grade.h b/src/builtins/grade.h index afca9910..3ec9a8c9 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -227,7 +227,7 @@ B GRADE_CAT(c1)(B t, B x) { if (cmax) max=c; } - i64 range = max - (i64)min + 1; + u64 range = max - (i64)min + 1; if (range/2 < ia) { // First try to invert it as a permutation if (range==ia && sum==(i32)((i64)ia*(min+max)/2)) { @@ -236,18 +236,12 @@ B GRADE_CAT(c1)(B t, B x) { bool done=1; for (usz i = 0; i < ia; i++) done &= rp[i]!=ia; if (done) { decG(x); return r; } } - TALLOC(usz, tmp, range+1); - for (i64 i = 0; i < range+1; i++) tmp[i] = 0; - GRADE_UD( // i32 range-based - for (usz i = 0; i < ia; i++) (tmp-min+1)[xp[i]]++; - for (i64 i = 1; i < range; i++) tmp[i]+= tmp[i-1]; - for (usz i = 0; i < ia; i++) rp[(tmp-min)[xp[i]]++] = i; - , - for (usz i = 0; i < ia; i++) (tmp-min)[xp[i]]++; - for (i64 i = range-2; i >= 0; i--) tmp[i]+= tmp[i+1]; - for (usz i = 0; i < ia; i++) rp[(tmp-min+1)[xp[i]]++] = i; - ) - TFREE(tmp); decG(x); + TALLOC(usz, c0, range); usz *c0o=c0-min; + for (usz i = 0; i < range; i++) c0[i] = 0; + for (usz i = 0; i < ia; i++) c0o[xp[i]]++; + usz s=0; FOR (i, range) { usz p=s; s+=c0[i]; c0[i]=p; } + for (usz i = 0; i < ia; i++) rp[c0o[xp[i]]++] = i; + TFREE(c0); decG(x); return r; } if (ia > 40) { From 1e0cf78fd00eda2a9c568b6fef240326f16d5245 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Tue, 30 Aug 2022 20:37:38 -0400 Subject: [PATCH 6/7] Implement 4-byte where with blocks of 2-byte where --- src/builtins/sfns.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 1c516f4d..70e72bc8 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -443,10 +443,26 @@ B slash_c1(B t, B x) { B r; u8 xe = TI(x,elType); #if SINGELI && defined(__BMI2__) - if (xia<=32768 && xe==el_bit) { + if (xe==el_bit) { u64* xp = bitarr_ptr(x); - if (xia<=128) { i8* rp = m_tyarrvO(&r, 1, s, t_i8arr , 8); bmipopc_1slash8 (xp, rp, xia); } - else { i16* rp = m_tyarrvO(&r, 2, s, t_i16arr, 16); bmipopc_1slash16(xp, rp, xia); } + if (xia<=128) { i8* rp = m_tyarrvO(&r, 1, s, t_i8arr , 8); bmipopc_1slash8 (xp, rp, xia); } + else if (xia<=32768) { i16* rp = m_tyarrvO(&r, 2, s, t_i16arr, 16); bmipopc_1slash16(xp, rp, xia); } + else { + usz b = 1<<12; + i32* rp; r = m_i32arrv(&rp, s); + TALLOC(i16, buf, b); + i32* rq=rp; usz i=0; + for (; i+b Date: Wed, 31 Aug 2022 15:12:05 -0400 Subject: [PATCH 7/7] Dyadic 32-bit / based on 8-bit monadic / --- src/builtins/sfns.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 70e72bc8..529edefe 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -551,6 +551,24 @@ B slash_c2(B t, B w, B x) { #if SINGELI case el_i8: case el_c8: { i8* xp=tyany_ptr(x); i8* rp=m_tyarrvO(&r,1,wsum,el2t(xe), 8); bmipopc_2slash8 (wp, xp, rp, wia); goto bit_ret; } case el_i16:case el_c16: { i16* xp=tyany_ptr(x); i16* rp=m_tyarrvO(&r,2,wsum,el2t(xe), 16); bmipopc_2slash16(wp, xp, rp, wia); goto bit_ret; } + case el_i32:case el_c32: { + i32* xp=tyany_ptr(x); i32* rp=m_tyarrv(&r,4,wsum,el2t(xe)); + usz b = 1<<7; + TALLOC(i8, buf, b); + i32* rq=rp; i32* end=xp+xia-b; + while (xp < end) { + bmipopc_1slash8(wp, buf, b); + usz bs = bit_sum(wp, b); + for (usz j=0; j