31 #ifndef __TASMANIAN_ADDONS_MPISAMPLEDREAM_HPP
32 #define __TASMANIAN_ADDONS_MPISAMPLEDREAM_HPP
45 #include "tsgMPIConstructGrid.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){
147 x.resize(Utils::size_mult(num_dimensions, num_candidates));
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);
156 x.resize(Utils::size_mult(num_dimensions, num_batch) + 1);
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
Encapsulates the Tasmanian DREAM module.
Definition: TasmanianDREAM.hpp:80
Encapsulates the Tasmanian Sparse Grid module.
Definition: TasmanianSparseGrid.hpp:68