{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, UndecidableInstances #-} module Data.Random.Distribution.Exponential where import Data.Random.RVar import Data.Random.Distribution import Data.Random.Distribution.Uniform newtype Exponential a = Exp a floatingExponential :: (Floating a, Distribution StdUniform a) => a -> RVarT m a floatingExponential lambdaRecip = do x <- stdUniformT return (negate (log x) * lambdaRecip) floatingExponentialCDF :: Real a => a -> a -> Double floatingExponentialCDF lambdaRecip x = 1 - exp (negate (realToFrac x) / realToFrac lambdaRecip) exponential :: Distribution Exponential a => a -> RVar a exponential = rvar . Exp exponentialT :: Distribution Exponential a => a -> RVarT m a exponentialT = rvarT . Exp instance (Floating a, Distribution StdUniform a) => Distribution Exponential a where rvarT (Exp lambdaRecip) = floatingExponential lambdaRecip instance (Real a, Distribution Exponential a) => CDF Exponential a where cdf (Exp lambdaRecip) = floatingExponentialCDF lambdaRecip