是否有人使用了Passage,PArallel SAmpler GEnerator?
对我来说可能是非常有用的,但我发现的唯一文档是Github上的三行README(https://github.com/cscherrer/passage),以及Hackage上的简洁API。
如何运行它的一个简单示例将是很棒的!
答案 0 :(得分:2)
在较高的层面上,Passage有两个重要的monad:BayesianNetwork
和BayesianSimulator
。
首先,您在BayesianNetwork monad中构建模型:
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]
并运行simluator:
main = genSimulator "myExample" (mySim xs0)
这将为采样器创建一个带有OpenMP代码的新目录myExample
。