summaryrefslogtreecommitdiff
path: root/hybrids.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2022-02-09 17:06:41 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2022-02-09 17:06:41 +0000
commit36e45dfccb5e5321682c0ec24dead22cf40fcb16 (patch)
tree5b51a2f46d50c4ae2ae93e94bf337ca9af2f4348 /hybrids.c
parente195d66a333102924bae452ba09dc20cba4e96e6 (diff)
Make the array type a tiny bit smaller, by packing control information into a bit array
Diffstat (limited to 'hybrids.c')
-rw-r--r--hybrids.c89
1 files changed, 43 insertions, 46 deletions
diff --git a/hybrids.c b/hybrids.c
index 18bab50..2a6b9b5 100644
--- a/hybrids.c
+++ b/hybrids.c
@@ -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);