//---------------------------------------------------------------------- // for use by fast_draw. logposterior = log(p0 * p1), where p0 is // the prior times a fraction alpha_ of the likelihood. The // likelihood assumes that n_ and the cholesky factor of sumsq_ have // been precomputed. double SepStratSampler::logp0(const Spd & Sigma, double alpha)const{ Chol L(Sigma); if(!L.is_pos_def()) return BOOM::negative_infinity(); double ans = logprior(Sigma); if(ans == BOOM::negative_infinity()) return ans; ans += -.5 * (n_ * alpha * L.logdet() + L.solve(sqrt(alpha) * sumsq_upper_chol_.t()).sumsq()); return ans; }
//---------------------------------------------------------------------- // log of the prior distribution at the model's current value of Sigma double SepStratSampler::logpri()const{ return logprior(mod_->Sigma()); }
T_ensemble_list ptsample_pl(T_prior&& logprior, T_likelihood&& loglikelihood, const T_ensemble_list& ensemble_list, T_rng&& rng, const T_beta_list& beta_list, bool perform_swap, size_t nthread_allowed=1, typename std::result_of<T_prior(typename element_type_trait<typename element_type_trait<T_ensemble_list>::element_type>::element_type)>::type a=2) { using T=typename std::result_of<T_prior(typename element_type_trait<typename element_type_trait<T_ensemble_list>::element_type>::element_type)>::type; using T_var=typename element_type_trait<typename element_type_trait<T_ensemble_list>::element_type>::element_type; auto new_ensemble_list=clone(ensemble_list); size_t ntemp=get_size(ensemble_list); size_t nwalker=get_size(get_element(ensemble_list,0)); if(perform_swap) { /* for(size_t i=0;i<ntemp;++i) { shuffle(get_element(new_ensemble_list,i),rng); } */ for(size_t i=0;i<ntemp-1;++i) { T beta1=beta_list[i]; T beta2=beta_list[i+1]; if(beta1==beta2) { mcmc_exception e("beta list should not contain duplicated elements"); throw e; } for(size_t j=0;j<nwalker;++j) { auto var1=as<T_var>(get_element(get_element(new_ensemble_list,i),j)); auto var2=as<T_var>(get_element(get_element(new_ensemble_list,i+1),j)); T ep=exchange_prob([&logprior,&loglikelihood](const T_var& x){return logprior(x)+loglikelihood(x);},var1,var2,beta1,beta2); if(urng<T>(rng)<ep) { auto temp=clone<T_var>(get_element(get_element(new_ensemble_list,i),j)); set_element(get_element(new_ensemble_list,i),j, get_element(get_element(new_ensemble_list,i+1),j)); set_element(get_element(new_ensemble_list,i+1),j,temp); } } } } for(size_t i=0;i<ntemp;++i) { T beta=get_element(beta_list,i); set_element(new_ensemble_list,i,ensemble_sample([&logprior,&loglikelihood,beta](const T_var& x){ T lp=logprior(x); T ll=loglikelihood(x); if(std::isinf(lp)||std::isinf(ll)) { return lp; } return lp+ll*beta; },get_element(new_ensemble_list,i),rng,nthread_allowed,a)); } return new_ensemble_list; }