Check rank vector completely before starting computations in ⎉

This commit is contained in:
Marshall Lochbaum 2022-05-29 11:46:54 -04:00
parent b8701d3502
commit 2c0de9ee02

View File

@ -210,31 +210,38 @@ static B m2c2(B t, B f, B g, B w, B x) { // consumes w,x
return r;
}
static usz check_rank_vec(B g) {
if (!isArr(g)) thrM("⎉: Invalid 𝔾 result");
usz gia = a(g)->ia;
if (!(gia>=1 && gia<=3)) thrM("⎉: 𝔾 result must have 1 to 3 elements");
SGetU(g)
if (TI(g,elType)>=el_f64) for (i32 i = 0; i < gia; i++) {
f64 e = o2f(GetU(g,i));
if (floor(e)!=e) thrM("⎉: 𝕘 was a fractional number");
}
return gia;
}
B rank_c1(Md2D* d, B x) { B f = d->f; B g = d->g;
f64 kf;
bool gf = isFun(g);
if (RARE(gf)) g = c1(g, inc(x));
if (LIKELY(isNum(g))) {
kf = o2fu(g);
} else if (isArr(g)) {
usz gia = a(g)->ia;
if (!(gia>=1 && gia<=3)) thrM("⎉: 𝔾 result must have 1 to 3 elements");
SGetU(g)
if (!elNum(TI(g,elType))) for (i32 i = 0; i < gia; i++) o2f(GetU(g,i));
kf = GetU(g, gia==2).f;
} else thrM("⎉: Invalid 𝔾 result");
if (floor(kf)!=kf) thrM("⎉: 𝕘 was a fractional number");
} else {
usz gia = check_rank_vec(g);
SGetU(g); kf = GetU(g, gia==2).f;
}
if (gf) dec(g);
i32 k = kf;
if (isAtm(x) || rnk(x)==0) {
if (floor(kf)!=kf) thrM("⎉: 𝕘 was a fractional number");
B r = c1(f, x);
return isAtm(r)? m_atomUnit(r) : r;
}
i32 xr = rnk(x);
usz* xsh = a(x)->sh;
if (k!=kf) {
if (floor(kf)!=kf) thrM("⎉: 𝕘 was a fractional number");
k = kf>0? 0 : xr;
} else {
k = k<0? (k+xr<0? xr : xr-(k+xr)) : (k>xr? 0 : xr-k);