{-# LANGUAGE BangPatterns #-}
module Mcmc.Prior
(
largerThan,
positive,
lowerThan,
negative,
exponential,
gamma,
normal,
uniform,
poisson,
product',
)
where
import Control.Monad
import Data.Maybe (fromMaybe)
import Numeric.Log
import qualified Statistics.Distribution as S
import qualified Statistics.Distribution.Exponential as S
import qualified Statistics.Distribution.Gamma as S
import qualified Statistics.Distribution.Normal as S
import qualified Statistics.Distribution.Poisson as S
largerThan :: Double -> Double -> Log Double
largerThan :: Double -> Double -> Log Double
largerThan Double
a Double
x
| Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
a = Log Double
0
| Bool
otherwise = Log Double
1
positive :: Double -> Log Double
positive :: Double -> Log Double
positive = Double -> Double -> Log Double
largerThan Double
0
lowerThan :: Double -> Double -> Log Double
lowerThan :: Double -> Double -> Log Double
lowerThan Double
b Double
x
| Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
>= Double
b = Log Double
0
| Bool
otherwise = Log Double
1
negative :: Double -> Log Double
negative :: Double -> Log Double
negative = Double -> Double -> Log Double
lowerThan Double
0
exponential ::
Double ->
Double ->
Log Double
exponential :: Double -> Double -> Log Double
exponential Double
l Double
x = Double -> Log Double
forall a. a -> Log a
Exp (Double -> Log Double) -> Double -> Log Double
forall a b. (a -> b) -> a -> b
$ ExponentialDistribution -> Double -> Double
forall d. ContDistr d => d -> Double -> Double
S.logDensity ExponentialDistribution
d Double
x
where
d :: ExponentialDistribution
d = Double -> ExponentialDistribution
S.exponential Double
l
gamma ::
Double ->
Double ->
Double ->
Log Double
gamma :: Double -> Double -> Double -> Log Double
gamma Double
k Double
t Double
x = Double -> Log Double
forall a. a -> Log a
Exp (Double -> Log Double) -> Double -> Log Double
forall a b. (a -> b) -> a -> b
$ GammaDistribution -> Double -> Double
forall d. ContDistr d => d -> Double -> Double
S.logDensity GammaDistribution
d Double
x
where
d :: GammaDistribution
d = Double -> Double -> GammaDistribution
S.gammaDistr Double
k Double
t
normal ::
Double ->
Double ->
Double ->
Log Double
normal :: Double -> Double -> Double -> Log Double
normal Double
m Double
s Double
x = Double -> Log Double
forall a. a -> Log a
Exp (Double -> Log Double) -> Double -> Log Double
forall a b. (a -> b) -> a -> b
$ NormalDistribution -> Double -> Double
forall d. ContDistr d => d -> Double -> Double
S.logDensity NormalDistribution
d Double
x
where
d :: NormalDistribution
d = Double -> Double -> NormalDistribution
S.normalDistr Double
m Double
s
uniform ::
Double ->
Double ->
Double ->
Log Double
uniform :: Double -> Double -> Double -> Log Double
uniform Double
a Double
b Double
x
| Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
a = Log Double
0
| Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
>= Double
b = Log Double
0
| Bool
otherwise = Double -> Log Double
forall a. a -> Log a
Exp Double
0
poisson ::
Double ->
Int ->
Log Double
poisson :: Double -> Int -> Log Double
poisson Double
l Int
x = Double -> Log Double
forall a. a -> Log a
Exp (Double -> Log Double) -> Double -> Log Double
forall a b. (a -> b) -> a -> b
$ PoissonDistribution -> Int -> Double
forall d. DiscreteDistr d => d -> Int -> Double
S.logProbability PoissonDistribution
d Int
x
where
d :: PoissonDistribution
d = Double -> PoissonDistribution
S.poisson Double
l
product' :: [Log Double] -> Log Double
product' :: [Log Double] -> Log Double
product' = Log Double -> Maybe (Log Double) -> Log Double
forall a. a -> Maybe a -> a
fromMaybe Log Double
0 (Maybe (Log Double) -> Log Double)
-> ([Log Double] -> Maybe (Log Double))
-> [Log Double]
-> Log Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Log Double] -> Maybe (Log Double)
prodM
prodM :: [Log Double] -> Maybe (Log Double)
prodM :: [Log Double] -> Maybe (Log Double)
prodM = (Log Double -> Log Double -> Maybe (Log Double))
-> Log Double -> [Log Double] -> Maybe (Log Double)
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldM (\ !Log Double
acc Log Double
x -> (Log Double
acc Log Double -> Log Double -> Log Double
forall a. Num a => a -> a -> a
* Log Double
x) Log Double -> Maybe () -> Maybe (Log Double)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Log Double
acc Log Double -> Log Double -> Bool
forall a. Eq a => a -> a -> Bool
/= Log Double
0)) Log Double
1