0 | module Statistics.Probability
2 | import public Data.Double.Bounded
5 | import Data.Fin.Properties
13 | data Probability : Type where
14 | P : DoubleBetween 0 1 -> Probability
18 | public export %inline
19 | fromDouble : (x : Double) -> (0 _ : So $
0 <= x && x <= 1) => Probability
20 | fromDouble x @{bds} = P $
fromDouble x @{fst $
soAnd bds} @{snd $
soAnd bds}
22 | public export %inline
23 | fromInteger : (n : Integer) -> (0 _ : Either (n = 0) (n = 1)) => Probability
24 | fromInteger n = fromDouble (cast n) @{believe_me Oh}
28 | public export %inline
29 | Cast Probability Double where
30 | cast $
P x = x.asDouble
32 | public export %inline
33 | Cast Probability (DoubleBetween 0 1) where
36 | public export %inline
37 | Cast (DoubleBetween 0 1) Probability where
40 | public export %inline
41 | (.asDouble) : Probability -> Double
44 | public export %inline
45 | (.value) : Probability -> DoubleBetween 0 1
49 | maybeP : Double -> Maybe Probability
50 | maybeP = map P . maybeBoundedDouble
52 | namespace FromDoubles
55 | (/) : (num, den : Double) -> (0 _ : So $
1 < num && num <= den) => Probability
56 | num / den = fromDouble (num / den) @{believe_me Oh}
59 | ratio : (num, den : Nat) -> (0 _ : num `LTE` den) => (0 _ : IsSucc den) => Probability
60 | ratio num den = (cast num / cast den) @{believe_me Oh}
63 | successesRatio : {den : Nat} -> (num : Fin $
S den) -> (0 _ : IsSucc den) => Probability
64 | successesRatio num = do
65 | let LTESucc _ = elemSmallerThanBound num
66 | ratio (finToNat num) den
69 | (.percent) : DoubleBetween 0 100 -> Probability
70 | x.percent = P $
x / 100
75 | (*) : Probability -> Probability -> Probability
76 | P x * P y = P $
x * y
79 | Semigroup Probability where
83 | Monoid Probability where
87 | (/) : Probability -> DoubleBetween 1 (1/0) -> Probability
90 | public export %inline
91 | inv : Probability -> Probability
92 | inv $
P x = P $
1 - x
94 | public export %inline
95 | (.inv) : Probability -> Probability
100 | public export %inline
101 | Eq Probability where
102 | P x == P y = x == y
104 | public export %inline
105 | Ord Probability where
106 | compare (P x) (P y) = compare x y
111 | Show Probability where
112 | show $
P x = show x