diff options
Diffstat (limited to 'hybrids.c')
-rw-r--r-- | hybrids.c | 89 |
1 files changed, 43 insertions, 46 deletions
@@ -36,44 +36,44 @@ fnExpandLast(Array *left, Array *right) Array * fnReplicateFirst(Array *left, Array *right) { - if(left->type != AtypeInt) + if(GetType(left) != AtypeInt) throwerror(nil, EType); - if(left->rank > 1) + if(GetRank(left) > 1) throwerror(nil, ERank); /* Reshape right if scalar */ - if(right->size == 1){ - Array *shape = right->rank == 0 ? mkscalarint(1) : fnShape(right); - shape->intdata[0] = left->size; + if(GetSize(right) == 1){ + Array *shape = GetRank(right) == 0 ? mkscalarint(1) : fnShape(right); + shape->intdata[0] = GetSize(left); right = fnReshape(shape, right); freearray(shape); }else right = fnSame(right); int nsize = right->shape[0]; - int cellsize = nsize == 0 ? 1 : right->size / nsize; + int cellsize = nsize == 0 ? 1 : GetSize(right) / nsize; int i; - if(left->size == 1){ + if(GetSize(left) == 1){ Array *shape = mkscalarint(nsize); left = fnReshape(shape, left); }else left = fnSame(left); - if(left->size != nsize){ + if(GetSize(left) != nsize){ freearray(left); freearray(right); throwerror(nil, ELength); } nsize = 0; - for(i = 0; i < left->size; i++){ + for(i = 0; i < GetSize(left); i++){ vlong n = left->intdata[i]; nsize += n > 0 ? n : -n; } - Array *result = allocarray(right->type, right->rank, nsize * cellsize); + Array *result = allocarray(GetType(right), GetRank(right), nsize * cellsize); result->shape[0] = nsize; - for(i = 1; i < result->rank; i++) + for(i = 1; i < GetRank(result); i++) result->shape[i] = right->shape[i]; Array *fill = fillelement(right); @@ -85,15 +85,15 @@ fnReplicateFirst(Array *left, Array *right) if(neg){ npos = -npos; for(int j = 0; j < npos*cellsize; j++) - memcpy(result->rawdata + (to*cellsize+j)*datasizes[result->type], - fill->rawdata, datasizes[result->type]); + memcpy(result->rawdata + (to*cellsize+j)*datasizes[GetType(result)], + fill->rawdata, datasizes[GetType(result)]); }else{ for(int j = 0; j < npos; j++) - memcpy(result->rawdata + (to+j)*cellsize*datasizes[result->type], - right->rawdata + from*cellsize*datasizes[result->type], - cellsize*datasizes[result->type]); + memcpy(result->rawdata + (to+j)*cellsize*datasizes[GetType(result)], + right->rawdata + from*cellsize*datasizes[GetType(result)], + cellsize*datasizes[GetType(result)]); } - if(result->type == AtypeArray) + if(GetType(result) == AtypeArray) for(int j = 0; j < npos*cellsize; j++) incarrayref(result->arraydata[to*cellsize+j]); } @@ -106,17 +106,17 @@ fnReplicateFirst(Array *left, Array *right) Array * fnExpandFirst(Array *left, Array *right) { - if(left->type != AtypeInt) + if(GetType(left) != AtypeInt) throwerror(nil, EType); - if(left->rank > 1) + if(GetRank(left) > 1) throwerror(nil, ERank); - right = right->rank == 0 ? fnRavel(right) : fnSame(right); + right = GetRank(right) == 0 ? fnRavel(right) : fnSame(right); int npos = 0; int nsize = 0; int i; - for(i = 0; i < left->size; i++){ + for(i = 0; i < GetSize(left); i++){ if(left->intdata[i] > 0) npos++; else if(left->intdata[i] == 0) @@ -129,10 +129,10 @@ fnExpandFirst(Array *left, Array *right) if(right->shape[0] != 1 && right->shape[0] != npos) throwerror(nil, ELength); - vlong cellsize = right->shape[0] == 0 ? 1 : right->size / right->shape[0]; - Array *result = allocarray(right->type, right->rank, nsize * cellsize); + vlong cellsize = right->shape[0] == 0 ? 1 : GetSize(right) / right->shape[0]; + Array *result = allocarray(GetType(right), GetRank(right), nsize * cellsize); result->shape[0] = nsize; - for(i = 1; i < result->rank; i++) + for(i = 1; i < GetRank(result); i++) result->shape[i] = right->shape[i]; Array *fill = fillelement(right); @@ -143,15 +143,15 @@ fnExpandFirst(Array *left, Array *right) if(neg){ npos = -npos; for(int j = 0; j < npos*cellsize; j++) - memcpy(result->rawdata + (to*cellsize+j)*datasizes[result->type], - fill->rawdata, datasizes[result->type]); + memcpy(result->rawdata + (to*cellsize+j)*datasizes[GetType(result)], + fill->rawdata, datasizes[GetType(result)]); }else{ for(int j = 0; j < npos; j++) - memcpy(result->rawdata + (to+j)*cellsize*datasizes[result->type], - right->rawdata + from*cellsize*datasizes[result->type], - cellsize*datasizes[result->type]); + memcpy(result->rawdata + (to+j)*cellsize*datasizes[GetType(result)], + right->rawdata + from*cellsize*datasizes[GetType(result)], + cellsize*datasizes[GetType(result)]); } - if(result->type == AtypeArray) + if(GetType(result) == AtypeArray) for(int j = 0; j < npos*cellsize; j++) incarrayref(result->arraydata[to*cellsize+j]); if(right->shape[0] != 1 && !neg) @@ -192,9 +192,9 @@ Array * opReduceFirst(Datum *lefto, Array *left, Array *right) { if(left){ - if(left->type != AtypeInt) + if(GetType(left) != AtypeInt) throwerror(nil, EType); - if(left->size != 1) + if(GetSize(left) != 1) throwerror(nil, ELength); vlong winsize = left->intdata[0]; if(winsize > right->shape[0]) @@ -207,7 +207,7 @@ opReduceFirst(Datum *lefto, Array *left, Array *right) return rundfn(code, lefto, nil, left, right); } - if(right->rank == 0) + if(GetRank(right) == 0) return fnSame(right); int n = right->shape[0]; @@ -215,20 +215,20 @@ opReduceFirst(Datum *lefto, Array *left, Array *right) if(n == 0) throwerror(L"Can't figure out identity element", ENotImplemented); - Array *result = allocarray(AtypeArray, right->rank - 1, right->size / n); - for(int i = 0; i < right->rank-1; i++) + Array *result = allocarray(AtypeArray, GetRank(right) - 1, GetSize(right) / n); + for(int i = 0; i < GetRank(right)-1; i++) result->shape[i] = right->shape[i+1]; - Array *index = allocarray(AtypeArray, 1, right->rank); - index->shape[0] = right->rank; + Array *index = allocarray(AtypeArray, 1, GetRank(right)); + index->shape[0] = GetRank(right); Array *tmp = mkscalarint(n); index->arraydata[0] = fnIndexGenerator(tmp); freearray(tmp); - for(int i = 1; i < index->size; i++) + for(int i = 1; i < GetSize(index); i++) index->arraydata[i] = mkscalarint(io); - for(int i = 0; i < result->size; i++){ - for(int j = index->size - 1; index->arraydata[j]->intdata[0] == io + right->shape[j]; j--){ + for(int i = 0; i < GetSize(result); i++){ + for(int j = GetSize(index) - 1; index->arraydata[j]->intdata[0] == io + right->shape[j]; j--){ index->arraydata[j]->intdata[0] = io; index->arraydata[j-1]->intdata[0]++; } @@ -242,7 +242,7 @@ opReduceFirst(Datum *lefto, Array *left, Array *right) freearray(argR); } freearray(vector); - index->arraydata[index->size-1]->intdata[0]++; + index->arraydata[GetSize(index)-1]->intdata[0]++; } freearray(index); @@ -255,12 +255,9 @@ opScanFirst(Datum *lefto, Array *left, Array *right) if(left) throwerror(L"f⍀ doesn't take a left argument", ESyntax); - Array *result = allocarray(AtypeArray, right->rank, right->size); - for(int i = 0; i < right->rank; i++) - result->shape[i] = right->shape[i]; - + Array *result = duparrayshape(right, AtypeArray); int n = result->shape[0]; - int m = result->size / n; + int m = GetSize(result) / n; for(int i = 0; i < n; i++){ Array *len = mkscalarint(i + 1); Array *index = fnIndexGenerator(len); |