我正在编写人口MCMC的代码。我会尝试提供尽可能多的信息,我认为可以提供帮助,所以请耐心等待。
我正在使用冥想分布,我想进行交换动作,即建议交换两个链的值的动作。
我最初是通过
写的让每个链变异指定的迭代次数n。
在每第n次迭代中,我都会发送奴隶'结果给主人,并尝试在链之间交换参数。
然后将更新的值发送回从属设备并重复此过程。
这工作正常,但我想清理我的代码并删除主服务器和从服务器之间不必要的通信。也就是说,让奴隶直接在他们之间进行交流。
假设我正在产生10个奴隶,
依此类推,让我让样品穿过温度梯。
这就是我遇到问题的地方 我想我正在设法从一个奴隶发送一个值到另一个(我的打印声明"成功发送"被打印在发送的奴隶的日志文件中)但这似乎不是收到(我的"成功收到"声明不会打印在伙伴奴隶的日志中)。
程序刚刚挂起。我想也许我已经造成了僵局,但我不确定我做错了什么?
你能告诉我吗?我用这个Parallel Tempering R代码作为指导 http://www.lindonslog.com/mathematics/parallel-tempering-r-rmpi/请参阅下面的代码
非常感谢!
索菲亚
ind <- mpi.comm.rank()
oddFlag<-0 ### object to flag code suitable for odd/even numbered slaves.
for (i in 1:TotalIter) {
##### normal MCMC move (single chain mutation) - logL.current
if ( i%%exchangeInterval == 0 ){ ### every nth (right now 5th) iteration, attempt an exchange
message("\n\nAttempt an exchange move")
oddFlag<-oddFlag+1
exchange<-0
logL.partner<-0
if (ind%%2 == oddFlag%%2) { ###when oddFlag even , the following code concerns even-numbered slaves. When odd number, it concerns odd-numbered slaves.
ind.partner<-ind+1
if (0<ind.partner && ind.partner<(noChains+1)){
message("This is the slave: ", ind, " and its partner is: ", ind.partner)
message("The tag for receiving logL.partner is: ", ind.partner)
logL.partner<-mpi.recv.Robj(source=ind.partner,tag=ind.partner) #### receive the logL of partner
message("Succesfully received")
message("This is the logL.partner: ", logL.partner)
exchanges.attempted<-exchanges.attempted+1
if (runif(1)< min(1, exp((logL.partner - estimatorSelf)*(temper[ind] - temper[ind.partner] )))) { ############# exp((chain2 - chain1)*(T1 - T2))
message("I exchanged the values")
exchange<-1
print(exchange)
exchanges.accepted<-exchanges.accepted+1
}
mpi.send.Robj(obj=exchange,dest=ind.partner,tag=15*ind)
}
if (exchange==1){
### exchange parameters with mpi.send.Robj/mpi.recv.Robj functions
}
} else { ##### ###when oddFlag even , the following code concerns odd-numbered slaves. For oddFlag odd, it concerns even-numbered slaves.
ind.partner<-ind-1
if (0<ind.partner && ind.partner<(noChains+1)){
message("This is the slave: ", ind, " and its partner is: ", ind.partner)
message("The tag for sending logL.current is: ", ind)
mpi.send.Robj(obj=logL.current,dest=ind.partner,tag=ind) ### send logL to partner
message("Succesfully sent")
exchange<-mpi.recv.Robj(source=ind.partner, tag=15*ind.partner)
message("I received the exchange message")
}
if (exchange==1){
### exchange parameters send/receive functions
}
}
}
}
答案 0 :(得分:0)
您可能尝试的一件事是使用receive命令而不是使用ind.partner,您可以使用mpi.any.source()(我认为是正确的),它将接受任何标记的消息。如果这可以解决你的僵局,那么标签可能会出现问题(但是通过眼睛看来我似乎没有任何问题)。
您可能尝试的另一件事是删除接收命令中的“source =”和“tag =”。我在我的代码中注意到,当我执行send命令时,我没有任何内容。也许这让我有太多问题,但我不记得了。让我知道它是怎么回事,我希望一切顺利。