File: Binomial.hs

package info (click to toggle)
bali-phy 4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 15,392 kB
  • sloc: cpp: 120,442; xml: 13,966; haskell: 9,975; python: 2,936; yacc: 1,328; perl: 1,169; lex: 912; sh: 343; makefile: 26
file content (49 lines) | stat: -rw-r--r-- 1,463 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
module Probability.Distribution.Binomial where

import Probability.Random
import MCMC

foreign import bpcall "Distribution:" binomial_density :: Int -> Double -> Int -> LogDouble
foreign import bpcall "Distribution:" sample_binomial :: Int -> Double -> IO Int

data Binomial = Binomial Int Prob

instance Dist Binomial where
    type Result Binomial = Int
    dist_name _ = "binomial"

instance IOSampleable Binomial where
    sampleIO (Binomial n p) = sample_binomial n (toFloating p)

instance HasPdf Binomial where
    pdf (Binomial n p) x = binomial_density n (toFloating p) x

instance Dist1D Binomial where
    cdf (Binomial n p) x  = undefined
    lower_bound (Binomial n p) = Just 0
    upper_bound (Binomial n p) = Just n

instance MaybeMean Binomial where
    maybeMean (Binomial n p) = Just $ fromIntegral n * (toFloating p)

instance Mean Binomial

instance MaybeVariance Binomial where
    maybeVariance (Binomial n p) = Just $ toFloating $ fromIntegral n * p * (1-p)

instance Variance Binomial

instance HasAnnotatedPdf Binomial where
    annotated_densities dist = make_densities $ pdf dist

instance Sampleable Binomial where
    sample dist@(Binomial n _) = RanDistribution2 dist (binomial_effect n)

binomial :: Int -> Double -> Binomial
binomial n p = Binomial n (toFloating p)

binomial_bounds n = integer_between 0 n

binomial_effect n x = do
  add_move $ sliceSampleInteger x (binomial_bounds n)
  add_move $ incDecMH x (binomial_bounds n)