A generic MCMC simulation class. More...
#include <mcmc_para.h>
This class performs a Markov chain Monte Carlo simulation of a user-specified function using OpenMP and/or MPI. Either the Metropolis-Hastings algorithm with a user-specified proposal distribution or the affine-invariant sampling method of Goodman and Weare can be used.
By default, the Metropolis-Hastings algorithm is executed with a simple walk, with steps in each dimension of size with the denominator specified in step_fac.
The function type is a template type, func_t
, which should be of the form
which computes log_pdf
, the natural logarithm of the function value, for any point in parameter space (any point between low
and high
).
If the function being simulated returns mcmc_skip then the point is automatically rejected. After each acceptance or rejection, a user-specified "measurement" function (of type measure_t
) is called, which can be used to store the results. In order to stop the simulation, either this function or the probability distribution being simulated should return the value mcmc_done .
A generic proposal distribution can be specified in set_proposal(). To go back to the default random walk method, one can call the function unset_proposal().
If aff_inv is set to true and the number of walkers, n_walk is set to a number larger than 1, then affine-invariant sampling is used. For affine-invariant sampling, the variable step_fac represents the value of , the limits of the distribution for
.
In order to store data at each point, the user can store this data in any object of type data_t
. If affine-invariant sampling is used, then each chain has it's own data object. The class keeps twice as many copies of these data object as would otherwise be required, in order to avoid copying of data objects in the case that the steps are accepted or rejected.
Verbose output: If verbose is 0, no output is generated (the default). If verbose is 1, then output to cout
occurs only if the settings are somehow misconfigured and the class attempts to recover from them, for example if not enough functions are specified for the requested number of OpenMP threads, or if more than one thread was requested but O2SCL_OPENMP was not defined, or if a negative value for step_fac was requested. When verbose is 1, a couple things are also output to scr_out, including a summary of the number of walkers, chains, and threads at the beginning of the MCMC simulation, a message indicating why the MCMC simulation stopped, a message when the warm up iterations are completed, a message every time files are written to disk, and a message at the end counting the number of acceptances and rejections. If verbose is 2, then the file prefix is output to cout
during initialization.
Definition at line 126 of file mcmc_para.h.
Public Member Functions | |
Basic usage | |
virtual int | mcmc (size_t n_params, vec_t &low, vec_t &high, std::vector< func_t > &func, std::vector< measure_t > &meas) |
Perform a MCMC simulation. More... | |
virtual int | mcmc (size_t n_params, vec_t &low, vec_t &high, func_t &func, measure_t &meas) |
Perform a MCMC simulation with a thread-safe function. | |
Proposal distribution | |
template<class prob_vec_t > | |
void | set_proposal (prob_vec_t &pv) |
Set the proposal distribution. | |
virtual void | unset_proposal () |
Go back to random-walk Metropolis with a uniform distribution. | |
Public Attributes | |
double | mpi_start_time |
The MPI starting time (defaults to 0.0) More... | |
size_t | max_iters |
If non-zero, the maximum number of MCMC iterations (default 0) More... | |
double | max_time |
Time in seconds (default is 0) More... | |
std::string | prefix |
Prefix for output filenames (default "mcmc") | |
size_t | n_threads |
Number of OpenMP threads. | |
std::vector< ubvector > | initial_points |
Initial points in parameter space. More... | |
Output quantities | |
std::vector< size_t > | n_accept |
The number of Metropolis steps which were accepted in each independent chain (summed over all walkers) More... | |
std::vector< size_t > | n_reject |
The number of Metropolis steps which were rejected in each independent chain (summed over all walkers) More... | |
Settings | |
bool | aff_inv |
If true, use affine-invariant Monte Carlo. | |
double | step_fac |
Stepsize factor (default 10.0) | |
size_t | n_warm_up |
Number of warm up steps (successful steps not iterations) (default 0) More... | |
int | user_seed |
If non-zero, use as the seed for the random number generator (default 0) More... | |
int | verbose |
Output control (default 0) | |
size_t | max_bad_steps |
Maximum number of failed steps when generating initial points with affine-invariant sampling (default 1000) | |
size_t | n_walk |
Number of walkers for affine-invariant MC or 1 otherwise (default 1) | |
size_t | n_walk_per_thread |
Number of walkers per thread (default 1) | |
bool | err_nonconv |
If true, call the error handler if msolve() or msolve_de() does not converge (default true) | |
bool | always_accept |
If true, accept all steps. | |
double | ai_initial_step |
Initial step fraction for affine-invariance sampling walkers (default 0.1) | |
Static Public Attributes | |
static const int | mcmc_done =-10 |
Integer to indicate completion. | |
static const int | mcmc_skip =-20 |
Integer to indicate rejection. | |
Protected Member Functions | |
Interface customization | |
virtual int | mcmc_init () |
Initializations before the MCMC. | |
virtual void | mcmc_cleanup () |
Cleanup after the MCMC. | |
virtual void | best_point (vec_t &best, double w_best, data_t &dat) |
Function to run for the best point. | |
virtual void | post_pointmeas () |
Function to run after point evaluation and measurement steps. | |
Protected Attributes | |
std::ofstream | scr_out |
The screen output file. | |
std::vector< rng_gsl > | rg |
Random number generators. | |
std::vector< o2scl::prob_cond_mdim< vec_t > * > | prop_dist |
Pointer to proposal distribution for each thread. | |
bool | pd_mode |
If true, then use the user-specified proposal distribution. | |
bool | warm_up |
If true, we are in the warm up phase. | |
std::vector< vec_t > | current |
Current points in parameter space for each walker and each OpenMP thread. More... | |
std::vector< data_t > | data_arr |
Data array. More... | |
std::vector< bool > | switch_arr |
Data switch array for each walker and each OpenMP thread. More... | |
std::vector< std::vector< size_t > > | ret_value_counts |
Return value counters, one vector independent chain. | |
std::vector< size_t > | curr_walker |
Index of the current walker. More... | |
size_t | n_chains_per_rank |
Number of fully independent chains in each MPI rank. | |
MPI properties | |
int | mpi_rank |
The MPI processor rank. | |
int | mpi_size |
The MPI number of processors. | |
|
inlinevirtual |
Perform a MCMC simulation over n_params
parameters starting at initial point init
, limiting the parameters to be between low
and high
, using func
as the objective function and calling the measurement function meas
at each MC point.
Definition at line 405 of file mcmc_para.h.
|
protected |
This quantity has to be a vector because different threads may have different values for the current walker during the initialization phase for the affine sampling algorithm.
Definition at line 231 of file mcmc_para.h.
|
protected |
This is an array of size n_threads times n_walk initial guesses, indexed by thread_index*n_walk+walker_index
.
Definition at line 160 of file mcmc_para.h.
|
protected |
This is an array of size 2 times n_threads times n_walk . The two copies of data objects are indexed by i_copy*n_walk*n_threads+thread_index*n_walk+walker_index
Definition at line 168 of file mcmc_para.h.
std::vector<ubvector> o2scl::mcmc_para_base< func_t, measure_t, data_t, vec_t >::initial_points |
To fully specify all of the initial points, this should be a vector of size n_walk times n_threads .
Definition at line 394 of file mcmc_para.h.
size_t o2scl::mcmc_para_base< func_t, measure_t, data_t, vec_t >::max_iters |
double o2scl::mcmc_para_base< func_t, measure_t, data_t, vec_t >::max_time |
double o2scl::mcmc_para_base< func_t, measure_t, data_t, vec_t >::mpi_start_time |
This can be set by the user before mcmc() is called, so that the time required for initializations before the MCMC starts can be counted.
Definition at line 245 of file mcmc_para.h.
std::vector<size_t> o2scl::mcmc_para_base< func_t, measure_t, data_t, vec_t >::n_accept |
This vector has a size equal to n_chains_per_rank .
Definition at line 283 of file mcmc_para.h.
std::vector<size_t> o2scl::mcmc_para_base< func_t, measure_t, data_t, vec_t >::n_reject |
This vector has a size equal to n_chains_per_rank .
Definition at line 290 of file mcmc_para.h.
size_t o2scl::mcmc_para_base< func_t, measure_t, data_t, vec_t >::n_warm_up |
warm_up
, which is a protected boolean local variable in some functions which indicates whether we're in warm up mode or not. Definition at line 308 of file mcmc_para.h.
|
protected |
This is an array of size n_threads times n_walk initial guesses, indexed by thread_index*n_walk+walker_index
.
Definition at line 175 of file mcmc_para.h.
int o2scl::mcmc_para_base< func_t, measure_t, data_t, vec_t >::user_seed |
The random number generator is modified so that each thread and each rank has a different set of random numbers.
Definition at line 316 of file mcmc_para.h.
Documentation generated with Doxygen. Provided under the
GNU Free Documentation License (see License Information).