native vec⊐vec

This commit is contained in:
dzaima 2021-05-20 21:50:54 +03:00
parent 885ce06a23
commit 075773a28c
2 changed files with 47 additions and 25 deletions

View File

@ -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;

View File

@ -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