我正在为人口 MCMC 编写代码。我会尽量提供我认为有帮助的信息,所以请多多包涵。
我正在使用缓和分布,我想执行交换动作,即提议交换两条链的价值的动作。
我做了什么(交换发生在主人身上)
我最初是由
让每条链在指定的迭代次数 n 内发生变异。
在每第 n 次迭代中,我会将从站的结果发送给主站,并尝试在链之间交换参数。
然后将更新的值发送回从站并重复该过程。
我要达到的目的(从机之间直接交换)
这工作正常,但我想清理我的代码并删除 master 和 slave 之间不必要的通信。也就是让slave之间直接通信。
所以假设我要生成 10 个奴隶,
- 在迭代 n 时,我想让 slave1-slave2、slave3-slave4、....、slave9-slave10 在它们之间进行通信
- 在迭代 2*n 时,我想让 slave2-slave3、slave4-slave5、...slave8-slave9 在它们之间进行通信
等等,这样我就让样品通过温度阶梯。
问题
这就是我面临的问题。
我想我正在设法将一个值从一个奴隶发送到另一个(我的打印语句“成功发送”被打印在正在发送的奴隶的日志文件中)但这似乎没有被接收到(我的“成功接收”语句不会打印在伙伴从属设备的日志中)。
程序只是挂起。我想也许我造成了僵局,但我不确定我做错了什么?
您能否提一些建议?我已将此 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
}
}
}
}