Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /MLRISC/releases/release-110.84/library/probability.sml
ViewVC logotype

Annotation of /MLRISC/releases/release-110.84/library/probability.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 411 - (view) (download)
Original Path: sml/branches/SMLNJ/src/MLRISC/library/probability.sml

1 : monnier 411 (*
2 :     * Probability datatype (what the hell is this?)
3 :     *
4 :     * -- Allen
5 :     *)
6 :    
7 : monnier 245 signature PROBABILITY =
8 :     sig
9 :     eqtype prob
10 :    
11 :     val prob : int * int -> prob
12 :     val zero : prob
13 :     val one : prob
14 :     val < : prob * prob -> bool
15 :     val > : prob * prob -> bool
16 :     val >= : prob * prob -> bool
17 :     val <= : prob * prob -> bool
18 :     val != : prob * prob -> bool
19 :     val == : prob * prob -> bool
20 :     val compare : prob * prob -> order
21 :     val avg : (prob * int) list -> int
22 :     val avg_prob : (prob * prob) list -> prob
23 :     val + : prob * prob -> prob
24 :     val - : prob * prob -> prob
25 :     val * : prob * real -> prob
26 :     val / : prob * real -> prob
27 :     val toString : prob -> string
28 :     val toReal : prob -> real
29 :     val fromReal : real -> prob
30 :     end
31 :    
32 :     structure Probability :> PROBABILITY =
33 :     struct
34 :    
35 :     structure W = Word
36 :    
37 :     type prob = W.word
38 :    
39 :     val word = W.fromInt
40 :    
41 :     val << = W.<<
42 :     val >> = W.>>
43 :     val op + = W.+
44 :     val op - = W.-
45 :    
46 :     infix << >>
47 :    
48 :     val shift = 0w16
49 :     val shift2 = 0w8
50 :     val one = 0w1 << shift
51 :     val half = one >> 0w1
52 :     val half' = (0w1 << shift2) >> 0w1
53 :     val realOne = Real.fromInt(Word.toInt one)
54 :     val zero = 0w0
55 :     val op < = W.<
56 :     val op > = W.>
57 :     val op >= = W.>=
58 :     val op <= = W.<=
59 :     val != = fn (i:word,j:word) => i <> j
60 :     val == = fn (i:word,j:word) => i = j
61 :     val compare = W.compare
62 :    
63 :     fun prob (x,y) =
64 :     let val h = word y
65 :     in W.div((word x << shift) + (h >> 0w1),h) end
66 :     fun fromReal r = Word.fromInt(Real.round(r * realOne))
67 :     fun toReal p = Real.fromInt(Word.toInt p) / realOne
68 :     fun toString p = Real.toString(Real.fromInt(
69 :     Real.round(toReal p * 100.0))/100.0)
70 :    
71 :     fun p * r = fromReal(Real.*(toReal p, r))
72 :     fun p / r = fromReal(Real./(toReal p, r))
73 :    
74 :     fun avg [] = 0
75 :     | avg l =
76 :     let fun f([],s,n) = (s,n)
77 :     | f((p,i)::l,s,n) = f(l,W.*(p,word i) + s,n+0w1)
78 :     val (sum,n) = f(l,zero,0w0)
79 :     in Word.toInt(W.div(sum,n))
80 :     end
81 :    
82 :     fun avg_prob [] = zero
83 :     | avg_prob l =
84 :     let fun f([],s,n) = (s,n)
85 :     | f((p,i)::l,s,n) = f(l,W.*((p+half')>>shift2,(i+half')>>shift2) + s,
86 :     n+0w1)
87 :     val (sum,n) = f(l,zero,0w0)
88 :     in W.div(sum,n)
89 :     end
90 :    
91 :    
92 :     end
93 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0