module QuantLib.Stochastic.Discretize
        ( module QuantLib.Stochastic.Discretize )
        where

import QuantLib.Stochastic.Process

-- | Euler discretization of stochastic processes
data Euler = Euler { Euler -> Double
eDt :: Double }
        deriving (Int -> Euler -> ShowS
[Euler] -> ShowS
Euler -> String
(Int -> Euler -> ShowS)
-> (Euler -> String) -> ([Euler] -> ShowS) -> Show Euler
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Euler -> ShowS
showsPrec :: Int -> Euler -> ShowS
$cshow :: Euler -> String
show :: Euler -> String
$cshowList :: [Euler] -> ShowS
showList :: [Euler] -> ShowS
Show, Euler -> Euler -> Bool
(Euler -> Euler -> Bool) -> (Euler -> Euler -> Bool) -> Eq Euler
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Euler -> Euler -> Bool
== :: Euler -> Euler -> Bool
$c/= :: Euler -> Euler -> Bool
/= :: Euler -> Euler -> Bool
Eq)

-- | Euler end-point discretization of stochastic processes
data EndEuler = EndEuler { EndEuler -> Double
eeDt :: Double }
        deriving (Int -> EndEuler -> ShowS
[EndEuler] -> ShowS
EndEuler -> String
(Int -> EndEuler -> ShowS)
-> (EndEuler -> String) -> ([EndEuler] -> ShowS) -> Show EndEuler
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EndEuler -> ShowS
showsPrec :: Int -> EndEuler -> ShowS
$cshow :: EndEuler -> String
show :: EndEuler -> String
$cshowList :: [EndEuler] -> ShowS
showList :: [EndEuler] -> ShowS
Show, EndEuler -> EndEuler -> Bool
(EndEuler -> EndEuler -> Bool)
-> (EndEuler -> EndEuler -> Bool) -> Eq EndEuler
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EndEuler -> EndEuler -> Bool
== :: EndEuler -> EndEuler -> Bool
$c/= :: EndEuler -> EndEuler -> Bool
/= :: EndEuler -> EndEuler -> Bool
Eq)

instance Discretize Euler where
        dDrift :: forall a. StochasticProcess a => a -> Euler -> Dot -> Double
dDrift a
p Euler
e Dot
dot = a -> Dot -> Double
forall a. StochasticProcess a => a -> Dot -> Double
drift a
p Dot
dot Double -> Double -> Double
forall a. Num a => a -> a -> a
* Euler -> Double
eDt Euler
e
        dDiff :: forall a. StochasticProcess a => a -> Euler -> Dot -> Double
dDiff  a
p Euler
e Dot
dot = a -> Dot -> Double
forall a. StochasticProcess a => a -> Dot -> Double
diff  a
p Dot
dot Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double -> Double
forall a. Floating a => a -> a
sqrt (Euler -> Double
eDt Euler
e)
        dDt :: forall a. StochasticProcess a => a -> Euler -> Dot -> Double
dDt    a
_ Euler
e Dot
_   = Euler -> Double
eDt Euler
e

instance Discretize EndEuler where
        dDrift :: forall a. StochasticProcess a => a -> EndEuler -> Dot -> Double
dDrift a
p EndEuler
e Dot
dot = a -> Dot -> Double
forall a. StochasticProcess a => a -> Dot -> Double
drift a
p Dot
nextDot Double -> Double -> Double
forall a. Num a => a -> a -> a
* EndEuler -> Double
eeDt EndEuler
e
                where nextDot :: Dot
nextDot = Double -> Double -> Dot
Dot (Dot -> Double
getT Dot
dot Double -> Double -> Double
forall a. Num a => a -> a -> a
+ EndEuler -> Double
eeDt EndEuler
e) (Dot -> Double
getX Dot
dot)
        dDiff :: forall a. StochasticProcess a => a -> EndEuler -> Dot -> Double
dDiff  a
p EndEuler
e Dot
dot =  a -> Dot -> Double
forall a. StochasticProcess a => a -> Dot -> Double
diff  a
p Dot
nextDot Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double -> Double
forall a. Floating a => a -> a
sqrt (EndEuler -> Double
eeDt EndEuler
e)
                where nextDot :: Dot
nextDot = Double -> Double -> Dot
Dot (Dot -> Double
getT Dot
dot Double -> Double -> Double
forall a. Num a => a -> a -> a
+ EndEuler -> Double
eeDt EndEuler
e) (Dot -> Double
getX Dot
dot) 
        dDt :: forall a. StochasticProcess a => a -> EndEuler -> Dot -> Double
dDt    a
_ EndEuler
e Dot
_   = EndEuler -> Double
eeDt EndEuler
e