31 #ifndef __TASMANIAN_ADDONS_MPISAMPLEDREAM_HPP 
   32 #define __TASMANIAN_ADDONS_MPISAMPLEDREAM_HPP 
   54 #ifdef Tasmanian_ENABLE_MPI 
  111 template<TypeSamplingForm form = regform>
 
  136                          int num_inputs, 
int num_chains, 
int mpi_root, MPI_Comm communicator)
 
  137     : model(distributed_model), likely(likelihood), dist_prior(prior),
 
  138       num_dimensions(num_inputs), num_batch(num_chains), root(mpi_root), me(
TasGrid::
getMPIRank(communicator)), comm(communicator),
 
  139       x(Utils::
size_mult(num_dimensions, num_batch) + 1), y((size_t) num_batch){
 
  142               int num_candidates = 1;
 
  144                 MPI_Bcast(x.data(), num_dimensions*num_batch+1, MPI_DOUBLE, root, comm);
 
  145                 num_candidates = (int) x.back(); 
 
  146                 if (num_candidates > 0){ 
 
  148                     y.resize((
size_t) num_candidates);
 
  150                     std::vector<double> model_outs;
 
  151                     model(x, model_outs);
 
  152                     likelihood(form, model_outs, y);
 
  154                     MPI_Reduce(y.data(), 
nullptr, num_candidates, MPI_DOUBLE, ((form == 
regform) ? MPI_PROD : MPI_SUM), root, comm);
 
  158               }
while(num_candidates > 0);
 
  167         if ((me == root) && (!x.empty())){ 
 
  169             MPI_Bcast(x.data(), num_dimensions*num_batch+1, MPI_DOUBLE, root, comm);
 
  176             return [&](
const std::vector<double> &candidates, std::vector<double> &values)->
void{
 
  177                 std::copy_n(candidates.begin(), candidates.size(), x.begin());
 
  178                 int num_candidates = (int) candidates.size() / num_dimensions;
 
  179                 x.back() = (double) num_candidates;
 
  180                 MPI_Bcast(x.data(), num_dimensions*num_batch+1, MPI_DOUBLE, root, comm);
 
  182                 y.resize((
size_t) num_candidates);
 
  183                 std::vector<double> model_outs;
 
  184                 model(candidates, model_outs);
 
  185                 likely(form, model_outs, y);
 
  187                 MPI_Reduce(y.data(), values.data(), num_candidates, MPI_DOUBLE, ((form == 
regform) ? MPI_PROD : MPI_SUM), root, comm);
 
  189                 std::vector<double> prior_vals(values.size());
 
  190                 dist_prior(form, candidates, prior_vals);
 
  192                 auto iv = values.begin();
 
  194                     for(
auto p : prior_vals) *iv++ *= p;
 
  196                     for(
auto p : prior_vals) *iv++ += p;
 
  200             return [](
const std::vector<double> &, std::vector<double> &)->
void{};
 
  205     std::function<void(std::vector<double> 
const &x, std::vector<double> &y)> model;
 
  206     std::function<void(
TypeSamplingForm, 
const std::vector<double> &model_outputs, std::vector<double> &likely)> likely;
 
  207     std::function<void(
TypeSamplingForm, 
const std::vector<double> &candidates, std::vector<double> &values)> dist_prior;
 
  208     int num_dimensions, num_batch, root, me;
 
  210     std::vector<double> x, y;
 
Class that enables distributed DREAM sampling with MPI.
Definition: tsgMPISampleDream.hpp:112
DistributedPosterior(DreamModel distributed_model, DreamLikelihood likelihood, DreamPrior prior, int num_inputs, int num_chains, int mpi_root, MPI_Comm communicator)
Constructor that sets the parameters for the distribued posterior.
Definition: tsgMPISampleDream.hpp:133
void clear()
Unblocks the non-root ranks, the object cannot be used after this calls (can be destroyed only).
Definition: tsgMPISampleDream.hpp:166
~DistributedPosterior()
Destructor, unblocks the non-root ranks (if still blocked).
Definition: tsgMPISampleDream.hpp:163
std::function< void(const std::vector< double > &candidates, std::vector< double > &outputs)> DreamModel
Generic model signature used by Tasmanian.
Definition: tsgDreamSample.hpp:157
std::function< void(const std::vector< double > &candidates, std::vector< double > &values)> DreamPDF
Generic probability distribution used by Tasmanian.
Definition: tsgDreamSample.hpp:142
std::function< void(TypeSamplingForm form, const std::vector< double > &model_outputs, std::vector< double > &likely)> DreamLikelihood
Generic likelihood signature used by Tasmanian.
Definition: tsgDreamSample.hpp:175
std::function< void(TypeSamplingForm form, const std::vector< double > &candidates, std::vector< double > &values)> DreamPrior
Generic signature for the prior distributions used by Tasmanian.
Definition: tsgDreamSample.hpp:187
int getMPIRank(MPI_Comm comm)
Utility to return the rank within the given comm.
Definition: tsgMPIScatterGrid.hpp:87
size_t size_mult(IntA a, IntB b)
Converts two integer-like variables to size_t and returns the product..
Definition: tsgUtils.hpp:82
Encapsulates the Tasmanian DREAM module.
Definition: TasmanianDREAM.hpp:80
Encapsulates the Tasmanian Sparse Grid module.
Definition: TasmanianSparseGrid.hpp:68
Sparse Grids construction through sampling and MPI.