diff options
Diffstat (limited to 'operators.c')
-rw-r--r-- | operators.c | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/operators.c b/operators.c index 336588a..73d5ec2 100644 --- a/operators.c +++ b/operators.c @@ -50,10 +50,10 @@ opEach(Datum *lefto, Array *left, Array *right) rightarr = fnSame(right); } - Array *result = allocarray(AtypeArray, rightarr->rank, rightarr->size); - for(i = 0; i < rightarr->rank; i++) + Array *result = allocarray(AtypeArray, GetRank(rightarr), GetSize(rightarr)); + for(i = 0; i < GetRank(rightarr); i++) result->shape[i] = rightarr->shape[i]; - for(i = 0; i < rightarr->size; i++){ + for(i = 0; i < GetSize(rightarr); i++){ Array *elem1 = leftarr ? arrayitem(leftarr, i) : nil; Array *elem2 = arrayitem(rightarr, i); result->arraydata[i] = runfunc(lefto->func, elem1, elem2); @@ -109,24 +109,24 @@ opOuterProduct(Datum *lefto, Array *left, Array *right) throwerror(nil, EType); int i; - int rank = left->rank + right->rank; + int rank = GetRank(left) + GetRank(right); int size = 1; int *shape = emalloc(sizeof(int) * rank); - for(i = 0; i < left->rank; i++){ + for(i = 0; i < GetRank(left); i++){ shape[i] = left->shape[i]; size *= left->shape[i]; } - for(i = 0; i < right->rank; i++){ - shape[i+left->rank] = right->shape[i]; + for(i = 0; i < GetRank(right); i++){ + shape[i+GetRank(left)] = right->shape[i]; size *= right->shape[i]; } Array *result = allocarray(AtypeArray, rank, size); for(i = 0; i < rank; i++) result->shape[i] = shape[i]; - for(int leftindex = 0; leftindex < left->size; leftindex++){ - for(int rightindex = 0; rightindex < right->size; rightindex++){ - i = leftindex * right->size + rightindex; + for(int leftindex = 0; leftindex < GetSize(left); leftindex++){ + for(int rightindex = 0; rightindex < GetSize(right); rightindex++){ + i = leftindex * GetSize(right) + rightindex; Array *leftitem = arrayitem(left, leftindex); Array *rightitem = arrayitem(right, rightindex); result->arraydata[i] = runfunc(lefto->func, leftitem, rightitem); @@ -155,9 +155,9 @@ opReceive(Datum *lefto, Array *left, Array *right) { if(lefto->tag != FunctionTag) throwerror(nil, EType); - if(right->type != AtypeInt) + if(GetType(right) != AtypeInt) throwerror(nil, EType); - if(right->size != 1) + if(GetSize(right) != 1) throwerror(nil, ELength); USED(left); return messagerecv(lefto->func, right->intdata[0]); @@ -176,7 +176,7 @@ opPower(Datum *lefto, Datum *righto, Array *left, Array *right) else code = L"next←⍶⍵ ⋄ next⍹⍵:⍵ ⋄ ∇next"; }else if(righto->tag == ArrayTag){ - if(righto->array->type != AtypeInt || righto->array->rank != 0 || righto->array->size != 1) + if(GetType(righto->array) != AtypeInt || GetRank(righto->array) != 0 || GetSize(righto->array) != 1) throwerror(L"right operand to ⍣", EDomain); vlong times = righto->array->intdata[0]; if(times < 0){ @@ -206,7 +206,7 @@ opInnerProduct(Datum *lefto, Datum *righto, Array *left, Array *right) if(lefto->tag != FunctionTag || righto->tag != FunctionTag) throwerror(nil, EType); - if(left->rank > 0 && right->rank > 0 && left->shape[left->rank-1] != right->shape[0]) + if(GetRank(left) > 0 && GetRank(right) > 0 && left->shape[GetRank(left)-1] != right->shape[0]) throwerror(nil, ELength); return rundfn(L"↑(↓⍺)(⍶/⍹¨)⌾⍉↓⍉⍵", lefto, righto, left, right); @@ -246,14 +246,14 @@ opAtop(Datum *lefto, Datum *righto, Array *left, Array *right) return result; }else if(lefto->tag == FunctionTag && righto->tag == ArrayTag){ Array *ranks = righto->array; - if(ranks->rank > 1) + if(GetRank(ranks) > 1) throwerror(nil, ERank); - if(ranks->type != AtypeInt) + if(GetType(ranks) != AtypeInt) throwerror(nil, EType); - if(ranks->size < 1 || ranks->size > 3) + if(GetSize(ranks) < 1 || GetSize(ranks) > 3) throwerror(nil, ELength); int p,q,r; - switch(ranks->size){ + switch(GetSize(ranks)){ case 1: p = q = r = ranks->intdata[0]; break; case 2: q = ranks->intdata[0]; @@ -270,16 +270,16 @@ opAtop(Datum *lefto, Datum *righto, Array *left, Array *right) /* "Normalize" the ranks (remove negatives, and ranks above the array's ranks */ if(left){ - q = q < 0 ? left->rank + q : q; + q = q < 0 ? GetRank(left) + q : q; q = q < 0 ? 0 : q; - q = q > left->rank ? left->rank : q; + q = q > GetRank(left) ? GetRank(left) : q; } - p = p < 0 ? right->rank + p : p; + p = p < 0 ? GetRank(right) + p : p; p = p < 0 ? 0 : p; - p = p > right->rank ? right->rank : p; - r = r < 0 ? right->rank + r : r; + p = p > GetRank(right) ? GetRank(right) : p; + r = r < 0 ? GetRank(right) + r : r; r = r < 0 ? 0 : r; - r = r > right->rank ? right->rank : r; + r = r > GetRank(right) ? GetRank(right) : r; Array *result; if(left){ @@ -293,7 +293,7 @@ opAtop(Datum *lefto, Datum *righto, Array *left, Array *right) freearray(lefts); freearray(rights); }else{ - if(right->rank == p) + if(GetRank(right) == p) result = runfunc(lefto->func, nil, right); else{ Array *cellrank = mkscalarint(p); |