GibbsRwMcmc <- function(N, x0, cmprsk,varmat, Xid=0, cfv=1,...){
  x1mat <- matrix(nrow=N+1, ncol=cmprsk$np)
  x1mat[1,] <- x0
  if(length(cfv)==1L){
    cfv <- rep(cfv, length(x0))
  } 
  if(Xid==0L){
    paraid <- 1:length(x0)
  } 
  if(Xid==1L){
    paraid <- 1:cmprsk$npv[Xid]
  }
  if(Xid > 1L){
    paraid <- 1:cmprsk$npv[Xid]+sum(cmprsk$npv[1:(Xid-1)])
  }
  acp <- rep(0, cmprsk$np)
  for(j in 2:(N+1)){
    # print(j)
    x0 <- x1mat[j-1,]
    for(i in paraid){
      cf <- cfv[i]
      xstar <- x0
      vi <- varmat[i,i]
      phy0 <- pnorm(-x1mat[1,i], mean=0, sd=cf*sqrt(vi)) 
      rtnorm <- qnorm(phy0 + runif(1)*(1-phy0), mean = 0, sd=cf*sqrt(vi))
      xstar[i] <- x1mat[1,i] + rtnorm 
      y1 <- JointPosteriorf(para.vec = xstar, cmprsk = cmprsk, ...) +
        dnorm(x0[i],xstar[i], sd=cf*sqrt(vi), log = TRUE) 
      y0 <- JointPosteriorf(para.vec = x0, cmprsk = cmprsk, ...) +
        dnorm(xstar[i],x0[i], sd=cf*sqrt(vi), log = TRUE) 
      
      u <- runif(1)
      ulog <- log(u)
      if(ulog < (y1-y0)){
        x0[i] <- xstar[i]
        acp[i] <- acp[i] + 1
      } else{
        x0 <- x0
      }
    }
    x1mat[j, ] <- x0
  }
  # acp/N
  x1mat <- x1mat[-1,]
  list(mcmc=x1mat[,paraid], acp=acp[paraid]/N)
}
