{-# LANGUAGE ScopedTypeVariables #-}
module Streamly.Statistics.Scanl
(
incrMinimum
, incrMaximum
, incrRawMoment
, incrRawMomentFrac
, incrWelfordMean
, incrGeometricMean
, incrHarmonicMean
, incrQuadraticMean
, incrPowerMean
, incrPowerMeanFrac
, ewma
, ewmaRampUpSmoothing
, incrEwma
, incrRange
, incrMd
, incrVariance
, incrStdDev
, incrSkewness
, incrKurtosis
, incrSampleVariance
, incrSampleStdDev
, incrStdErrMean
, incrFrequency
)
where
import Control.Exception (assert)
import Control.Monad (when)
import Control.Monad.IO.Class (MonadIO(..))
import Data.Function ((&))
import Data.Map.Strict (Map)
import Data.Maybe (fromMaybe)
import Streamly.Internal.Data.Fold (Step(..))
import Streamly.Internal.Data.Scanl (Scanl(..), Incr(..))
import Streamly.Internal.Data.Tuple.Strict (Tuple'(..), Tuple3'(..))
import qualified Data.Map.Strict as Map
import qualified Deque.Strict as Deque
import qualified Streamly.Data.Fold as Fold
import qualified Streamly.Internal.Data.RingArray as Ring
import qualified Streamly.Internal.Data.Scanl as Scanl
import qualified Streamly.Data.Stream as Stream
import Prelude hiding (length, sum, minimum, maximum)
{-# INLINE incrMinimum #-}
incrMinimum :: (Monad m, Ord a) => Scanl m (Incr a) a
incrMinimum :: forall (m :: * -> *) a. (Monad m, Ord a) => Scanl m (Incr a) a
incrMinimum = (Tuple3' Int Int (Deque (Int, a))
-> Incr a -> m (Step (Tuple3' Int Int (Deque (Int, a))) a))
-> m (Step (Tuple3' Int Int (Deque (Int, a))) a)
-> (Tuple3' Int Int (Deque (Int, a)) -> m a)
-> (Tuple3' Int Int (Deque (Int, a)) -> m a)
-> Scanl m (Incr a) a
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl Tuple3' Int Int (Deque (Int, a))
-> Incr a -> m (Step (Tuple3' Int Int (Deque (Int, a))) a)
forall {m :: * -> *} {a} {b} {b}.
(Monad m, Num a, Ord a, Ord b) =>
Tuple3' a a (Deque (a, b))
-> Incr b -> m (Step (Tuple3' a a (Deque (a, b))) b)
step m (Step (Tuple3' Int Int (Deque (Int, a))) a)
forall {a} {b}. m (Step (Tuple3' Int Int (Deque (Int, a))) b)
initial Tuple3' Int Int (Deque (Int, a)) -> m a
forall {m :: * -> *} {a} {a} {b} {a}.
(Monad m, Num a) =>
Tuple3' a b (Deque (a, a)) -> m a
extract Tuple3' Int Int (Deque (Int, a)) -> m a
forall {m :: * -> *} {a} {a} {b} {a}.
(Monad m, Num a) =>
Tuple3' a b (Deque (a, a)) -> m a
extract
where
initial :: m (Step (Tuple3' Int Int (Deque (Int, a))) b)
initial =
Step (Tuple3' Int Int (Deque (Int, a))) b
-> m (Step (Tuple3' Int Int (Deque (Int, a))) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (Tuple3' Int Int (Deque (Int, a))) b
-> m (Step (Tuple3' Int Int (Deque (Int, a))) b))
-> Step (Tuple3' Int Int (Deque (Int, a))) b
-> m (Step (Tuple3' Int Int (Deque (Int, a))) b)
forall a b. (a -> b) -> a -> b
$ Tuple3' Int Int (Deque (Int, a))
-> Step (Tuple3' Int Int (Deque (Int, a))) b
forall s b. s -> Step s b
Partial
(Tuple3' Int Int (Deque (Int, a))
-> Step (Tuple3' Int Int (Deque (Int, a))) b)
-> Tuple3' Int Int (Deque (Int, a))
-> Step (Tuple3' Int Int (Deque (Int, a))) b
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Deque (Int, a) -> Tuple3' Int Int (Deque (Int, a))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' (Int
0 :: Int) (Int
0 :: Int) (Deque (Int, a)
forall {a}. Deque (Int, a)
forall a. Monoid a => a
mempty :: Deque.Deque (Int, a))
step :: Tuple3' a a (Deque (a, b))
-> Incr b -> m (Step (Tuple3' a a (Deque (a, b))) b)
step (Tuple3' a
i a
w Deque (a, b)
q) (Insert b
a) =
Step (Tuple3' a a (Deque (a, b))) b
-> m (Step (Tuple3' a a (Deque (a, b))) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (Tuple3' a a (Deque (a, b))) b
-> m (Step (Tuple3' a a (Deque (a, b))) b))
-> Step (Tuple3' a a (Deque (a, b))) b
-> m (Step (Tuple3' a a (Deque (a, b))) b)
forall a b. (a -> b) -> a -> b
$ Tuple3' a a (Deque (a, b)) -> Step (Tuple3' a a (Deque (a, b))) b
forall s b. s -> Step s b
Partial
(Tuple3' a a (Deque (a, b)) -> Step (Tuple3' a a (Deque (a, b))) b)
-> Tuple3' a a (Deque (a, b))
-> Step (Tuple3' a a (Deque (a, b))) b
forall a b. (a -> b) -> a -> b
$ a -> a -> Deque (a, b) -> Tuple3' a a (Deque (a, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3'
(a
i a -> a -> a
forall a. Num a => a -> a -> a
+ a
1)
(a
w a -> a -> a
forall a. Num a => a -> a -> a
+ a
1)
(a -> Deque (a, b) -> a -> Deque (a, b)
forall {a} {b}.
(Ord a, Num a) =>
a -> Deque (a, b) -> a -> Deque (a, b)
headCheck a
i Deque (a, b)
q (a
w a -> a -> a
forall a. Num a => a -> a -> a
+ a
1) Deque (a, b) -> (Deque (a, b) -> Deque (a, b)) -> Deque (a, b)
forall a b. a -> (a -> b) -> b
& (a, b) -> Deque (a, b) -> Deque (a, b)
forall {a} {a}. Ord a => (a, a) -> Deque (a, a) -> Deque (a, a)
dqloop (a
i, b
a))
step (Tuple3' a
i a
w Deque (a, b)
q) (Replace b
_ b
new) =
Step (Tuple3' a a (Deque (a, b))) b
-> m (Step (Tuple3' a a (Deque (a, b))) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (Tuple3' a a (Deque (a, b))) b
-> m (Step (Tuple3' a a (Deque (a, b))) b))
-> Step (Tuple3' a a (Deque (a, b))) b
-> m (Step (Tuple3' a a (Deque (a, b))) b)
forall a b. (a -> b) -> a -> b
$ Tuple3' a a (Deque (a, b)) -> Step (Tuple3' a a (Deque (a, b))) b
forall s b. s -> Step s b
Partial
(Tuple3' a a (Deque (a, b)) -> Step (Tuple3' a a (Deque (a, b))) b)
-> Tuple3' a a (Deque (a, b))
-> Step (Tuple3' a a (Deque (a, b))) b
forall a b. (a -> b) -> a -> b
$ a -> a -> Deque (a, b) -> Tuple3' a a (Deque (a, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' (a
i a -> a -> a
forall a. Num a => a -> a -> a
+ a
1) a
w (a -> Deque (a, b) -> a -> Deque (a, b)
forall {a} {b}.
(Ord a, Num a) =>
a -> Deque (a, b) -> a -> Deque (a, b)
headCheck a
i Deque (a, b)
q a
w Deque (a, b) -> (Deque (a, b) -> Deque (a, b)) -> Deque (a, b)
forall a b. a -> (a -> b) -> b
& (a, b) -> Deque (a, b) -> Deque (a, b)
forall {a} {a}. Ord a => (a, a) -> Deque (a, a) -> Deque (a, a)
dqloop (a
i, b
new))
{-# INLINE headCheck #-}
headCheck :: a -> Deque (a, b) -> a -> Deque (a, b)
headCheck a
i Deque (a, b)
q a
w =
case Deque (a, b) -> Maybe ((a, b), Deque (a, b))
forall a. Deque a -> Maybe (a, Deque a)
Deque.uncons Deque (a, b)
q of
Maybe ((a, b), Deque (a, b))
Nothing -> Deque (a, b)
q
Just ((a, b)
ia', Deque (a, b)
q') ->
if (a, b) -> a
forall a b. (a, b) -> a
fst (a, b)
ia' a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
i a -> a -> a
forall a. Num a => a -> a -> a
- a
w
then Deque (a, b)
q'
else Deque (a, b)
q
dqloop :: (a, a) -> Deque (a, a) -> Deque (a, a)
dqloop (a, a)
ia Deque (a, a)
q =
case Deque (a, a) -> Maybe ((a, a), Deque (a, a))
forall a. Deque a -> Maybe (a, Deque a)
Deque.unsnoc Deque (a, a)
q of
Maybe ((a, a), Deque (a, a))
Nothing -> (a, a) -> Deque (a, a) -> Deque (a, a)
forall a. a -> Deque a -> Deque a
Deque.snoc (a, a)
ia Deque (a, a)
q
Just ((a, a)
ia', Deque (a, a)
q') ->
if (a, a) -> a
forall a b. (a, b) -> b
snd (a, a)
ia a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= (a, a) -> a
forall a b. (a, b) -> b
snd (a, a)
ia'
then (a, a) -> Deque (a, a) -> Deque (a, a)
dqloop (a, a)
ia Deque (a, a)
q'
else (a, a) -> Deque (a, a) -> Deque (a, a)
forall a. a -> Deque a -> Deque a
Deque.snoc (a, a)
ia Deque (a, a)
q
extract :: Tuple3' a b (Deque (a, a)) -> m a
extract (Tuple3' a
_ b
_ Deque (a, a)
q) =
a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(a -> m a) -> a -> m a
forall a b. (a -> b) -> a -> b
$ (a, a) -> a
forall a b. (a, b) -> b
snd
((a, a) -> a) -> (a, a) -> a
forall a b. (a -> b) -> a -> b
$ (a, a) -> Maybe (a, a) -> (a, a)
forall a. a -> Maybe a -> a
fromMaybe (a
0, [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"minimum: Empty stream")
(Maybe (a, a) -> (a, a)) -> Maybe (a, a) -> (a, a)
forall a b. (a -> b) -> a -> b
$ Deque (a, a) -> Maybe (a, a)
forall a. Deque a -> Maybe a
Deque.head Deque (a, a)
q
{-# INLINE incrMaximum #-}
incrMaximum :: (Monad m, Ord a) => Scanl m (Incr a) a
incrMaximum :: forall (m :: * -> *) a. (Monad m, Ord a) => Scanl m (Incr a) a
incrMaximum = (Tuple3' Int Int (Deque (Int, a))
-> Incr a -> m (Step (Tuple3' Int Int (Deque (Int, a))) a))
-> m (Step (Tuple3' Int Int (Deque (Int, a))) a)
-> (Tuple3' Int Int (Deque (Int, a)) -> m a)
-> (Tuple3' Int Int (Deque (Int, a)) -> m a)
-> Scanl m (Incr a) a
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl Tuple3' Int Int (Deque (Int, a))
-> Incr a -> m (Step (Tuple3' Int Int (Deque (Int, a))) a)
forall {m :: * -> *} {a} {b} {b}.
(Monad m, Num a, Ord a, Ord b) =>
Tuple3' a a (Deque (a, b))
-> Incr b -> m (Step (Tuple3' a a (Deque (a, b))) b)
step m (Step (Tuple3' Int Int (Deque (Int, a))) a)
forall {a} {b}. m (Step (Tuple3' Int Int (Deque (Int, a))) b)
initial Tuple3' Int Int (Deque (Int, a)) -> m a
forall {m :: * -> *} {a} {a} {b} {a}.
(Monad m, Num a) =>
Tuple3' a b (Deque (a, a)) -> m a
extract Tuple3' Int Int (Deque (Int, a)) -> m a
forall {m :: * -> *} {a} {a} {b} {a}.
(Monad m, Num a) =>
Tuple3' a b (Deque (a, a)) -> m a
extract
where
initial :: m (Step (Tuple3' Int Int (Deque (Int, a))) b)
initial =
Step (Tuple3' Int Int (Deque (Int, a))) b
-> m (Step (Tuple3' Int Int (Deque (Int, a))) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (Tuple3' Int Int (Deque (Int, a))) b
-> m (Step (Tuple3' Int Int (Deque (Int, a))) b))
-> Step (Tuple3' Int Int (Deque (Int, a))) b
-> m (Step (Tuple3' Int Int (Deque (Int, a))) b)
forall a b. (a -> b) -> a -> b
$ Tuple3' Int Int (Deque (Int, a))
-> Step (Tuple3' Int Int (Deque (Int, a))) b
forall s b. s -> Step s b
Partial
(Tuple3' Int Int (Deque (Int, a))
-> Step (Tuple3' Int Int (Deque (Int, a))) b)
-> Tuple3' Int Int (Deque (Int, a))
-> Step (Tuple3' Int Int (Deque (Int, a))) b
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Deque (Int, a) -> Tuple3' Int Int (Deque (Int, a))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' (Int
0 :: Int) (Int
0 :: Int) (Deque (Int, a)
forall {a}. Deque (Int, a)
forall a. Monoid a => a
mempty :: Deque.Deque (Int, a))
step :: Tuple3' a a (Deque (a, b))
-> Incr b -> m (Step (Tuple3' a a (Deque (a, b))) b)
step (Tuple3' a
i a
w Deque (a, b)
q) (Insert b
a) =
Step (Tuple3' a a (Deque (a, b))) b
-> m (Step (Tuple3' a a (Deque (a, b))) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (Tuple3' a a (Deque (a, b))) b
-> m (Step (Tuple3' a a (Deque (a, b))) b))
-> Step (Tuple3' a a (Deque (a, b))) b
-> m (Step (Tuple3' a a (Deque (a, b))) b)
forall a b. (a -> b) -> a -> b
$ Tuple3' a a (Deque (a, b)) -> Step (Tuple3' a a (Deque (a, b))) b
forall s b. s -> Step s b
Partial
(Tuple3' a a (Deque (a, b)) -> Step (Tuple3' a a (Deque (a, b))) b)
-> Tuple3' a a (Deque (a, b))
-> Step (Tuple3' a a (Deque (a, b))) b
forall a b. (a -> b) -> a -> b
$ a -> a -> Deque (a, b) -> Tuple3' a a (Deque (a, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3'
(a
i a -> a -> a
forall a. Num a => a -> a -> a
+ a
1)
(a
w a -> a -> a
forall a. Num a => a -> a -> a
+ a
1)
(a -> Deque (a, b) -> a -> Deque (a, b)
forall {a} {b}.
(Ord a, Num a) =>
a -> Deque (a, b) -> a -> Deque (a, b)
headCheck a
i Deque (a, b)
q (a
w a -> a -> a
forall a. Num a => a -> a -> a
+ a
1) Deque (a, b) -> (Deque (a, b) -> Deque (a, b)) -> Deque (a, b)
forall a b. a -> (a -> b) -> b
& (a, b) -> Deque (a, b) -> Deque (a, b)
forall {a} {a}. Ord a => (a, a) -> Deque (a, a) -> Deque (a, a)
dqloop (a
i, b
a))
step (Tuple3' a
i a
w Deque (a, b)
q) (Replace b
_ b
new) =
Step (Tuple3' a a (Deque (a, b))) b
-> m (Step (Tuple3' a a (Deque (a, b))) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (Tuple3' a a (Deque (a, b))) b
-> m (Step (Tuple3' a a (Deque (a, b))) b))
-> Step (Tuple3' a a (Deque (a, b))) b
-> m (Step (Tuple3' a a (Deque (a, b))) b)
forall a b. (a -> b) -> a -> b
$ Tuple3' a a (Deque (a, b)) -> Step (Tuple3' a a (Deque (a, b))) b
forall s b. s -> Step s b
Partial
(Tuple3' a a (Deque (a, b)) -> Step (Tuple3' a a (Deque (a, b))) b)
-> Tuple3' a a (Deque (a, b))
-> Step (Tuple3' a a (Deque (a, b))) b
forall a b. (a -> b) -> a -> b
$ a -> a -> Deque (a, b) -> Tuple3' a a (Deque (a, b))
forall a b c. a -> b -> c -> Tuple3' a b c
Tuple3' (a
i a -> a -> a
forall a. Num a => a -> a -> a
+ a
1) a
w (a -> Deque (a, b) -> a -> Deque (a, b)
forall {a} {b}.
(Ord a, Num a) =>
a -> Deque (a, b) -> a -> Deque (a, b)
headCheck a
i Deque (a, b)
q a
w Deque (a, b) -> (Deque (a, b) -> Deque (a, b)) -> Deque (a, b)
forall a b. a -> (a -> b) -> b
& (a, b) -> Deque (a, b) -> Deque (a, b)
forall {a} {a}. Ord a => (a, a) -> Deque (a, a) -> Deque (a, a)
dqloop (a
i, b
new))
{-# INLINE headCheck #-}
headCheck :: a -> Deque (a, b) -> a -> Deque (a, b)
headCheck a
i Deque (a, b)
q a
w =
case Deque (a, b) -> Maybe ((a, b), Deque (a, b))
forall a. Deque a -> Maybe (a, Deque a)
Deque.uncons Deque (a, b)
q of
Maybe ((a, b), Deque (a, b))
Nothing -> Deque (a, b)
q
Just ((a, b)
ia', Deque (a, b)
q') ->
if (a, b) -> a
forall a b. (a, b) -> a
fst (a, b)
ia' a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
i a -> a -> a
forall a. Num a => a -> a -> a
- a
w
then Deque (a, b)
q'
else Deque (a, b)
q
dqloop :: (a, a) -> Deque (a, a) -> Deque (a, a)
dqloop (a, a)
ia Deque (a, a)
q =
case Deque (a, a) -> Maybe ((a, a), Deque (a, a))
forall a. Deque a -> Maybe (a, Deque a)
Deque.unsnoc Deque (a, a)
q of
Maybe ((a, a), Deque (a, a))
Nothing -> (a, a) -> Deque (a, a) -> Deque (a, a)
forall a. a -> Deque a -> Deque a
Deque.snoc (a, a)
ia Deque (a, a)
q
Just ((a, a)
ia', Deque (a, a)
q') ->
if (a, a) -> a
forall a b. (a, b) -> b
snd (a, a)
ia a -> a -> Bool
forall a. Ord a => a -> a -> Bool
>= (a, a) -> a
forall a b. (a, b) -> b
snd (a, a)
ia'
then (a, a) -> Deque (a, a) -> Deque (a, a)
dqloop (a, a)
ia Deque (a, a)
q'
else (a, a) -> Deque (a, a) -> Deque (a, a)
forall a. a -> Deque a -> Deque a
Deque.snoc (a, a)
ia Deque (a, a)
q
extract :: Tuple3' a b (Deque (a, a)) -> m a
extract (Tuple3' a
_ b
_ Deque (a, a)
q) =
a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(a -> m a) -> a -> m a
forall a b. (a -> b) -> a -> b
$ (a, a) -> a
forall a b. (a, b) -> b
snd
((a, a) -> a) -> (a, a) -> a
forall a b. (a -> b) -> a -> b
$ (a, a) -> Maybe (a, a) -> (a, a)
forall a. a -> Maybe a -> a
fromMaybe (a
0, [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"maximum: Empty stream")
(Maybe (a, a) -> (a, a)) -> Maybe (a, a) -> (a, a)
forall a b. (a -> b) -> a -> b
$ Deque (a, a) -> Maybe (a, a)
forall a. Deque a -> Maybe a
Deque.head Deque (a, a)
q
{-# INLINE meanAdd #-}
meanAdd :: Fractional a => Int -> a -> a -> a
meanAdd :: forall a. Fractional a => Int -> a -> a -> a
meanAdd Int
n a
oldMean a
newItem =
let delta :: a
delta = (a
newItem a -> a -> a
forall a. Num a => a -> a -> a
- a
oldMean) a -> a -> a
forall a. Fractional a => a -> a -> a
/ Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
in a
oldMean a -> a -> a
forall a. Num a => a -> a -> a
+ a
delta
{-# INLINE meanReplace #-}
meanReplace :: Fractional a => Int -> a -> a -> a -> a
meanReplace :: forall a. Fractional a => Int -> a -> a -> a -> a
meanReplace Int
n a
oldMean a
oldItem a
newItem =
let n1 :: a
n1 = Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n
delta1 :: a
delta1 = (a
newItem a -> a -> a
forall a. Num a => a -> a -> a
- a
oldMean) a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
n1
delta2 :: a
delta2 = (a
oldItem a -> a -> a
forall a. Num a => a -> a -> a
- a
oldMean) a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
n1
in (a
oldMean a -> a -> a
forall a. Num a => a -> a -> a
+ a
delta1) a -> a -> a
forall a. Num a => a -> a -> a
- a
delta2
{-# INLINE incrWelfordMean #-}
incrWelfordMean :: forall m a. (Monad m, Fractional a) => Scanl m (Incr a) a
incrWelfordMean :: forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Scanl m (Incr a) a
incrWelfordMean = (Tuple' a Int -> Incr a -> m (Step (Tuple' a Int) a))
-> m (Step (Tuple' a Int) a)
-> (Tuple' a Int -> m a)
-> (Tuple' a Int -> m a)
-> Scanl m (Incr a) a
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl Tuple' a Int -> Incr a -> m (Step (Tuple' a Int) a)
forall {m :: * -> *} {a} {b}.
(Monad m, Fractional a) =>
Tuple' a Int -> Incr a -> m (Step (Tuple' a Int) b)
step m (Step (Tuple' a Int) a)
forall {b}. m (Step (Tuple' a Int) b)
initial Tuple' a Int -> m a
forall {m :: * -> *} {a} {b}. Monad m => Tuple' a b -> m a
extract Tuple' a Int -> m a
forall {m :: * -> *} {a} {b}. Monad m => Tuple' a b -> m a
extract
where
initial :: m (Step (Tuple' a Int) b)
initial =
Step (Tuple' a Int) b -> m (Step (Tuple' a Int) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (Tuple' a Int) b -> m (Step (Tuple' a Int) b))
-> Step (Tuple' a Int) b -> m (Step (Tuple' a Int) b)
forall a b. (a -> b) -> a -> b
$ Tuple' a Int -> Step (Tuple' a Int) b
forall s b. s -> Step s b
Partial
(Tuple' a Int -> Step (Tuple' a Int) b)
-> Tuple' a Int -> Step (Tuple' a Int) b
forall a b. (a -> b) -> a -> b
$ a -> Int -> Tuple' a Int
forall a b. a -> b -> Tuple' a b
Tuple'
(a
0 :: a)
(Int
0 :: Int)
step :: Tuple' a Int -> Incr a -> m (Step (Tuple' a Int) b)
step (Tuple' a
oldMean Int
w) (Insert a
new) =
Step (Tuple' a Int) b -> m (Step (Tuple' a Int) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Tuple' a Int) b -> m (Step (Tuple' a Int) b))
-> Step (Tuple' a Int) b -> m (Step (Tuple' a Int) b)
forall a b. (a -> b) -> a -> b
$ Tuple' a Int -> Step (Tuple' a Int) b
forall s b. s -> Step s b
Partial (Tuple' a Int -> Step (Tuple' a Int) b)
-> Tuple' a Int -> Step (Tuple' a Int) b
forall a b. (a -> b) -> a -> b
$ a -> Int -> Tuple' a Int
forall a b. a -> b -> Tuple' a b
Tuple' (Int -> a -> a -> a
forall a. Fractional a => Int -> a -> a -> a
meanAdd Int
w a
oldMean a
new) (Int
w Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
step (Tuple' a
oldMean Int
w) (Replace a
old a
new) =
Step (Tuple' a Int) b -> m (Step (Tuple' a Int) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Tuple' a Int) b -> m (Step (Tuple' a Int) b))
-> Step (Tuple' a Int) b -> m (Step (Tuple' a Int) b)
forall a b. (a -> b) -> a -> b
$ Tuple' a Int -> Step (Tuple' a Int) b
forall s b. s -> Step s b
Partial (Tuple' a Int -> Step (Tuple' a Int) b)
-> Tuple' a Int -> Step (Tuple' a Int) b
forall a b. (a -> b) -> a -> b
$ a -> Int -> Tuple' a Int
forall a b. a -> b -> Tuple' a b
Tuple' (Int -> a -> a -> a -> a
forall a. Fractional a => Int -> a -> a -> a -> a
meanReplace Int
w a
oldMean a
old a
new) Int
w
extract :: Tuple' a b -> m a
extract (Tuple' a
x b
_) = a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
{-# INLINE incrRawMoment #-}
incrRawMoment :: (Monad m, Fractional a) => Int -> Scanl m (Incr a) a
incrRawMoment :: forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Int -> Scanl m (Incr a) a
incrRawMoment Int
k =
(a -> a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall (m :: * -> *) b c d a.
Monad m =>
(b -> c -> d) -> Scanl m a b -> Scanl m a c -> Scanl m a d
Scanl.teeWith a -> a -> a
forall a. Fractional a => a -> a -> a
(/) (Int -> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Num a) =>
Int -> Scanl m (Incr a) a
Scanl.incrPowerSum Int
k) Scanl m (Incr a) a
forall (m :: * -> *) b a. (Monad m, Num b) => Scanl m (Incr a) b
Scanl.incrCount
{-# INLINE incrRawMomentFrac #-}
incrRawMomentFrac :: (Monad m, Floating a) => a -> Scanl m (Incr a) a
incrRawMomentFrac :: forall (m :: * -> *) a.
(Monad m, Floating a) =>
a -> Scanl m (Incr a) a
incrRawMomentFrac a
k =
(a -> a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall (m :: * -> *) b c d a.
Monad m =>
(b -> c -> d) -> Scanl m a b -> Scanl m a c -> Scanl m a d
Scanl.teeWith a -> a -> a
forall a. Fractional a => a -> a -> a
(/) (a -> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Floating a) =>
a -> Scanl m (Incr a) a
Scanl.incrPowerSumFrac a
k) Scanl m (Incr a) a
forall (m :: * -> *) b a. (Monad m, Num b) => Scanl m (Incr a) b
Scanl.incrCount
{-# INLINE incrPowerMean #-}
incrPowerMean :: (Monad m, Floating a) => Int -> Scanl m (Incr a) a
incrPowerMean :: forall (m :: * -> *) a.
(Monad m, Floating a) =>
Int -> Scanl m (Incr a) a
incrPowerMean Int
k = (a -> a -> a
forall a. Floating a => a -> a -> a
** (a
1 a -> a -> a
forall a. Fractional a => a -> a -> a
/ Int -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
k)) (a -> a) -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Int -> Scanl m (Incr a) a
incrRawMoment Int
k
{-# INLINE incrPowerMeanFrac #-}
incrPowerMeanFrac :: (Monad m, Floating a) => a -> Scanl m (Incr a) a
incrPowerMeanFrac :: forall (m :: * -> *) a.
(Monad m, Floating a) =>
a -> Scanl m (Incr a) a
incrPowerMeanFrac a
k = (a -> a -> a
forall a. Floating a => a -> a -> a
** (a
1 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
k)) (a -> a) -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Floating a) =>
a -> Scanl m (Incr a) a
incrRawMomentFrac a
k
{-# INLINE incrHarmonicMean #-}
incrHarmonicMean :: (Monad m, Fractional a) => Scanl m (Incr a) a
incrHarmonicMean :: forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Scanl m (Incr a) a
incrHarmonicMean =
(a -> a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall (m :: * -> *) b c d a.
Monad m =>
(b -> c -> d) -> Scanl m a b -> Scanl m a c -> Scanl m a d
Scanl.teeWith a -> a -> a
forall a. Fractional a => a -> a -> a
(/)
Scanl m (Incr a) a
forall (m :: * -> *) b a. (Monad m, Num b) => Scanl m (Incr a) b
Scanl.incrCount ((Incr a -> Incr a) -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall a b (m :: * -> *) r. (a -> b) -> Scanl m b r -> Scanl m a r
Scanl.lmap ((a -> a) -> Incr a -> Incr a
forall a b. (a -> b) -> Incr a -> Incr b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Fractional a => a -> a
recip) Scanl m (Incr a) a
forall (m :: * -> *) a. (Monad m, Num a) => Scanl m (Incr a) a
Scanl.incrSum)
{-# INLINE incrGeometricMean #-}
incrGeometricMean :: (Monad m, Floating a) => Scanl m (Incr a) a
incrGeometricMean :: forall (m :: * -> *) a. (Monad m, Floating a) => Scanl m (Incr a) a
incrGeometricMean = a -> a
forall a. Floating a => a -> a
exp (a -> a) -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Incr a -> Incr a) -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall a b (m :: * -> *) r. (a -> b) -> Scanl m b r -> Scanl m a r
Scanl.lmap ((a -> a) -> Incr a -> Incr a
forall a b. (a -> b) -> Incr a -> Incr b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> a
forall a. Floating a => a -> a
log) Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Scanl m (Incr a) a
Scanl.incrMean
{-# INLINE incrQuadraticMean #-}
incrQuadraticMean :: (Monad m, Floating a) => Scanl m (Incr a) a
incrQuadraticMean :: forall (m :: * -> *) a. (Monad m, Floating a) => Scanl m (Incr a) a
incrQuadraticMean = Int -> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Floating a) =>
Int -> Scanl m (Incr a) a
incrPowerMean Int
2
{-# INLINE ewmaStep #-}
ewmaStep :: Double -> Double -> Double -> Double
ewmaStep :: Double -> Double -> Double -> Double
ewmaStep Double
k Double
x0 Double
x1 = (Double
1 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
k) Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
x0 Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
k Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
x1
{-# INLINE ewma #-}
ewma :: Monad m => Double -> Scanl m Double Double
ewma :: forall (m :: * -> *). Monad m => Double -> Scanl m Double Double
ewma Double
k = Tuple' Double Double -> Double
forall {a} {b}. Tuple' a b -> a
extract (Tuple' Double Double -> Double)
-> Scanl m Double (Tuple' Double Double) -> Scanl m Double Double
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Tuple' Double Double -> Double -> Tuple' Double Double)
-> Tuple' Double Double -> Scanl m Double (Tuple' Double Double)
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Scanl m a b
Scanl.mkScanl Tuple' Double Double -> Double -> Tuple' Double Double
step (Double -> Double -> Tuple' Double Double
forall a b. a -> b -> Tuple' a b
Tuple' Double
0 Double
1)
where
step :: Tuple' Double Double -> Double -> Tuple' Double Double
step (Tuple' Double
x0 Double
k1) Double
x = Double -> Double -> Tuple' Double Double
forall a b. a -> b -> Tuple' a b
Tuple' (Double -> Double -> Double -> Double
ewmaStep Double
k1 Double
x0 Double
x) Double
k
extract :: Tuple' a b -> a
extract (Tuple' a
x b
_) = a
x
{-# INLINE ewmaRampUpSmoothing #-}
ewmaRampUpSmoothing :: Monad m => Double -> Double -> Scanl m Double Double
ewmaRampUpSmoothing :: forall (m :: * -> *).
Monad m =>
Double -> Double -> Scanl m Double Double
ewmaRampUpSmoothing Double
n Double
k1 = Tuple' Double Double -> Double
forall {a} {b}. Tuple' a b -> a
extract (Tuple' Double Double -> Double)
-> Scanl m Double (Tuple' Double Double) -> Scanl m Double Double
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Tuple' Double Double -> Double -> Tuple' Double Double)
-> Tuple' Double Double -> Scanl m Double (Tuple' Double Double)
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Scanl m a b
Scanl.mkScanl Tuple' Double Double -> Double -> Tuple' Double Double
step Tuple' Double Double
initial
where
initial :: Tuple' Double Double
initial = Double -> Double -> Tuple' Double Double
forall a b. a -> b -> Tuple' a b
Tuple' Double
0 Double
1
step :: Tuple' Double Double -> Double -> Tuple' Double Double
step (Tuple' Double
x0 Double
k0) Double
x1 =
let x :: Double
x = Double -> Double -> Double -> Double
ewmaStep Double
k0 Double
x0 Double
x1
k :: Double
k = Double -> Double -> Double -> Double
ewmaStep Double
n Double
k0 Double
k1
in Double -> Double -> Tuple' Double Double
forall a b. a -> b -> Tuple' a b
Tuple' Double
x Double
k
extract :: Tuple' a b -> a
extract (Tuple' a
x b
_) = a
x
data Ewma = EwmaInit | EwmaGo !Double !Double
{-# INLINE incrEwma #-}
incrEwma :: MonadIO m =>
Double -> Scanl m (Incr Double, Ring.RingArray Double) Double
incrEwma :: forall (m :: * -> *).
MonadIO m =>
Double -> Scanl m (Incr Double, RingArray Double) Double
incrEwma Double
w = (Ewma -> (Incr Double, RingArray Double) -> m (Step Ewma Double))
-> m (Step Ewma Double)
-> (Ewma -> m Double)
-> (Ewma -> m Double)
-> Scanl m (Incr Double, RingArray Double) Double
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Scanl m a b
Scanl Ewma -> (Incr Double, RingArray Double) -> m (Step Ewma Double)
forall {m :: * -> *} {b}.
MonadIO m =>
Ewma -> (Incr Double, RingArray Double) -> m (Step Ewma b)
step m (Step Ewma Double)
forall {b}. m (Step Ewma b)
initial Ewma -> m Double
forall {m :: * -> *}. Monad m => Ewma -> m Double
extract Ewma -> m Double
forall {m :: * -> *}. Monad m => Ewma -> m Double
extract
where
initial :: m (Step Ewma b)
initial = do
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Double
w Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Double
0 Bool -> Bool -> Bool
|| Double
w Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
> Double
1)
(m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ [Char] -> m ()
forall a. HasCallStack => [Char] -> a
error [Char]
"incrEwma: weight must be >= 0 and <= 1"
Step Ewma b -> m (Step Ewma b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step Ewma b -> m (Step Ewma b)) -> Step Ewma b -> m (Step Ewma b)
forall a b. (a -> b) -> a -> b
$ Ewma -> Step Ewma b
forall s b. s -> Step s b
Partial Ewma
EwmaInit
step :: Ewma -> (Incr Double, RingArray Double) -> m (Step Ewma b)
step Ewma
EwmaInit (Insert Double
x, RingArray Double
rng) = do
let len :: Int
len = RingArray Double -> Int
forall a. Unbox a => RingArray a -> Int
Ring.length RingArray Double
rng
Bool -> m () -> m ()
forall a. HasCallStack => Bool -> a -> a
assert (Int
len Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0) (() -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ())
Step Ewma b -> m (Step Ewma b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step Ewma b -> m (Step Ewma b)) -> Step Ewma b -> m (Step Ewma b)
forall a b. (a -> b) -> a -> b
$ Ewma -> Step Ewma b
forall s b. s -> Step s b
Partial (Double -> Double -> Ewma
EwmaGo Double
x Double
1)
step Ewma
EwmaInit (Incr Double, RingArray Double)
_ = [Char] -> m (Step Ewma b)
forall a. HasCallStack => [Char] -> a
error [Char]
"incrEwma: the first window operation must be Insert"
step (EwmaGo Double
s Double
k) (Insert Double
x, RingArray Double
_) = do
let s1 :: Double
s1 = Double
w Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
+ (Double
1 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
w) Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
s
Step Ewma b -> m (Step Ewma b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step Ewma b -> m (Step Ewma b)) -> Step Ewma b -> m (Step Ewma b)
forall a b. (a -> b) -> a -> b
$ Ewma -> Step Ewma b
forall s b. s -> Step s b
Partial (Double -> Double -> Ewma
EwmaGo Double
s1 (Double
k Double -> Double -> Double
forall a. Num a => a -> a -> a
* (Double
1 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
w)))
step (EwmaGo Double
s Double
k) (Replace Double
x0 Double
x, RingArray Double
rng) = do
Double
x1 <- Int -> RingArray Double -> m Double
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
Int -> RingArray a -> m a
Ring.unsafeGetIndex Int
0 RingArray Double
rng
let s1 :: Double
s1 = Double
w Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
+ (Double
1 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
w) Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
s Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
k Double -> Double -> Double
forall a. Num a => a -> a -> a
* (Double
x1 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
x0)
Step Ewma b -> m (Step Ewma b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step Ewma b -> m (Step Ewma b)) -> Step Ewma b -> m (Step Ewma b)
forall a b. (a -> b) -> a -> b
$ Ewma -> Step Ewma b
forall s b. s -> Step s b
Partial (Double -> Double -> Ewma
EwmaGo Double
s1 Double
k)
extract :: Ewma -> m Double
extract Ewma
EwmaInit = Double -> m Double
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Double
0
extract (EwmaGo Double
x Double
_) = Double -> m Double
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Double
x
{-# INLINE incrRange #-}
incrRange :: (Monad m, Num a, Ord a) => Scanl m (Incr a) a
incrRange :: forall (m :: * -> *) a.
(Monad m, Num a, Ord a) =>
Scanl m (Incr a) a
incrRange = (a -> a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall (m :: * -> *) b c d a.
Monad m =>
(b -> c -> d) -> Scanl m a b -> Scanl m a c -> Scanl m a d
Scanl.teeWith (-) Scanl m (Incr a) a
forall (m :: * -> *) a. (Monad m, Ord a) => Scanl m (Incr a) a
incrMaximum Scanl m (Incr a) a
forall (m :: * -> *) a. (Monad m, Ord a) => Scanl m (Incr a) a
incrMinimum
{-# INLINE incrMd #-}
incrMd :: MonadIO m =>
Scanl m (Incr Double, Ring.RingArray Double) Double
incrMd :: forall (m :: * -> *).
MonadIO m =>
Scanl m (Incr Double, RingArray Double) Double
incrMd =
((Double, Maybe (RingArray Double)) -> m Double)
-> Scanl
m
(Incr Double, RingArray Double)
(Double, Maybe (RingArray Double))
-> Scanl m (Incr Double, RingArray Double) Double
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> Scanl m a b -> Scanl m a c
Scanl.rmapM (Double, Maybe (RingArray Double)) -> m Double
forall {m :: * -> *} {b}.
(Fractional b, MonadIO m, Unbox b) =>
(b, Maybe (RingArray b)) -> m b
computeMD
(Scanl
m
(Incr Double, RingArray Double)
(Double, Maybe (RingArray Double))
-> Scanl m (Incr Double, RingArray Double) Double)
-> Scanl
m
(Incr Double, RingArray Double)
(Double, Maybe (RingArray Double))
-> Scanl m (Incr Double, RingArray Double) Double
forall a b. (a -> b) -> a -> b
$ Scanl m (Incr Double, RingArray Double) Double
-> Scanl
m (Incr Double, RingArray Double) (Maybe (RingArray Double))
-> Scanl
m
(Incr Double, RingArray Double)
(Double, Maybe (RingArray Double))
forall (m :: * -> *) a b c.
Monad m =>
Scanl m a b -> Scanl m a c -> Scanl m a (b, c)
Scanl.tee
(((Incr Double, RingArray Double) -> Incr Double)
-> Scanl m (Incr Double) Double
-> Scanl m (Incr Double, RingArray Double) Double
forall a b (m :: * -> *) r. (a -> b) -> Scanl m b r -> Scanl m a r
Scanl.lmap (Incr Double, RingArray Double) -> Incr Double
forall a b. (a, b) -> a
fst Scanl m (Incr Double) Double
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Scanl m (Incr a) a
Scanl.incrMean) (((Incr Double, RingArray Double) -> RingArray Double)
-> Scanl m (RingArray Double) (Maybe (RingArray Double))
-> Scanl
m (Incr Double, RingArray Double) (Maybe (RingArray Double))
forall a b (m :: * -> *) r. (a -> b) -> Scanl m b r -> Scanl m a r
Scanl.lmap (Incr Double, RingArray Double) -> RingArray Double
forall a b. (a, b) -> b
snd Scanl m (RingArray Double) (Maybe (RingArray Double))
forall (m :: * -> *) a. Monad m => Scanl m a (Maybe a)
Scanl.latest)
where
computeMD :: (b, Maybe (RingArray b)) -> m b
computeMD (b
mn, Maybe (RingArray b)
mRng) =
case Maybe (RingArray b)
mRng of
Just RingArray b
rng -> do
Fold m b b -> Stream m b -> m b
forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> Stream m a -> m b
Stream.fold Fold m b b
forall (m :: * -> *) a. (Monad m, Fractional a) => Fold m a a
Fold.mean
(Stream m b -> m b) -> Stream m b -> m b
forall a b. (a -> b) -> a -> b
$ (b -> b) -> Stream m b -> Stream m b
forall a b. (a -> b) -> Stream m a -> Stream m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\b
a -> b -> b
forall a. Num a => a -> a
abs (b
mn b -> b -> b
forall a. Num a => a -> a -> a
- b
a))
(Stream m b -> Stream m b) -> Stream m b -> Stream m b
forall a b. (a -> b) -> a -> b
$ RingArray b -> Stream m b
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
RingArray a -> Stream m a
Ring.read RingArray b
rng
Maybe (RingArray b)
Nothing -> b -> m b
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return b
0.0
{-# INLINE incrVariance #-}
incrVariance :: (Monad m, Fractional a) => Scanl m (Incr a) a
incrVariance :: forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Scanl m (Incr a) a
incrVariance =
(a -> a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall (m :: * -> *) b c d a.
Monad m =>
(b -> c -> d) -> Scanl m a b -> Scanl m a c -> Scanl m a d
Scanl.teeWith
(\a
p2 a
m -> a
p2 a -> a -> a
forall a. Num a => a -> a -> a
- a
m a -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
2 :: Int)) (Int -> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Int -> Scanl m (Incr a) a
incrRawMoment Int
2) Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Scanl m (Incr a) a
Scanl.incrMean
{-# INLINE incrStdDev #-}
incrStdDev :: (Monad m, Floating a) => Scanl m (Incr a) a
incrStdDev :: forall (m :: * -> *) a. (Monad m, Floating a) => Scanl m (Incr a) a
incrStdDev = a -> a
forall a. Floating a => a -> a
sqrt (a -> a) -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Scanl m (Incr a) a
incrVariance
{-# INLINE incrSkewness #-}
incrSkewness :: (Monad m, Floating a) => Scanl m (Incr a) a
incrSkewness :: forall (m :: * -> *) a. (Monad m, Floating a) => Scanl m (Incr a) a
incrSkewness =
(\a
rm3 a
sd a
mu ->
a
rm3 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
sd a -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
3 :: Int) a -> a -> a
forall a. Num a => a -> a -> a
- a
3 a -> a -> a
forall a. Num a => a -> a -> a
* (a
mu a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
sd) a -> a -> a
forall a. Num a => a -> a -> a
- (a
mu a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
sd) a -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
3 :: Int)
)
(a -> a -> a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) (a -> a -> a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Int -> Scanl m (Incr a) a
incrRawMoment Int
3
Scanl m (Incr a) (a -> a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) (a -> a)
forall a b.
Scanl m (Incr a) (a -> b)
-> Scanl m (Incr a) a -> Scanl m (Incr a) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Scanl m (Incr a) a
forall (m :: * -> *) a. (Monad m, Floating a) => Scanl m (Incr a) a
incrStdDev
Scanl m (Incr a) (a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall a b.
Scanl m (Incr a) (a -> b)
-> Scanl m (Incr a) a -> Scanl m (Incr a) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Scanl m (Incr a) a
Scanl.incrMean
{-# INLINE incrKurtosis #-}
incrKurtosis :: (Monad m, Floating a) => Scanl m (Incr a) a
incrKurtosis :: forall (m :: * -> *) a. (Monad m, Floating a) => Scanl m (Incr a) a
incrKurtosis =
(\a
rm4 a
rm3 a
sd a
mu ->
( a
3 a -> a -> a
forall a. Num a => a -> a -> a
* a
mu a -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
4 :: Int)
a -> a -> a
forall a. Num a => a -> a -> a
+ a
6 a -> a -> a
forall a. Num a => a -> a -> a
* a
mu a -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
2 :: Int) a -> a -> a
forall a. Num a => a -> a -> a
* a
sd a -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
2 :: Int)
a -> a -> a
forall a. Num a => a -> a -> a
- a
4 a -> a -> a
forall a. Num a => a -> a -> a
* a
mu a -> a -> a
forall a. Num a => a -> a -> a
* a
rm3
a -> a -> a
forall a. Num a => a -> a -> a
+ a
rm4) a -> a -> a
forall a. Fractional a => a -> a -> a
/ (a
sd a -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
4 :: Int))
)
(a -> a -> a -> a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) (a -> a -> a -> a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Int -> Scanl m (Incr a) a
incrRawMoment Int
4
Scanl m (Incr a) (a -> a -> a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) (a -> a -> a)
forall a b.
Scanl m (Incr a) (a -> b)
-> Scanl m (Incr a) a -> Scanl m (Incr a) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Int -> Scanl m (Incr a) a
incrRawMoment Int
3
Scanl m (Incr a) (a -> a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) (a -> a)
forall a b.
Scanl m (Incr a) (a -> b)
-> Scanl m (Incr a) a -> Scanl m (Incr a) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Scanl m (Incr a) a
forall (m :: * -> *) a. (Monad m, Floating a) => Scanl m (Incr a) a
incrStdDev
Scanl m (Incr a) (a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall a b.
Scanl m (Incr a) (a -> b)
-> Scanl m (Incr a) a -> Scanl m (Incr a) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Scanl m (Incr a) a
Scanl.incrMean
{-# INLINE incrSampleVariance #-}
incrSampleVariance :: (Monad m, Fractional a) => Scanl m (Incr a) a
incrSampleVariance :: forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Scanl m (Incr a) a
incrSampleVariance =
(a -> a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall (m :: * -> *) b c d a.
Monad m =>
(b -> c -> d) -> Scanl m a b -> Scanl m a c -> Scanl m a d
Scanl.teeWith (\a
n a
s2 -> a
n a -> a -> a
forall a. Num a => a -> a -> a
* a
s2 a -> a -> a
forall a. Fractional a => a -> a -> a
/ (a
n a -> a -> a
forall a. Num a => a -> a -> a
- a
1)) Scanl m (Incr a) a
forall (m :: * -> *) b a. (Monad m, Num b) => Scanl m (Incr a) b
Scanl.incrCount Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Scanl m (Incr a) a
incrVariance
{-# INLINE incrSampleStdDev #-}
incrSampleStdDev :: (Monad m, Floating a) => Scanl m (Incr a) a
incrSampleStdDev :: forall (m :: * -> *) a. (Monad m, Floating a) => Scanl m (Incr a) a
incrSampleStdDev = a -> a
forall a. Floating a => a -> a
sqrt (a -> a) -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Scanl m (Incr a) a
forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Scanl m (Incr a) a
incrSampleVariance
{-# INLINE incrStdErrMean #-}
incrStdErrMean :: (Monad m, Floating a) => Scanl m (Incr a) a
incrStdErrMean :: forall (m :: * -> *) a. (Monad m, Floating a) => Scanl m (Incr a) a
incrStdErrMean =
(a -> a -> a)
-> Scanl m (Incr a) a -> Scanl m (Incr a) a -> Scanl m (Incr a) a
forall (m :: * -> *) b c d a.
Monad m =>
(b -> c -> d) -> Scanl m a b -> Scanl m a c -> Scanl m a d
Scanl.teeWith (\a
sd a
n -> a
sd a -> a -> a
forall a. Fractional a => a -> a -> a
/ a -> a
forall a. Floating a => a -> a
sqrt a
n) Scanl m (Incr a) a
forall (m :: * -> *) a. (Monad m, Floating a) => Scanl m (Incr a) a
incrSampleStdDev Scanl m (Incr a) a
forall (m :: * -> *) b a. (Monad m, Num b) => Scanl m (Incr a) b
Scanl.incrCount
{-# INLINE incrFrequency #-}
incrFrequency :: (Monad m, Ord a) => Scanl m (Incr a) (Map a Int)
incrFrequency :: forall (m :: * -> *) a.
(Monad m, Ord a) =>
Scanl m (Incr a) (Map a Int)
incrFrequency = (Map a Int -> Incr a -> Map a Int)
-> Map a Int -> Scanl m (Incr a) (Map a Int)
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Scanl m a b
Scanl.mkScanl Map a Int -> Incr a -> Map a Int
forall {k} {a}.
(Ord k, Num a, Eq a) =>
Map k a -> Incr k -> Map k a
step Map a Int
forall k a. Map k a
Map.empty
where
decrement :: a -> Maybe a
decrement a
v =
if a
v a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
1
then Maybe a
forall a. Maybe a
Nothing
else a -> Maybe a
forall a. a -> Maybe a
Just (a
v a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
step :: Map k a -> Incr k -> Map k a
step Map k a
refCountMap (Insert k
new) =
(a -> a -> a) -> k -> a -> Map k a -> Map k a
forall k a. Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
Map.insertWith a -> a -> a
forall a. Num a => a -> a -> a
(+) k
new a
1 Map k a
refCountMap
step Map k a
refCountMap (Replace k
old k
new) =
let m1 :: Map k a
m1 = (a -> a -> a) -> k -> a -> Map k a -> Map k a
forall k a. Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a
Map.insertWith a -> a -> a
forall a. Num a => a -> a -> a
(+) k
new a
1 Map k a
refCountMap
in (a -> Maybe a) -> k -> Map k a -> Map k a
forall k a. Ord k => (a -> Maybe a) -> k -> Map k a -> Map k a
Map.update a -> Maybe a
forall {a}. (Eq a, Num a) => a -> Maybe a
decrement k
old Map k a
m1