24 #include <queso/Defines.h>
26 #ifdef QUESO_HAVE_HDF5
30 #include <boost/math/constants/constants.hpp>
33 #include <queso/Miscellaneous.h>
34 #include <queso/InfiniteDimensionalMeasureBase.h>
36 #include <queso/InfiniteDimensionalLikelihoodBase.h>
37 #include <queso/InfiniteDimensionalMCMCSampler.h>
38 #include <queso/InfiniteDimensionalMCMCSamplerOptions.h>
42 InfiniteDimensionalMCMCSampler::InfiniteDimensionalMCMCSampler(
43 const BaseEnvironment& env,
44 InfiniteDimensionalMeasureBase & prior,
45 InfiniteDimensionalLikelihoodBase & llhd,
46 InfiniteDimensionalMCMCSamplerOptions * ov)
50 current_physical_state(prior.draw()),
51 proposed_physical_state(prior.draw()),
52 current_physical_mean(prior.draw()),
53 current_physical_var(prior.draw()),
61 #ifdef QUESO_MEMORY_DEBUGGING
62 std::cout <<
"Entering InfiniteDimensionalMCMCSampler class" << std::endl;
64 if (m_env.subDisplayFile()) {
65 *m_env.subDisplayFile() <<
"Entering InfiniteDimensionalMCMCSampler::constructor()"
66 <<
": prefix = " << this->m_ov->m_prefix
67 <<
", m_env.optionsInputFileName() = " << this->m_env.optionsInputFileName()
71 if (m_env.optionsInputFileName() !=
"") {
72 this->m_ov->scanOptionsValues();
75 #ifdef QUESO_MEMORY_DEBUGGING
76 std::cout <<
"In InfiniteDimensionalMCMCSamplerOptions,"
77 <<
" finished scanning options" << std::endl;
83 if ((this->m_env).subRank() == 0) {
85 (this->m_env).subIdString() +
86 "/test.txt").c_str());
88 (this->m_env).subId(),
89 "Environment::constructor()",
90 "unable to verify output path");
94 if ((this->m_env).subRank() == 0) {
95 this->_outfile = H5Fcreate((this->m_ov->m_dataOutputDirName +
96 (this->m_env).subIdString() +
"/" +
97 this->m_ov->m_dataOutputFileName).c_str(),
98 H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
101 this->_acc_dset = this->_create_scalar_dataset(
"acc");
102 this->_avg_acc_dset = this->_create_scalar_dataset(
"avg_acc");
103 this->_neg_log_llhd_dset = this->_create_scalar_dataset(
"neg_log_llhd");
104 this->_L2_norm_samples_dset = this->_create_scalar_dataset(
"L2_norm_samples");
105 this->_L2_norm_mean_dset = this->_create_scalar_dataset(
"L2_norm_mean");
106 this->_L2_norm_var_dset = this->_create_scalar_dataset(
"L2_norm_var");
109 ((this->m_env).fullComm()).Barrier();
111 this->_iteration = 0;
112 this->_acc_prob = 0.0;
113 this->_avg_acc_prob = 0.0;
116 r = gsl_rng_alloc(gsl_rng_taus2);
121 this->_delta->zero();
123 this->current_physical_mean->zero();
124 this->current_physical_var->zero();
137 this->_llhd_val = this->llhd.evaluate(*(this->current_physical_state));
139 std::cout.setf(std::ios::fixed, std::ios::floatfield);
140 std::cout.precision(15);
143 InfiniteDimensionalMCMCSampler::~InfiniteDimensionalMCMCSampler()
145 if ((this->m_env).subRank() == 0) {
146 H5Dclose(this->_acc_dset);
147 H5Dclose(this->_avg_acc_dset);
148 H5Dclose(this->_neg_log_llhd_dset);
149 H5Dclose(this->_L2_norm_samples_dset);
150 H5Dclose(this->_L2_norm_mean_dset);
151 H5Dclose(this->_L2_norm_var_dset);
152 H5Fclose(this->_outfile);
156 void InfiniteDimensionalMCMCSampler::_propose()
158 const double rwmh_step_sq = (this->m_ov->m_rwmh_step * this->m_ov->m_rwmh_step);
159 const double coeff = std::sqrt(1.0 - rwmh_step_sq);
161 boost::shared_ptr<FunctionBase> p(prior.draw());
163 this->proposed_physical_state->zero();
164 this->proposed_physical_state->add(coeff, *(this->current_physical_state));
165 this->proposed_physical_state->add(this->m_ov->m_rwmh_step, *p);
168 void InfiniteDimensionalMCMCSampler::_metropolis_hastings()
174 double proposed_llhd = this->llhd.evaluate(*(this->proposed_physical_state));
179 double diff = this->_llhd_val - proposed_llhd;
180 double alpha = std::min(1.0, std::exp(diff));
181 double rand = gsl_rng_uniform(this->r);
185 this->current_physical_state.swap(this->proposed_physical_state);
186 this->proposed_physical_state->zero();
187 this->_acc_prob = alpha;
188 this->_llhd_val = proposed_llhd;
192 this->_acc_prob = 0.0;
196 void InfiniteDimensionalMCMCSampler::_update_moments()
200 this->_iteration += 1;
203 this->_delta->zero();
204 this->_delta->add(1.0, *(this->current_physical_state));
205 this->_delta->add(-1.0, *(this->current_physical_mean));
208 this->current_physical_mean->add(1.0 / this->iteration(), *(this->_delta));
211 boost::shared_ptr<FunctionBase> temp_ptr(this->_delta->zero_clone());
214 temp_ptr->pointwise_mult(*(this->_delta), *(this->current_physical_state));
215 this->_M2->add(1.0, *temp_ptr);
216 temp_ptr->pointwise_mult(*(this->_delta), *(this->current_physical_mean));
217 this->_M2->add(-1.0, *temp_ptr);
219 if (this->iteration() > 1) {
220 this->current_physical_var->zero();
221 this->current_physical_var->add(1.0 / (this->iteration() - 1), *(this->_M2));
225 double delta_acc = this->acc_prob() - this->avg_acc_prob();
226 this->_avg_acc_prob += delta_acc / this->iteration();
229 void InfiniteDimensionalMCMCSampler::step()
232 this->_metropolis_hastings();
233 this->_update_moments();
236 if (this->_iteration % this->m_ov->m_save_freq == 0) {
237 this->_write_state();
241 hid_t InfiniteDimensionalMCMCSampler::_create_scalar_dataset(
const std::string & name)
244 if ((this->m_env).subRank() == 0) {
248 hsize_t dims[ndims] = {0};
249 hsize_t maxdims[ndims] = {H5S_UNLIMITED};
251 hid_t file_space = H5Screate_simple(ndims, dims, maxdims);
255 hsize_t chunk_dims[ndims] = {1};
256 hid_t plist = H5Pcreate(H5P_DATASET_CREATE);
258 H5Pset_layout(plist, H5D_CHUNKED);
259 H5Pset_chunk(plist, ndims, chunk_dims);
262 hid_t dset = H5Dcreate(this->_outfile, name.c_str(), H5T_NATIVE_DOUBLE,
263 file_space, H5P_DEFAULT, plist, H5P_DEFAULT);
269 H5Sclose(file_space);
278 void InfiniteDimensionalMCMCSampler::_append_scalar_dataset(hid_t dset,
double data)
281 if ((this->m_env).subRank() == 0) {
285 hsize_t dims[ndims] = { 1 };
286 hid_t mem_space = H5Screate_simple(ndims, dims, NULL);
290 dims[0] = this->_iteration / this->m_ov->m_save_freq;
291 err = H5Dset_extent(dset, dims);
294 hid_t file_space = H5Dget_space(dset);
295 hsize_t start[1] = {(this->_iteration / this->m_ov->m_save_freq) - 1};
296 hsize_t count[1] = {1};
298 err = H5Sselect_hyperslab(file_space, H5S_SELECT_SET, start, NULL, count, NULL);
304 H5Dwrite(dset, H5T_NATIVE_DOUBLE, mem_space, file_space, H5P_DEFAULT, &data);
307 H5Sclose(file_space);
312 void InfiniteDimensionalMCMCSampler::_write_state()
314 this->_append_scalar_dataset(this->_acc_dset, this->acc_prob());
315 this->_append_scalar_dataset(this->_avg_acc_dset, this->avg_acc_prob());
316 this->_append_scalar_dataset(this->_neg_log_llhd_dset, this->_llhd_val);
317 this->_append_scalar_dataset(this->_L2_norm_samples_dset, this->current_physical_state->L2_norm());
318 this->_append_scalar_dataset(this->_L2_norm_mean_dset, this->current_physical_mean->L2_norm());
319 this->_append_scalar_dataset(this->_L2_norm_var_dset, this->current_physical_var->L2_norm());
325 std::stringstream basename;
326 basename << this->m_ov->m_dataOutputDirName;
327 basename << (this->m_env).subIdString();
330 std::ostringstream curr_iter;
331 curr_iter << this->iteration();
333 std::string sample_name(basename.str() +
"sample.e-s.");
334 sample_name += curr_iter.str();
335 this->current_physical_state->save_function(sample_name, this->iteration());
337 std::string mean_name(basename.str() +
"mean.e-s.");
338 mean_name += curr_iter.str();
339 this->current_physical_mean->save_function(mean_name, this->iteration());
341 std::string var_name(basename.str() +
"var.e-s.");
342 var_name += curr_iter.str();
343 this->current_physical_var->save_function(var_name, this->iteration());
346 boost::shared_ptr<InfiniteDimensionalMCMCSampler> InfiniteDimensionalMCMCSampler::clone_and_reset()
const
349 boost::shared_ptr<InfiniteDimensionalMCMCSampler> clone(
new InfiniteDimensionalMCMCSampler(this->m_env, this->prior, this->llhd, this->m_ov));
352 clone->current_physical_state = this->current_physical_state;
353 clone->proposed_physical_state = this->proposed_physical_state;
354 clone->_llhd_val = this->_llhd_val;
355 clone->_acc_prob = this->_acc_prob;
356 clone->_avg_acc_prob = 0.0;
361 double InfiniteDimensionalMCMCSampler::acc_prob()
363 return this->_acc_prob;
366 double InfiniteDimensionalMCMCSampler::avg_acc_prob()
368 return this->_avg_acc_prob;
371 double InfiniteDimensionalMCMCSampler::llhd_val()
const
373 return this->_llhd_val;
376 unsigned int InfiniteDimensionalMCMCSampler::iteration()
const
378 return this->_iteration;
383 #endif // QUESO_HAVE_HDF5
int CheckFilePath(const char *path)
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)