commit
47f48bbd94
@ -147,6 +147,7 @@ B shape_c2(B t, B w, B x) {
|
||||
unkPos = i;
|
||||
if (!isPrim(c)) thrM("⥊: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑");
|
||||
unkInd = ((i32)v(c)->flags) - 1;
|
||||
good|= xia==0 | unkInd==n_floor;
|
||||
}
|
||||
}
|
||||
if (bad && !good) thrM("⥊: 𝕨 too large");
|
||||
@ -712,36 +713,50 @@ B slash_im(B t, B x) {
|
||||
usz xia = IA(x);
|
||||
if (xia==0) { decG(x); return emptyIVec(); }
|
||||
switch(xe) { default: UD;
|
||||
case el_i8: {
|
||||
i8* xp = i8any_ptr(x);
|
||||
usz i,j; B r; i8 max=-1;
|
||||
for (i = 0; i < xia; i++) { i8 c=xp[i]; if (c<=max) break; max=c; }
|
||||
for (j = i; j < xia; j++) { i8 c=xp[j]; max=c>max?c:max; if (c<0) thrM("/⁼: Argument cannot contain negative numbers"); }
|
||||
usz ria = max+1;
|
||||
if (i==xia) {
|
||||
u64* rp; r = m_bitarrv(&rp, ria); for (usz i=0; i<BIT_N(ria); i++) rp[i]=0;
|
||||
for (usz i = 0; i < xia; i++) bitp_set(rp, xp[i], 1);
|
||||
} else {
|
||||
i32* rp; r = m_i32arrv(&rp, ria); for (usz i=0; i<ria; i++) rp[i]=0;
|
||||
for (usz i = 0; i < xia; i++) rp[xp[i]]++;
|
||||
}
|
||||
decG(x); return r;
|
||||
case el_bit: {
|
||||
usz sum = bit_sum(bitarr_ptr(x), xia);
|
||||
usz ria = 1 + (sum>0);
|
||||
f64* rp; B r = m_f64arrv(&rp, ria);
|
||||
rp[sum>0] = sum; rp[0] = xia - sum;
|
||||
decG(x); return num_squeeze(r);
|
||||
}
|
||||
case el_i16: {
|
||||
i16* xp = i16any_ptr(x);
|
||||
usz i,j; B r; i16 max=-1;
|
||||
for (i = 0; i < xia; i++) { i16 c=xp[i]; if (c<=max) break; max=c; }
|
||||
for (j = i; j < xia; j++) { i16 c=xp[j]; max=c>max?c:max; if (c<0) thrM("/⁼: Argument cannot contain negative numbers"); }
|
||||
usz ria = max+1;
|
||||
if (i==xia) {
|
||||
u64* rp; r = m_bitarrv(&rp, ria); for (usz i=0; i<BIT_N(ria); i++) rp[i]=0;
|
||||
for (usz i = 0; i < xia; i++) bitp_set(rp, xp[i], 1);
|
||||
} else {
|
||||
i32* rp; r = m_i32arrv(&rp, ria); for (usz i=0; i<ria; i++) rp[i]=0;
|
||||
for (usz i = 0; i < xia; i++) rp[xp[i]]++;
|
||||
}
|
||||
decG(x); return r;
|
||||
#define CASE_SMALL(N) \
|
||||
case el_i##N: { \
|
||||
i##N* xp = i##N##any_ptr(x); \
|
||||
usz m=1<<N; \
|
||||
B r; \
|
||||
if (xia < m/2) { \
|
||||
usz a=1; u##N max=xp[0]; \
|
||||
if (xp[0]<0) thrM("/⁼: Argument cannot contain negative numbers"); \
|
||||
if (xia < m/2) { \
|
||||
a=1; while (a<xia && xp[a]>xp[a-1]) a++; \
|
||||
max=xp[a-1]; \
|
||||
if (a==xia) { /* Sorted unique argument */ \
|
||||
usz ria = max + 1; \
|
||||
u64* rp; r = m_bitarrv(&rp, ria); \
|
||||
for (usz i=0; i<BIT_N(ria); i++) rp[i]=0; \
|
||||
for (usz i=0; i<xia; i++) bitp_set(rp, xp[i], 1); \
|
||||
decG(x); return r; \
|
||||
} \
|
||||
} \
|
||||
for (usz i=a; i<xia; i++) { u##N c=xp[i]; if (c>max) max=c; } \
|
||||
if ((i##N)max<0) thrM("/⁼: Argument cannot contain negative numbers"); \
|
||||
usz ria = max+1; \
|
||||
i##N* rp; r = m_i##N##arrv(&rp, ria); for (usz i=0; i<ria; i++) rp[i]=0; \
|
||||
for (usz i = 0; i < xia; i++) rp[xp[i]]++; \
|
||||
} else { \
|
||||
TALLOC(usz, t, m); \
|
||||
for (usz j=0; j<m/2; j++) t[j]=0; \
|
||||
for (usz i=0; i<xia; i++) t[(u##N)xp[i]]++; \
|
||||
t[m/2]=xia; usz ria=0; for (usz s=0; s<xia; ria++) s+=t[ria]; \
|
||||
if (ria>m/2) thrM("/⁼: Argument cannot contain negative numbers"); \
|
||||
i32* rp; r = m_i32arrv(&rp, ria); for (usz i=0; i<ria; i++) rp[i]=t[i]; \
|
||||
TFREE(t); \
|
||||
} \
|
||||
decG(x); return num_squeeze(r); \
|
||||
}
|
||||
CASE_SMALL(8) CASE_SMALL(16)
|
||||
#undef CASE_SMALL
|
||||
case el_i32: {
|
||||
i32* xp = i32any_ptr(x);
|
||||
usz i,j; B r; i32 max=-1;
|
||||
@ -772,7 +787,7 @@ B slash_im(B t, B x) {
|
||||
}
|
||||
decG(x); return r;
|
||||
}
|
||||
case el_bit: case el_c8: case el_c16: case el_c32: case el_B: {
|
||||
case el_c8: case el_c16: case el_c32: case el_B: {
|
||||
SLOW1("/⁼", x);
|
||||
B* xp = arr_bptr(x);
|
||||
if (xp==NULL) { HArr* xa=cpyHArr(x); x=taga(xa); xp=xa->a; }
|
||||
|
||||
@ -468,10 +468,8 @@ B rand_subset_c2(B t, B w, B x) {
|
||||
if (RARE(wi<0)) thrM("(rand).Subset: 𝕨 cannot be negative");
|
||||
if (RARE(xi<0)) thrM("(rand).Subset: 𝕩 cannot be negative");
|
||||
if (RARE(wi>xi)) thrM("(rand).Subset: 𝕨 cannot exceed 𝕩");
|
||||
if (wi==xi) {
|
||||
if (wi==0) return emptyIVec();
|
||||
return ud_c1(t, x); // Only one complete subset; will hang without this
|
||||
}
|
||||
if (wi==0) return emptyIVec();
|
||||
if (wi==xi) return ud_c1(t, x); // Only one complete subset; will hang without this
|
||||
|
||||
B r;
|
||||
RAND_START;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user