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");
|
if (isAtm(x)) thrM("⊐: 𝕩 cannot have rank 0");
|
||||||
usz xia = a(x)->ia;
|
usz xia = a(x)->ia;
|
||||||
if (xia==0) { dec(x); return inc(bi_emptyIVec); }
|
if (xia==0) { dec(x); return inc(bi_emptyIVec); }
|
||||||
// if (rnk(x)==1 && TI(x).elType==el_i32) {
|
if (rnk(x)==1 && TI(x).elType==el_i32) {
|
||||||
// i32* xp = i32any_ptr(x);
|
i32* xp = i32any_ptr(x);
|
||||||
// i32 min=I32_MAX, max=I32_MIN;
|
i32 min=I32_MAX, max=I32_MIN;
|
||||||
// for (usz i = 0; i < xia; i++) {
|
for (usz i = 0; i < xia; i++) {
|
||||||
// i32 c = xp[i];
|
i32 c = xp[i];
|
||||||
// if (c<min) min = c;
|
if (c<min) min = c;
|
||||||
// if (c>max) max = c;
|
if (c>max) max = c;
|
||||||
// }
|
}
|
||||||
// i32 dst = 1 + max-(i64)min;
|
i32 dst = 1 + max-(i64)min;
|
||||||
// if ((dst<xia*5 || dst<50) && min!=I32_MIN) {
|
if ((dst<xia*5 || dst<50) && min!=I32_MIN) {
|
||||||
// i32* rp; B r = m_i32arrv(&rp, xia);
|
i32* rp; B r = m_i32arrv(&rp, xia);
|
||||||
// i32 tmp[dst];
|
i32 tmp[dst];
|
||||||
// for (usz i = 0; i < dst; i++) tmp[i] = I32_MIN;
|
for (usz i = 0; i < dst; i++) tmp[i] = I32_MIN;
|
||||||
// i32* tc = tmp-min;
|
i32* tc = tmp-min;
|
||||||
// i32 ctr = 0;
|
i32 ctr = 0;
|
||||||
// for (usz i = 0; i < xia; i++) {
|
for (usz i = 0; i < xia; i++) {
|
||||||
// i32 c = xp[i];
|
i32 c = xp[i];
|
||||||
// if (tc[c]==I32_MIN) tc[c] = ctr++;
|
if (tc[c]==I32_MIN) tc[c] = ctr++;
|
||||||
// rp[i] = tc[c];
|
rp[i] = tc[c];
|
||||||
// }
|
}
|
||||||
// dec(x);
|
dec(x);
|
||||||
// return r;
|
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
|
// 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();
|
// // u64 s = nsTime();
|
||||||
// i32* rp; B r = m_i32arrv(&rp, xia);
|
// i32* rp; B r = m_i32arrv(&rp, xia);
|
||||||
@ -284,7 +284,21 @@ B indexOf_c1(B t, B x) {
|
|||||||
return c1(rt_indexOf, x);
|
return c1(rt_indexOf, x);
|
||||||
}
|
}
|
||||||
B indexOf_c2(B t, B w, B 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;
|
B rt_memberOf;
|
||||||
|
|||||||
@ -81,6 +81,14 @@ static inline bool N(has) (Map* m, KT k) {
|
|||||||
N(find)(m, k, h1, h2, &has);
|
N(find)(m, k, h1, h2, &has);
|
||||||
return 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
|
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