native vec⊐vec
This commit is contained in:
parent
885ce06a23
commit
075773a28c
64
src/fns.c
64
src/fns.c
@ -223,30 +223,30 @@ B indexOf_c1(B t, B x) {
|
||||
if (isAtm(x)) thrM("⊐: 𝕩 cannot have rank 0");
|
||||
usz xia = a(x)->ia;
|
||||
if (xia==0) { dec(x); return inc(bi_emptyIVec); }
|
||||
// if (rnk(x)==1 && TI(x).elType==el_i32) {
|
||||
// i32* xp = i32any_ptr(x);
|
||||
// i32 min=I32_MAX, max=I32_MIN;
|
||||
// for (usz i = 0; i < xia; i++) {
|
||||
// i32 c = xp[i];
|
||||
// if (c<min) min = c;
|
||||
// if (c>max) max = c;
|
||||
// }
|
||||
// i32 dst = 1 + max-(i64)min;
|
||||
// if ((dst<xia*5 || dst<50) && min!=I32_MIN) {
|
||||
// i32* rp; B r = m_i32arrv(&rp, xia);
|
||||
// i32 tmp[dst];
|
||||
// for (usz i = 0; i < dst; i++) tmp[i] = I32_MIN;
|
||||
// i32* tc = tmp-min;
|
||||
// i32 ctr = 0;
|
||||
// for (usz i = 0; i < xia; i++) {
|
||||
// i32 c = xp[i];
|
||||
// if (tc[c]==I32_MIN) tc[c] = ctr++;
|
||||
// rp[i] = tc[c];
|
||||
// }
|
||||
// dec(x);
|
||||
// return r;
|
||||
// }
|
||||
// }
|
||||
if (rnk(x)==1 && TI(x).elType==el_i32) {
|
||||
i32* xp = i32any_ptr(x);
|
||||
i32 min=I32_MAX, max=I32_MIN;
|
||||
for (usz i = 0; i < xia; i++) {
|
||||
i32 c = xp[i];
|
||||
if (c<min) min = c;
|
||||
if (c>max) max = c;
|
||||
}
|
||||
i32 dst = 1 + max-(i64)min;
|
||||
if ((dst<xia*5 || dst<50) && min!=I32_MIN) {
|
||||
i32* rp; B r = m_i32arrv(&rp, xia);
|
||||
i32 tmp[dst];
|
||||
for (usz i = 0; i < dst; i++) tmp[i] = I32_MIN;
|
||||
i32* tc = tmp-min;
|
||||
i32 ctr = 0;
|
||||
for (usz i = 0; i < xia; i++) {
|
||||
i32 c = xp[i];
|
||||
if (tc[c]==I32_MIN) tc[c] = ctr++;
|
||||
rp[i] = tc[c];
|
||||
}
|
||||
dec(x);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
// if (rnk(x)==1) { // relies on equal hashes implying equal objects, which has like a 2⋆¯64 chance of being false per item
|
||||
// // u64 s = nsTime();
|
||||
// i32* rp; B r = m_i32arrv(&rp, xia);
|
||||
@ -284,7 +284,21 @@ B indexOf_c1(B t, B x) {
|
||||
return c1(rt_indexOf, x);
|
||||
}
|
||||
B indexOf_c2(B t, B w, B x) {
|
||||
return c2(rt_indexOf, w, x);
|
||||
if (!isArr(w) || rnk(w)!=1 || !isArr(x) || rnk(x)!=1) return c2(rt_indexOf, w, x);
|
||||
usz wia = a(w)->ia;
|
||||
usz xia = a(x)->ia;
|
||||
// TODO O(wia×xia) for small wia
|
||||
i32* rp; B r = m_i32arrv(&rp, xia);
|
||||
H_b2i* map = m_b2i(64);
|
||||
BS2B xgetU = TI(x).getU;
|
||||
BS2B wgetU = TI(w).getU;
|
||||
for (usz i = 0; i < wia; i++) {
|
||||
bool had; u64 p = mk_b2i(&map, wgetU(w,i), &had);
|
||||
if (!had) map->a[p].val = i;
|
||||
}
|
||||
for (usz i = 0; i < xia; i++) rp[i] = getD_b2i(map, xgetU(x,i), wia);
|
||||
free_b2i(map); dec(w); dec(x);
|
||||
return r;
|
||||
}
|
||||
|
||||
B rt_memberOf;
|
||||
|
||||
@ -81,6 +81,14 @@ static inline bool N(has) (Map* m, KT k) {
|
||||
N(find)(m, k, h1, h2, &has);
|
||||
return has;
|
||||
}
|
||||
#ifdef VALS
|
||||
static inline u64 N(getD) (Map* m, KT k, VT def) {
|
||||
bool has;
|
||||
u64 h1 = H1(k); u64 h2 = H2(k, h1);
|
||||
u64 p = N(find)(m, k, h1, h2, &has);
|
||||
return has? m->a[p].val : def;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static inline void N(qins) (Map* m, u64 h1, HT h2, KT k IFVAL(, VT v)) { // if guaranteed that k doesn't exist in the map yet and there's space for this
|
||||
|
||||
Loading…
Reference in New Issue
Block a user