native baseline high-rank 𝕨⊒𝕩
This commit is contained in:
parent
ec169b1006
commit
5a9e5e8e50
@ -41,15 +41,15 @@ static u64 elRange(u8 eltype) { return 1ull<<(1<<elWidthLogBits(eltype)); }
|
|||||||
TFREE(tab0);
|
TFREE(tab0);
|
||||||
|
|
||||||
typedef struct { B n, p; } B2;
|
typedef struct { B n, p; } B2;
|
||||||
static NOINLINE B2 splitCells(B n, B p, bool indexOf) {
|
static NOINLINE B2 splitCells(B n, B p, u8 mode) { // 0:∊ 1:⊐ 2:⊒
|
||||||
#define SYMB (indexOf? "⊐" : "∊")
|
#define SYMB (mode==0? "∊" : mode==1? "⊐" : "⊒")
|
||||||
#define ARG_N (indexOf? "𝕩" : "𝕨")
|
#define ARG_N (mode? "𝕩" : "𝕨")
|
||||||
#define ARG_P (indexOf? "𝕨" : "𝕩")
|
#define ARG_P (mode? "𝕨" : "𝕩")
|
||||||
if (isAtm(p) || RNK(p)==0) thrF("%U: %U cannot have rank 0", SYMB, ARG_P);
|
if (isAtm(p) || RNK(p)==0) thrF("%U: %U cannot have rank 0", SYMB, ARG_P);
|
||||||
ur pr = RNK(p);
|
ur pr = RNK(p);
|
||||||
if (isAtm(n)) n = m_hunit(n);
|
if (isAtm(n)) n = m_hunit(n);
|
||||||
ur nr = RNK(n);
|
ur nr = RNK(n);
|
||||||
if (nr < pr-1) thrF("%U: Rank of %U must be at least the cell rank of %U (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", SYMB, ARG_N, ARG_P, indexOf? p : n, indexOf? n : p);
|
if (nr < pr-1) thrF("%U: Rank of %U must be at least the cell rank of %U (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", SYMB, ARG_N, ARG_P, mode? p : n, mode? n : p);
|
||||||
ur cr = pr-1;
|
ur cr = pr-1;
|
||||||
n = toKCells(n, nr-cr);
|
n = toKCells(n, nr-cr);
|
||||||
p = toKCells(p, 1);
|
p = toKCells(p, 1);
|
||||||
@ -63,7 +63,7 @@ static NOINLINE B2 splitCells(B n, B p, bool indexOf) {
|
|||||||
|
|
||||||
B indexOf_c2(B t, B w, B x) {
|
B indexOf_c2(B t, B w, B x) {
|
||||||
if (RARE(!isArr(w) || RNK(w)!=1)) {
|
if (RARE(!isArr(w) || RNK(w)!=1)) {
|
||||||
B2 t = splitCells(x, w, true);
|
B2 t = splitCells(x, w, 1);
|
||||||
w = t.p;
|
w = t.p;
|
||||||
x = t.n;
|
x = t.n;
|
||||||
}
|
}
|
||||||
@ -210,10 +210,13 @@ B memberOf_c2(B t, B w, B x) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern B rt_count;
|
|
||||||
B count_c2(B t, B w, B x) {
|
B count_c2(B t, B w, B x) {
|
||||||
if (!isArr(w) || RNK(w)==0) thrM("⊒: 𝕨 must have rank at least 1");
|
if (RARE(!isArr(w) || RNK(w)!=1)) {
|
||||||
if (RNK(w)!=1) return c2rt(count, w, x);
|
B2 t = splitCells(x, w, 2);
|
||||||
|
w = t.p;
|
||||||
|
x = t.n;
|
||||||
|
}
|
||||||
|
|
||||||
if (!isArr(x) || IA(x)<=1) return indexOf_c2(m_f64(0), w, x);
|
if (!isArr(x) || IA(x)<=1) return indexOf_c2(m_f64(0), w, x);
|
||||||
u8 we = TI(w,elType); usz wia = IA(w);
|
u8 we = TI(w,elType); usz wia = IA(w);
|
||||||
u8 xe = TI(x,elType); usz xia = IA(x);
|
u8 xe = TI(x,elType); usz xia = IA(x);
|
||||||
|
|||||||
@ -418,7 +418,6 @@ void load_init() { // very last init function
|
|||||||
rt_slash = Get(rtObjRaw, n_slash ); gc_add(rt_slash);
|
rt_slash = Get(rtObjRaw, n_slash ); gc_add(rt_slash);
|
||||||
rt_group = Get(rtObjRaw, n_group ); gc_add(rt_group);
|
rt_group = Get(rtObjRaw, n_group ); gc_add(rt_group);
|
||||||
rt_under = Get(rtObjRaw, n_under ); gc_add(rt_under);
|
rt_under = Get(rtObjRaw, n_under ); gc_add(rt_under);
|
||||||
rt_count = Get(rtObjRaw, n_count ); gc_add(rt_count);
|
|
||||||
rt_find = Get(rtObjRaw, n_find ); gc_add(rt_find);
|
rt_find = Get(rtObjRaw, n_find ); gc_add(rt_find);
|
||||||
rt_transp = Get(rtObjRaw, n_transp ); gc_add(rt_transp);
|
rt_transp = Get(rtObjRaw, n_transp ); gc_add(rt_transp);
|
||||||
rt_depth = Get(rtObjRaw, n_depth ); gc_add(rt_depth);
|
rt_depth = Get(rtObjRaw, n_depth ); gc_add(rt_depth);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user