Raw File
hmmSampleWithFactor.wppl
var transition = function(s) {
  return s ? flip(0.7) : flip(0.3)
}

var observe = cache(function(s) {
  Enumerate(function() {return s ? flip(0.9) : flip(0.1)})
})

var trueObs = [false, false, false]

var hmmRecur = function(n, states, observations) {
  var newState = transition(states[states.length - 1])
  var newObs = sampleWithFactor(observe(newState), [],
                                function(v) {return v == trueObs[observations.length] ? 0 : -Infinity})
  var newStates = states.concat([newState])
  var newObservations = observations.concat([newObs])
  return ((n == 1) ?
          {states: newStates, observations: newObservations} :
          hmmRecur(n - 1, newStates, newObservations));
}

var hmm = function(n) {
  return hmmRecur(n, [true], [])
}

Enumerate(function() {
  var r = hmm(3)
  return r.states
}, 500)
back to top