{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ExtendedDefaultRules #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -Wall #-}
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
module Data.Mealy.Simulate
( rvs,
rvsp,
create,
)
where
import Control.Monad.Primitive (PrimState)
import NumHask.Prelude hiding (fold)
import System.Random.MWC.Probability
rvs :: Gen (PrimState IO) -> Int -> IO [Double]
rvs :: Gen (PrimState IO) -> Int -> IO [Double]
rvs Gen (PrimState IO)
gen Int
n = Int -> Prob IO Double -> Gen (PrimState IO) -> IO [Double]
forall (m :: * -> *) a.
PrimMonad m =>
Int -> Prob m a -> Gen (PrimState m) -> m [a]
samples Int
n Prob IO Double
forall (m :: * -> *). PrimMonad m => Prob m Double
standardNormal Gen (PrimState IO)
gen
rvsp :: Gen (PrimState IO) -> Int -> Double -> IO [(Double, Double)]
rvsp :: Gen (PrimState IO) -> Int -> Double -> IO [(Double, Double)]
rvsp Gen (PrimState IO)
gen Int
n Double
c = do
[Double]
s0 <- Gen (PrimState IO) -> Int -> IO [Double]
rvs Gen (PrimState IO)
gen Int
n
[Double]
s1 <- Gen (PrimState IO) -> Int -> IO [Double]
rvs Gen (PrimState IO)
gen Int
n
let s1' :: [Double]
s1' = (Double -> Double -> Double) -> [Double] -> [Double] -> [Double]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\Double
x Double
y -> Double
c Double -> Double -> Double
forall a. Multiplicative a => a -> a -> a
* Double
x Double -> Double -> Double
forall a. Additive a => a -> a -> a
+ Double -> Double
forall a. ExpField a => a -> a
sqrt (Double
1 Double -> Double -> Double
forall a. Subtractive a => a -> a -> a
- Double
c Double -> Double -> Double
forall a. Multiplicative a => a -> a -> a
* Double
c) Double -> Double -> Double
forall a. Multiplicative a => a -> a -> a
* Double
y) [Double]
s0 [Double]
s1
[(Double, Double)] -> IO [(Double, Double)]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([(Double, Double)] -> IO [(Double, Double)])
-> [(Double, Double)] -> IO [(Double, Double)]
forall a b. (a -> b) -> a -> b
$ [Double] -> [Double] -> [(Double, Double)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Double]
s0 [Double]
s1'