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
) where
import Control.Monad
import Foreign.C.Types ( CUInt, CDouble )
import Foreign.ForeignPtr ( withForeignPtr )
import Foreign.Ptr ( Ptr )
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 = getGaussianHelp gsl_ran_gaussian
getGaussianZiggurat :: RNG -> Double -> IO Double
getGaussianZiggurat = getGaussianHelp gsl_ran_gaussian_ziggurat
getGaussianRatioMethod:: RNG -> Double -> IO Double
getGaussianRatioMethod = getGaussianHelp gsl_ran_gaussian_ratio_method
getGaussianHelp :: (Ptr () -> CDouble -> IO CDouble)
-> RNG -> Double -> IO Double
getGaussianHelp ran_gaussian (MkRNG fptr) sigma =
let sigma' = realToFrac sigma
in withForeignPtr fptr $ \ptr -> do
x <- ran_gaussian ptr sigma'
return $ realToFrac x
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_gaussian :: Ptr () -> CDouble -> IO CDouble
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_gaussian_ziggurat :: Ptr () -> CDouble -> IO CDouble
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 = getUGaussianHelp gsl_ran_ugaussian
getUGaussianRatioMethod:: RNG -> IO Double
getUGaussianRatioMethod = getUGaussianHelp gsl_ran_ugaussian_ratio_method
getUGaussianHelp :: (Ptr () -> IO CDouble)
-> RNG -> IO Double
getUGaussianHelp ran_ugaussian (MkRNG fptr) =
withForeignPtr fptr $ \ptr -> do
x <- ran_ugaussian ptr
return $ realToFrac x
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_ugaussian :: Ptr () -> IO CDouble
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_ugaussian_ratio_method :: Ptr () -> IO CDouble
getExponential :: RNG -> Double -> IO Double
getExponential (MkRNG f) mu = withForeignPtr f $ \p ->
liftM realToFrac $ gsl_ran_exponential p (realToFrac mu)
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
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 (MkRNG fptr) a b =
let a' = realToFrac a
b' = realToFrac b
in withForeignPtr fptr $ \ptr -> do
x <- gsl_ran_flat ptr a' b'
return $ realToFrac x
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_flat :: Ptr () -> CDouble -> CDouble -> IO CDouble
getLevy :: RNG -> Double -> Double -> IO (Double)
getLevy (MkRNG f) c alpha =
withForeignPtr f $ \p ->
realToFrac `fmap` gsl_ran_levy p (realToFrac c) (realToFrac alpha)
foreign import ccall unsafe "gsl/gsl_randist.h"
gsl_ran_levy :: Ptr () -> CDouble -> CDouble -> IO CDouble
getLevySkew :: RNG -> Double -> Double -> Double -> IO (Double)
getLevySkew (MkRNG f) c alpha beta =
withForeignPtr f $ \p ->
realToFrac `fmap` gsl_ran_levy_skew p (realToFrac c) (realToFrac alpha) (realToFrac beta)
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 (MkRNG f) a = withForeignPtr f $ \p ->
liftM realToFrac $ gsl_ran_cauchy p (realToFrac a)
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
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)