Use or-equals for dyadic ∊ when 𝕩 is small and arguments are flat
This commit is contained in:
parent
15b444540e
commit
a42335af4f
@ -242,6 +242,8 @@ B indexOf_c2(B t, B w, B x) {
|
|||||||
B enclosed_0;
|
B enclosed_0;
|
||||||
B enclosed_1;
|
B enclosed_1;
|
||||||
extern B rt_memberOf;
|
extern B rt_memberOf;
|
||||||
|
extern B eq_c2(B,B,B);
|
||||||
|
extern B or_c2(B,B,B);
|
||||||
B memberOf_c2(B t, B w, B x) {
|
B memberOf_c2(B t, B w, B x) {
|
||||||
if (isAtm(x) || RNK(x)!=1) goto bad;
|
if (isAtm(x) || RNK(x)!=1) goto bad;
|
||||||
if (isAtm(w)) goto single;
|
if (isAtm(w)) goto single;
|
||||||
@ -269,8 +271,15 @@ B memberOf_c2(B t, B w, B x) {
|
|||||||
|
|
||||||
|
|
||||||
many: {
|
many: {
|
||||||
usz xia = IA(x);
|
u8 we = TI(w,elType); usz wia = IA(w);
|
||||||
usz wia = IA(w);
|
u8 xe = TI(x,elType); usz xia = IA(x);
|
||||||
|
if (xia<=16 && wia>16 && we<el_B && xe<el_B) {
|
||||||
|
SGetU(x);
|
||||||
|
Arr* ba=allZeroes(wia); arr_shVec(ba); r=taga(ba);
|
||||||
|
for (usz i=0; i<xia; i++) r = or_c2(m_f64(0), r, eq_c2(m_f64(0), inc(w), GetU(x,i)));
|
||||||
|
decG(w);
|
||||||
|
goto dec_x;
|
||||||
|
}
|
||||||
// TODO O(wia×xia) for small wia or xia
|
// TODO O(wia×xia) for small wia or xia
|
||||||
H_Sb* set = m_Sb(64);
|
H_Sb* set = m_Sb(64);
|
||||||
SGetU(x) SGetU(w)
|
SGetU(x) SGetU(w)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user