module GSL.Random.Dist (
gaussianPdf,
gaussianP,
gaussianQ,
gaussianPInv,
gaussianQInv,
getGaussian,
getGaussianZiggurat,
getGaussianRatioMethod,
ugaussianPdf,
ugaussianP,
ugaussianQ,
ugaussianPInv,
ugaussianQInv,
getUGaussian,
getUGaussianRatioMethod,
flatPdf,
flatP,
flatQ,
flatPInv,
flatQInv,
getFlat,
exponentialPdf,
exponentialP,
exponentialQ,
exponentialPInv,
exponentialQInv,
getExponential,
getLevy,
getLevySkew,
poissonPdf,
poissonP,
poissonQ,
getPoisson,
getCauchy,
cauchyPdf,
cauchyP,
cauchyQ,
cauchyPInv,
cauchyQInv,
getBeta,
betaPdf,
betaP,
betaQ,
betaPInv,
betaQInv,
getLogistic,
logisticPdf,
logisticP,
logisticQ,
logisticPInv,
logisticQInv,
getPareto,
paretoPdf,
paretoP,
paretoQ,
paretoPInv,
paretoQInv,
getWeibull,
weibullPdf,
weibullP,
weibullQ,
weibullPInv,
weibullQInv,
getGamma,
getGammaKnuth,
gammaPdf,
gammaP,
gammaQ,
gammaPInv,
gammaQInv,
getDirichlet,
dirichletPdf,
dirichletLnPdf,
) where
import Control.Applicative ( (<$>) )
import Foreign.C.Types ( CUInt, CDouble, CSize )
import Foreign.ForeignPtr ( withForeignPtr, mallocForeignPtrArray )
import Foreign.Ptr ( Ptr )
import System.IO.Unsafe ( unsafePerformIO )
import qualified Data.Vector.Storable as VS
import GSL.Random.Gen.Internal ( RNG(..) )
gaussianPdf :: Double -> Double -> Double
gaussianPdf = liftDouble2 gsl_ran_gaussian_pdf
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_gaussian_pdf :: CDouble -> CDouble -> CDouble
gaussianP :: Double -> Double -> Double
gaussianP = liftDouble2 gsl_cdf_gaussian_P
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_gaussian_P :: CDouble -> CDouble -> CDouble
gaussianQ :: Double -> Double -> Double
gaussianQ = liftDouble2 gsl_cdf_gaussian_Q
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_gaussian_Q :: CDouble -> CDouble -> CDouble
gaussianPInv :: Double -> Double -> Double
gaussianPInv = liftDouble2 gsl_cdf_gaussian_Pinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_gaussian_Pinv :: CDouble -> CDouble -> CDouble
gaussianQInv :: Double -> Double -> Double
gaussianQInv = liftDouble2 gsl_cdf_gaussian_Qinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_gaussian_Qinv :: CDouble -> CDouble -> CDouble
getGaussian :: RNG -> Double -> IO Double
getGaussian = liftRan1 gsl_ran_gaussian
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_gaussian :: Ptr () -> CDouble -> IO CDouble
getGaussianZiggurat :: RNG -> Double -> IO Double
getGaussianZiggurat = liftRan1 gsl_ran_gaussian_ziggurat
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_gaussian_ziggurat :: Ptr () -> CDouble -> IO CDouble
getGaussianRatioMethod:: RNG -> Double -> IO Double
getGaussianRatioMethod = liftRan1 gsl_ran_gaussian_ratio_method
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_gaussian_ratio_method :: Ptr () -> CDouble -> IO CDouble
ugaussianPdf :: Double -> Double
ugaussianPdf = liftDouble gsl_ran_ugaussian_pdf
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_ugaussian_pdf :: CDouble -> CDouble
ugaussianP :: Double -> Double
ugaussianP = liftDouble gsl_cdf_ugaussian_P
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_ugaussian_P :: CDouble -> CDouble
ugaussianQ :: Double -> Double
ugaussianQ = liftDouble gsl_cdf_ugaussian_Q
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_ugaussian_Q :: CDouble -> CDouble
ugaussianPInv :: Double -> Double
ugaussianPInv = liftDouble gsl_cdf_ugaussian_Pinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_ugaussian_Pinv :: CDouble -> CDouble
ugaussianQInv :: Double -> Double
ugaussianQInv = liftDouble gsl_cdf_ugaussian_Qinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_ugaussian_Qinv :: CDouble -> CDouble
getUGaussian :: RNG -> IO Double
getUGaussian = liftRan0 gsl_ran_ugaussian
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_ugaussian :: Ptr () -> IO CDouble
getUGaussianRatioMethod:: RNG -> IO Double
getUGaussianRatioMethod = liftRan0 gsl_ran_ugaussian_ratio_method
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_ugaussian_ratio_method :: Ptr () -> IO CDouble
flatPdf :: Double -> Double -> Double -> Double
flatPdf = liftDouble3 gsl_ran_flat_pdf
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_flat_pdf :: CDouble -> CDouble -> CDouble -> CDouble
flatP :: Double -> Double -> Double -> Double
flatP = liftDouble3 gsl_cdf_flat_P
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_flat_P :: CDouble -> CDouble -> CDouble -> CDouble
flatQ :: Double -> Double -> Double -> Double
flatQ = liftDouble3 gsl_cdf_flat_Q
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_flat_Q :: CDouble -> CDouble -> CDouble -> CDouble
flatPInv :: Double -> Double -> Double -> Double
flatPInv = liftDouble3 gsl_cdf_flat_Pinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_flat_Pinv :: CDouble -> CDouble -> CDouble -> CDouble
flatQInv :: Double -> Double -> Double -> Double
flatQInv = liftDouble3 gsl_cdf_flat_Qinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_flat_Qinv :: CDouble -> CDouble -> CDouble -> CDouble
getFlat :: RNG -> Double -> Double -> IO (Double)
getFlat = liftRan2 gsl_ran_flat
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_flat :: Ptr () -> CDouble -> CDouble -> IO CDouble
getExponential :: RNG -> Double -> IO Double
getExponential = liftRan1 gsl_ran_exponential
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_exponential :: Ptr () -> CDouble -> IO CDouble
exponentialPdf :: Double -> Double -> Double
exponentialPdf = liftDouble2 gsl_ran_exponential_pdf
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_exponential_pdf :: CDouble -> CDouble -> CDouble
exponentialP :: Double -> Double -> Double
exponentialP = liftDouble2 gsl_cdf_exponential_P
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_exponential_P :: CDouble -> CDouble -> CDouble
exponentialQ :: Double -> Double -> Double
exponentialQ = liftDouble2 gsl_cdf_exponential_Q
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_exponential_Q :: CDouble -> CDouble -> CDouble
exponentialPInv :: Double -> Double -> Double
exponentialPInv = liftDouble2 gsl_cdf_exponential_Pinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_exponential_Pinv :: CDouble -> CDouble -> CDouble
exponentialQInv :: Double -> Double -> Double
exponentialQInv = liftDouble2 gsl_cdf_exponential_Qinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_exponential_Qinv :: CDouble -> CDouble -> CDouble
getLevy :: RNG -> Double -> Double -> IO (Double)
getLevy = liftRan2 gsl_ran_levy
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_levy :: Ptr () -> CDouble -> CDouble -> IO CDouble
getLevySkew :: RNG -> Double -> Double -> Double -> IO (Double)
getLevySkew = liftRan3 gsl_ran_levy_skew
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_levy_skew :: Ptr () -> CDouble -> CDouble -> CDouble -> IO CDouble
poissonPdf :: Int -> Double -> Double
poissonPdf k = liftDouble $ gsl_ran_poisson_pdf (fromIntegral k)
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_poisson_pdf :: CUInt -> CDouble -> CDouble
poissonP :: Int -> Double -> Double
poissonP k = liftDouble $ gsl_cdf_poisson_P (fromIntegral k)
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_poisson_P :: CUInt -> CDouble -> CDouble
poissonQ :: Int -> Double -> Double
poissonQ k = liftDouble $ gsl_cdf_poisson_Q (fromIntegral k)
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_poisson_Q :: CUInt -> CDouble -> CDouble
getPoisson :: RNG -> Double -> IO Int
getPoisson (MkRNG fptr) mu =
let mu' = realToFrac mu
in withForeignPtr fptr $ \ptr -> do
x <- gsl_ran_poisson ptr mu'
return $ fromIntegral x
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_poisson :: Ptr () -> CDouble -> IO CUInt
cauchyPdf :: Double -> Double -> Double
cauchyPdf = liftDouble2 gsl_ran_cauchy_pdf
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_cauchy_pdf :: CDouble -> CDouble -> CDouble
getCauchy :: RNG -> Double -> IO Double
getCauchy = liftRan1 gsl_ran_cauchy
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_cauchy :: Ptr () -> CDouble -> IO CDouble
cauchyP :: Double -> Double -> Double
cauchyP = liftDouble2 gsl_cdf_cauchy_P
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_cauchy_P :: CDouble -> CDouble -> CDouble
cauchyQ :: Double -> Double -> Double
cauchyQ = liftDouble2 gsl_cdf_cauchy_Q
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_cauchy_Q :: CDouble -> CDouble -> CDouble
cauchyPInv :: Double -> Double -> Double
cauchyPInv = liftDouble2 gsl_cdf_cauchy_Pinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_cauchy_Pinv :: CDouble -> CDouble -> CDouble
cauchyQInv :: Double -> Double -> Double
cauchyQInv = liftDouble2 gsl_cdf_cauchy_Qinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_cauchy_Qinv :: CDouble -> CDouble -> CDouble
betaPdf :: Double -> Double -> Double -> Double
betaPdf = liftDouble3 gsl_ran_beta_pdf
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_beta_pdf :: CDouble -> CDouble -> CDouble -> CDouble
getBeta :: RNG -> Double -> Double -> IO Double
getBeta = liftRan2 gsl_ran_beta
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_beta :: Ptr () -> CDouble -> CDouble -> IO CDouble
betaP :: Double -> Double -> Double -> Double
betaP = liftDouble3 gsl_cdf_beta_P
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_beta_P :: CDouble -> CDouble -> CDouble -> CDouble
betaQ :: Double -> Double -> Double -> Double
betaQ = liftDouble3 gsl_cdf_beta_Q
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_beta_Q :: CDouble -> CDouble -> CDouble -> CDouble
betaPInv :: Double -> Double -> Double -> Double
betaPInv = liftDouble3 gsl_cdf_beta_Pinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_beta_Pinv :: CDouble -> CDouble -> CDouble -> CDouble
betaQInv :: Double -> Double -> Double -> Double
betaQInv = liftDouble3 gsl_cdf_beta_Qinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_beta_Qinv :: CDouble -> CDouble -> CDouble -> CDouble
logisticPdf :: Double -> Double -> Double
logisticPdf = liftDouble2 gsl_ran_logistic_pdf
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_logistic_pdf :: CDouble -> CDouble -> CDouble
getLogistic :: RNG -> Double -> IO Double
getLogistic = liftRan1 gsl_ran_logistic
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_logistic :: Ptr () -> CDouble -> IO CDouble
logisticP :: Double -> Double -> Double
logisticP = liftDouble2 gsl_cdf_logistic_P
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_logistic_P :: CDouble -> CDouble -> CDouble
logisticQ :: Double -> Double -> Double
logisticQ = liftDouble2 gsl_cdf_logistic_Q
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_logistic_Q :: CDouble -> CDouble -> CDouble
logisticPInv :: Double -> Double -> Double
logisticPInv = liftDouble2 gsl_cdf_logistic_Pinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_logistic_Pinv :: CDouble -> CDouble -> CDouble
logisticQInv :: Double -> Double -> Double
logisticQInv = liftDouble2 gsl_cdf_logistic_Qinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_logistic_Qinv :: CDouble -> CDouble -> CDouble
paretoPdf :: Double -> Double -> Double -> Double
paretoPdf = liftDouble3 gsl_ran_pareto_pdf
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_pareto_pdf :: CDouble -> CDouble -> CDouble -> CDouble
getPareto :: RNG -> Double -> Double -> IO Double
getPareto = liftRan2 gsl_ran_pareto
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_pareto :: Ptr () -> CDouble -> CDouble -> IO CDouble
paretoP :: Double -> Double -> Double -> Double
paretoP = liftDouble3 gsl_cdf_pareto_P
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_pareto_P :: CDouble -> CDouble -> CDouble -> CDouble
paretoQ :: Double -> Double -> Double -> Double
paretoQ = liftDouble3 gsl_cdf_pareto_Q
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_pareto_Q :: CDouble -> CDouble -> CDouble -> CDouble
paretoPInv :: Double -> Double -> Double -> Double
paretoPInv = liftDouble3 gsl_cdf_pareto_Pinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_pareto_Pinv :: CDouble -> CDouble -> CDouble -> CDouble
paretoQInv :: Double -> Double -> Double -> Double
paretoQInv = liftDouble3 gsl_cdf_pareto_Qinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_pareto_Qinv :: CDouble -> CDouble -> CDouble -> CDouble
weibullPdf :: Double -> Double -> Double -> Double
weibullPdf = liftDouble3 gsl_ran_weibull_pdf
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_weibull_pdf :: CDouble -> CDouble -> CDouble -> CDouble
getWeibull :: RNG -> Double -> Double -> IO Double
getWeibull = liftRan2 gsl_ran_weibull
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_weibull :: Ptr () -> CDouble -> CDouble -> IO CDouble
weibullP :: Double -> Double -> Double -> Double
weibullP = liftDouble3 gsl_cdf_weibull_P
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_weibull_P :: CDouble -> CDouble -> CDouble -> CDouble
weibullQ :: Double -> Double -> Double -> Double
weibullQ = liftDouble3 gsl_cdf_weibull_Q
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_weibull_Q :: CDouble -> CDouble -> CDouble -> CDouble
weibullPInv :: Double -> Double -> Double -> Double
weibullPInv = liftDouble3 gsl_cdf_weibull_Pinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_weibull_Pinv :: CDouble -> CDouble -> CDouble -> CDouble
weibullQInv :: Double -> Double -> Double -> Double
weibullQInv = liftDouble3 gsl_cdf_weibull_Qinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_weibull_Qinv :: CDouble -> CDouble -> CDouble -> CDouble
gammaPdf :: Double -> Double -> Double -> Double
gammaPdf = liftDouble3 gsl_ran_gamma_pdf
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_gamma_pdf :: CDouble -> CDouble -> CDouble -> CDouble
getGamma :: RNG -> Double -> Double -> IO Double
getGamma = liftRan2 gsl_ran_gamma
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_gamma :: Ptr () -> CDouble -> CDouble -> IO CDouble
getGammaKnuth :: RNG -> Double -> Double -> IO Double
getGammaKnuth = liftRan2 gsl_ran_gamma_knuth
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_gamma_knuth :: Ptr () -> CDouble -> CDouble -> IO CDouble
gammaP :: Double -> Double -> Double -> Double
gammaP = liftDouble3 gsl_cdf_gamma_P
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_gamma_P :: CDouble -> CDouble -> CDouble -> CDouble
gammaQ :: Double -> Double -> Double -> Double
gammaQ = liftDouble3 gsl_cdf_gamma_Q
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_gamma_Q :: CDouble -> CDouble -> CDouble -> CDouble
gammaPInv :: Double -> Double -> Double -> Double
gammaPInv = liftDouble3 gsl_cdf_gamma_Pinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_gamma_Pinv :: CDouble -> CDouble -> CDouble -> CDouble
gammaQInv :: Double -> Double -> Double -> Double
gammaQInv = liftDouble3 gsl_cdf_gamma_Qinv
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_cdf_gamma_Qinv :: CDouble -> CDouble -> CDouble -> CDouble
dirichletPdf :: VS.Vector Double
-> VS.Vector Double
-> Double
dirichletPdf = dirichletPdfHelper gsl_ran_dirichlet_pdf
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_dirichlet_pdf :: CSize -> Ptr Double -> Ptr Double -> CDouble
dirichletLnPdf :: VS.Vector Double
-> VS.Vector Double
-> Double
dirichletLnPdf = dirichletPdfHelper gsl_ran_dirichlet_lnpdf
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_dirichlet_lnpdf :: CSize -> Ptr Double -> Ptr Double -> CDouble
dirichletPdfHelper :: (CSize -> Ptr Double -> Ptr Double -> CDouble)
-> VS.Vector Double -> VS.Vector Double -> Double
dirichletPdfHelper f xs alphas
| len /= len2 = error "dirichletPdf*: different lengths"
| otherwise = unsafePerformIO $
VS.unsafeWith xs $ \xs_ptr ->
VS.unsafeWith alphas $ \alphas_ptr ->
return $ realToFrac $ f lenS alphas_ptr xs_ptr
where
len = VS.length xs
len2 = VS.length alphas
lenS = fromIntegral len
getDirichlet :: RNG -> VS.Vector Double -> IO (VS.Vector Double)
getDirichlet (MkRNG rng_fptr) alphas =
withForeignPtr rng_fptr $ \rng_ptr ->
VS.unsafeWith alphas $ \alphas_ptr -> do
let len = VS.length alphas
ret_fptr <- mallocForeignPtrArray len
withForeignPtr ret_fptr $ \ret_ptr ->
gsl_ran_dirichlet rng_ptr (fromIntegral len) alphas_ptr ret_ptr
return (VS.unsafeFromForeignPtr ret_fptr 0 len)
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_dirichlet :: Ptr () -> CSize -> Ptr Double -> Ptr Double -> IO ()
liftDouble :: (CDouble -> CDouble)
-> Double -> Double
liftDouble f x =
realToFrac $ f (realToFrac x)
liftDouble2 :: (CDouble -> CDouble -> CDouble)
-> Double -> Double -> Double
liftDouble2 f x y =
realToFrac $ f (realToFrac x) (realToFrac y)
liftDouble3 :: (CDouble -> CDouble -> CDouble -> CDouble)
-> Double -> Double -> Double -> Double
liftDouble3 f x y z =
realToFrac $ f (realToFrac x) (realToFrac y) (realToFrac z)
liftRan0 :: (Ptr () -> IO CDouble) -> RNG -> IO Double
liftRan0 ran_fn (MkRNG fptr) =
withForeignPtr fptr $ \ptr ->
realToFrac <$> ran_fn ptr
liftRan1 :: (Ptr () -> CDouble -> IO CDouble)
-> RNG -> Double -> IO Double
liftRan1 ran_fn (MkRNG fptr) p =
withForeignPtr fptr $ \ptr ->
realToFrac <$> ran_fn ptr (realToFrac p)
liftRan2 :: (Ptr () -> CDouble -> CDouble -> IO CDouble)
-> RNG -> Double -> Double -> IO Double
liftRan2 ran_fn (MkRNG fptr) p q =
withForeignPtr fptr $ \ptr ->
realToFrac <$> ran_fn ptr (realToFrac p) (realToFrac q)
liftRan3 :: (Ptr () -> CDouble -> CDouble -> CDouble -> IO CDouble)
-> RNG -> Double -> Double -> Double -> IO Double
liftRan3 ran_fn (MkRNG fptr) p q r =
withForeignPtr fptr $ \ptr ->
realToFrac <$> ran_fn ptr (realToFrac p) (realToFrac q) (realToFrac r)