module Data.Random.Distribution.Bernoulli where
import Data.Random.Internal.Classification
import Data.Random.Source
import Data.Random.Distribution
import Data.Random.RVar
import Data.Random.Distribution.Uniform
import Data.Int
import Data.Word
bernoulli :: (Distribution (Bernoulli b) a) => b -> RVar a
bernoulli p = sample (Bernoulli p)
boolBernoulli p = do
x <- realFloatUniform 0 1
return (x <= p)
generalBernoulli t f p = do
x <- boolBernoulli p
return (if x then t else f)
class (Classification NumericType t c) => BernoulliByClassification c t where
bernoulliByClassification :: RealFloat a => a -> RVar t
instance (Classification NumericType t IntegralType, Num t) => BernoulliByClassification IntegralType t
where bernoulliByClassification = generalBernoulli 0 1
instance (Classification NumericType t FractionalType, Num t) => BernoulliByClassification FractionalType t
where bernoulliByClassification = generalBernoulli 0 1
instance (Classification NumericType t EnumType, Enum t) => BernoulliByClassification EnumType t
where bernoulliByClassification = generalBernoulli (toEnum 0) (toEnum 1)
data Bernoulli b a = Bernoulli b
instance (BernoulliByClassification c t, RealFloat b) => Distribution (Bernoulli b) t where
rvar (Bernoulli p) = bernoulliByClassification p