fix leading-axis operations on empty inputs

This commit is contained in:
dzaima 2023-04-30 19:15:35 +03:00
parent 93dd25e0e1
commit c567dff565
4 changed files with 5 additions and 3 deletions

View File

@ -281,7 +281,7 @@ static B modint_AS(B w, B xv) { return modint_AA(w, C2(shape, C1(fne, incG(w))
ur xr=RNK(x); usz* wsh=SH(w); ur mr=wr<xr?wr:xr; \
if (!eqShPart(wsh, xsh, mr)) thrF(CHR ": Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); \
if (wr!=xr) { \
if (TI(w,elType)!=el_B && TI(x,elType)!=el_B) return leading_axis_arith(NAME##_c2, w, x, wsh, xsh, mr); \
if (TI(w,elType)!=el_B && TI(x,elType)!=el_B && IA(w)!=0 && IA(x)!=0) return leading_axis_arith(NAME##_c2, w, x, wsh, xsh, mr); \
else goto bad; \
} \
usz ia = IA(x); B r; \

View File

@ -118,8 +118,8 @@ NOINLINE B toKCells(B x, ur k) {
}
B slash_c2(B, B, B);
NOINLINE B leading_axis_arith(FC2 fc2, B w, B x, usz* wsh, usz* xsh, ur mr) { // assumes non-equal rank conforming typed array arguments
assert(isArr(w) && isArr(x) && TI(w,elType)!=el_B && TI(x,elType)!=el_B);
NOINLINE B leading_axis_arith(FC2 fc2, B w, B x, usz* wsh, usz* xsh, ur mr) { // assumes non-equal rank non-empty conforming typed array arguments
assert(isArr(w) && isArr(x) && TI(w,elType)!=el_B && TI(x,elType)!=el_B && IA(w)!=0 && IA(x)!=0);
ur wr = RNK(w);
ur xr = RNK(x);
#if DEBUG

View File

@ -142,6 +142,7 @@ B leading_axis_arith(FC2 fc2, B w, B x, usz* wsh, usz* xsh, ur mr);
ur xr=RNK(x); usz* xsh=SH(x); \
if (wr!=xr) { \
ur mr = wr<xr? wr : xr; \
if (IA(w)==0 || IA(x)==0) goto base;\
if (!eqShPart(wsh, xsh, mr)) goto badShape; \
return leading_axis_arith(NAME##_c2, w, x, wsh, xsh, mr); \
} \

View File

@ -66,6 +66,7 @@ NOINLINE B dyArith_AA(DyTableAA* table, B w, B x) {
usz* xsh=SH(x);
usz* wsh=SH(w);
ur mr=wr<xr?wr:xr;
if (IA(w)==0 || IA(x)==0) goto rec;
if (!eqShPart(wsh, xsh, mr)) goto rec;
return leading_axis_arith(table->mainFn, w, x, wsh, xsh, mr);
}