0 | module Statistics.Distribution.Normal
 1 |
 2 | import Statistics.Distribution.GSL
 3 | import System.FFI
 4 |
 5 | ||| Sample from Normal distribution
 6 | %foreign "C:gsl_ran_gaussian,libgsl"
 7 | gsl_normal_c : (seed : AnyPtr) -> (std : Double) -> PrimIO Double
 8 |
 9 | export
10 | gsl_normal : (mu : Double) -> (std : Double) -> GslRng -> IO Double
11 | gsl_normal mu std (MkGslRng seed) = primIO (gsl_normal_c seed std) >>= pure . (+ mu)
12 |
13 | ||| Compute PDF from Normal distribution
14 | %foreign "C:gsl_ran_gaussian_pdf,libgsl"
15 | gsl_normal_pdf_c : (obs_around_zero : Double) -> (std : Double) -> Double 
16 |
17 | export
18 | gsl_normal_pdf : (mu : Double) -> (std : Double) -> (obs : Double) -> Double
19 | gsl_normal_pdf mu std y = gsl_normal_pdf_c (y - mu) std
20 |
21 | ||| Sample from Normal distribution using inverse CDF. It must hold that '0 < r < 1'.
22 | %foreign "C:gsl_cdf_gaussian_Pinv,libgsl"
23 | gsl_normal_cdf_inv_c : (r : Double) -> (std : Double) -> Double
24 |
25 | export
26 | gsl_normal_cdf_inv : (mu : Double) -> (std : Double) -> (r : Double) -> Double
27 | gsl_normal_cdf_inv mu std r = mu + gsl_normal_cdf_inv_c r std