Ejemplo n.º 1
0
  //----------------------------------------------------------------------
  // 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;
  }
Ejemplo n.º 2
0
 //----------------------------------------------------------------------
 // log of the prior distribution at the model's current value of Sigma
 double SepStratSampler::logpri()const{
   return logprior(mod_->Sigma());
 }
Ejemplo n.º 3
0
  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;
  }