From 139faee0a1cee0150009f1c6f71c6595f3d8af75 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sun, 28 Aug 2022 09:16:09 -0400 Subject: [PATCH 1/3] Unify integer and character Bins --- src/builtins/grade.h | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/builtins/grade.h b/src/builtins/grade.h index 698e1fb6..3d56a06f 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -293,9 +293,24 @@ B GRADE_CAT(c2)(B t, B w, B x) { u8 fl = GRADE_UD(fl_asc,fl_dsc); - if (we<=el_i32 & xe<=el_i32) { - w = toI32Any(w); i32* wi = i32any_ptr(w); - x = toI32Any(x); i32* xi = i32any_ptr(x); + if (LIKELY(weel_i32 | xe>el_i32) goto gen; + w=toI32Any(w); x=toI32Any(x); + } else { + for (u64 i=0; i,<) 0) thrM(GRADE_CHR": 𝕨 must be sorted"GRADE_UD(," in descending order")); FL_SET(w, fl); @@ -312,6 +327,7 @@ B GRADE_CAT(c2)(B t, B w, B x) { rp[i] = s; } } else { +gen: SGetU(x) SLOW2("𝕨"GRADE_CHR"𝕩", w, x); B* wp = arr_bptr(w); @@ -336,6 +352,7 @@ B GRADE_CAT(c2)(B t, B w, B x) { rp[i] = s; } } +done: decG(w);decG(x); return r; } From f80d3ce263f42eab57e67301084a2ed101c8b3f1 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sun, 28 Aug 2022 09:16:25 -0400 Subject: [PATCH 2/3] Branchless integer binary search --- src/builtins/grade.h | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/builtins/grade.h b/src/builtins/grade.h index 3d56a06f..66c77276 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -318,13 +318,9 @@ B GRADE_CAT(c2)(B t, B w, B x) { for (usz i = 0; i < xia; i++) { i32 c = xi[i]; - usz s = 0, e = wia+1; - while (e-s > 1) { - usz m = (s+(i64)e)/2; - if (c LT wi[m-1]) e = m; - else s = m; - } - rp[i] = s; + i32 *s = wi-1; + for (usz l = wia+1, h; (h=l/2)>0; l-=h) s += h * !(c LT s[h]); + rp[i] = s - (wi-1); } } else { gen: From 3c1ef1c9a2b20fd48ddc66c4ba0de46cc3ed3dbf Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 28 Aug 2022 16:44:21 +0300 Subject: [PATCH 3/3] use elNum --- src/builtins/grade.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/builtins/grade.h b/src/builtins/grade.h index 66c77276..95aaca74 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -294,15 +294,15 @@ B GRADE_CAT(c2)(B t, B w, B x) { u8 fl = GRADE_UD(fl_asc,fl_dsc); if (LIKELY(weel_i32 | xe>el_i32) goto gen; + if (elNum(we)) { // number + if (elNum(xe)) { + if (we==el_f64 | xe==el_f64) goto gen; w=toI32Any(w); x=toI32Any(x); } else { for (u64 i=0; i