forked from probmods/webppl
-
Notifications
You must be signed in to change notification settings - Fork 1
/
hmm.wppl
29 lines (24 loc) · 745 Bytes
/
hmm.wppl
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
var transition = function(s) {
return s ? flip(0.7) : flip(0.3)
}
var observe = function(s) {
return s ? flip(0.9) : flip(0.1)
}
var hmm = function(n) {
var prev = (n == 1) ? {states: [true], observations: []} : hmm(n - 1);
var newState = transition(prev.states[prev.states.length - 1]);
var newObs = observe(newState);
return {
states: prev.states.concat([newState]),
observations: prev.observations.concat([newObs])
};
}
var trueObservations = [false, false, false];
var arrayEq = function(a, b) {
return (a.length == 0) ? true : (a[0] == b[0] && arrayEq(a.slice(1), b.slice(1)))
}
Enumerate(function() {
var r = hmm(3);
factor(arrayEq(r.observations, trueObservations) ? 0 : -Infinity);
return r.states;
})