diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-31 22:09:17 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-31 22:09:17 +0000 |
commit | 2b73fb1cd84b449d9549a49afe6e100d0442e725 (patch) | |
tree | 983ebddd547d06b2049206fa233dab05875819ee | |
parent | e5839bb98ee4e011c43d01d0204f8c513dcd3c2e (diff) |
Implement windowed reduce
-rw-r--r-- | hybrids.c | 20 |
1 files changed, 15 insertions, 5 deletions
@@ -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); |