На высоком уровне, в Passage есть две важные монады, о которых нужно помнить: BayesianNetwork
и BayesianSimulator
.
Сначала вы строите модель в монаде BayesianNetwork:
myModel :: Int -> BayesianNetwork (Node, Node, [Node])
myModel n = do
mu <- normal 0 0.001
tau <- improperScale
xs <- replicateM n $ normal mu tau
return (mu, tau, xs)
Это указывается как генеративная модель, поэтому все, что не является случайным (здесь число точек данных n
), должно быть передано в качестве параметра. В качестве альтернативы, мы могли бы поставить дистрибутив на n
.
Далее мы строим симулятор, который вызывает модель:
mySim :: [Double] -> BayesianSimulator ()
mySim xs0 = do
setThreadNum 4
let n = length xs0
(mu, tau, xs) <- model $ myModel n
forM (zip xs xs0) $ \(x, x0) -> observe x x0
monitor mu
monitor tau
Наконец, возьмем некоторые данные:
xs0 = [1, -1, 2, 2, 2, -2]
и запустить симлуатор:
main = genSimulator "myExample" (mySim xs0)
Это создает новый каталог myExample
с кодом OpenMP для сэмплера.