summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-31 22:09:17 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-31 22:09:17 +0000
commit2b73fb1cd84b449d9549a49afe6e100d0442e725 (patch)
tree983ebddd547d06b2049206fa233dab05875819ee
parente5839bb98ee4e011c43d01d0204f8c513dcd3c2e (diff)
Implement windowed reduce
-rw-r--r--hybrids.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/hybrids.c b/hybrids.c
index 8042e5d..e7f7f4b 100644
--- a/hybrids.c
+++ b/hybrids.c
@@ -166,9 +166,6 @@ fnExpandFirst(Array *left, Array *right)
Array *
opReduceLast(Datum *lefto, Array *left, Array *right)
{
- if(left)
- throwerror(L"left argument to f/", ENotImplemented);
-
right = fnTranspose(right);
Array *tmp = opReduceFirst(lefto, left, right);
Array *res = fnTranspose(tmp);
@@ -194,8 +191,21 @@ opScanLast(Datum *lefto, Array *left, Array *right)
Array *
opReduceFirst(Datum *lefto, Array *left, Array *right)
{
- if(left)
- throwerror(L"left argument to f⌿", ENotImplemented);
+ if(left){
+ if(left->type != AtypeInt)
+ throwerror(nil, EType);
+ if(left->size != 1)
+ throwerror(nil, ELength);
+ vlong winsize = left->intdata[0];
+ if(winsize > right->shape[0])
+ throwerror(nil, EShape);
+
+ Rune *code = L"n←(-|⍺)+1+≢⍵ ⋄"
+ L"ix←(⍳|⍺)∘+¨(⍳n)-⎕io ⋄"
+ L"ix←⍺{⍺<0:⌽¨⍵ ⋄ ⍵}ix ⋄"
+ L"↑⍵∘(⍶{⍶⌿(⊂⍵)⌷⍺})¨ix";
+ return rundfn(code, lefto, nil, left, right);
+ }
if(right->rank == 0)
return fnSame(right);