From b78e32733e4bc346d9bdbd41ce342e57cb7402bf Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Wed, 1 May 2013 22:18:26 -0700 Subject: [PATCH] sequences.windowed: faster windows and rolling words. --- basis/sequences/windowed/windowed.factor | 47 +++++++++++++++++------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/basis/sequences/windowed/windowed.factor b/basis/sequences/windowed/windowed.factor index 5dd986cb19..844c65a7e8 100644 --- a/basis/sequences/windowed/windowed.factor +++ b/basis/sequences/windowed/windowed.factor @@ -1,25 +1,46 @@ ! Copyright (C) 2012 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors kernel math math.order sequences ; +USING: accessors fry kernel math math.order math.statistics +sequences sequences.private ; IN: sequences.windowed -TUPLE: windowed-sequence { sequence sequence read-only } { n integer } ; +TUPLE: windowed-sequence + { sequence sequence read-only } + { n integer } ; INSTANCE: windowed-sequence sequence C: windowed-sequence - + +M: windowed-sequence nth-unsafe + [ 1 + ] dip [ n>> dupd [-] swap ] [ sequence>> ] bi ; inline + +M: windowed-sequence length + sequence>> length ; inline + : in-bound ( n sequence -- n' ) [ drop 0 ] [ length ] bi clamp ; inline : in-bounds ( a b sequence -- a' b' sequence ) - [ nip in-bound ] - [ [ nip ] dip in-bound ] - [ 2nip ] 3tri ; - -M: windowed-sequence nth - [ [ 1 + ] dip n>> [ - ] [ drop ] 2bi ] - [ nip sequence>> in-bounds ] 2bi ; - -M: windowed-sequence length - sequence>> length ; \ No newline at end of file + [ nip in-bound ] [ [ nip ] dip in-bound ] [ 2nip ] 3tri ; + +: rolling-map ( seq n quot: ( slice -- elt ) -- newseq ) + [ ] [ map ] bi* ; inline + +: rolling-sum ( seq n -- newseq ) + [ sum ] rolling-map ; + +: rolling-mean ( seq n -- newseq ) + [ mean ] rolling-map ; + +: rolling-median ( seq n -- newseq ) + [ median ] rolling-map ; + +: rolling-supremum ( seq n -- newseq ) + [ supremum ] rolling-map ; + +: rolling-infimum ( seq n -- newseq ) + [ infimum ] rolling-map ; + +: rolling-count ( ... u n quot: ( ... elt -- ... ? ) -- ... v ) + '[ _ count ] rolling-map ; inline