Markov Chain Monte Carlo acceleration by Differential Evolution

DREAM is a C++ program which implements the DREAM algorithm for accelerating Markov Chain Monte Carlo (MCMC) convergence using differential evolution, by Guannan Zhang.

DREAM requires user input in the form of five C++ functions:

Examples of such user input are listed below.

DREAM requires access to a compiled version of the pdflib library, which can evaluate a variety of Probability Density Functions (PDF's) and produce samples from them. The user may wish to invoke this library when constructing some of the user functions.

DREAM requires access to a compiled version of the rnglib library, in order to generate random numbers.

An older implementation of the DREAM algorithm is available as DREAM1; it requires a user main program and two input files.

The DREAM program was originally developed by Guannan Zhang, of Oak Ridge National Laboratory (ORNL); it has been incorporated into the DAKOTA package of Sandia National Laboratory, and forms part of the ORNL package known as TASMANIAN.

Web Link:

A version of the DREAM library is available in http://tasmanian.ornl.gov, the TASMANIAN library, available from Oak Ridge National Laboratory.


The computer code and data files described and made available on this web page are distributed under the GNU LGPL license.


DREAM is available in a C version and a C++ version and a FORTRAN90 version.

Related Data and Programs:

DREAM1, a C++ library which is an older implementation of the DREAM algorithm for accelerating Markov Chain Monte Carlo (MCMC) convergence using differential evolution, using a user function main program and two input files to define the problem, by Guannan Zhang.

PDFLIB, a C++ library which evaluates Probability Density Functions (PDF's) and produces random samples from them, including beta, binomial, chi, exponential, gamma, inverse chi, inverse gamma, multinomial, normal, scaled inverse chi, and uniform.

RANLIB, a C++ library which produces random samples from Probability Density Functions (PDF's), including Beta, Chi-square Exponential, F, Gamma, Multivariate normal, Noncentral chi-square, Noncentral F, Univariate normal, random permutations, Real uniform, Binomial, Negative Binomial, Multinomial, Poisson and Integer uniform, by Barry Brown and James Lovato.

RNGLIB, a C++ library which implements a random number generator (RNG) with splitting facilities, allowing multiple independent streams to be computed, by L'Ecuyer and Cote.


Original FORTRAN90 version by Guannan Zhang; C++ version by John Burkardt.


  1. Pierre LEcuyer, Serge Cote,
    Implementing a Random Number Package with Splitting Facilities,
    ACM Transactions on Mathematical Software,
    Volume 17, Number 1, March 1991, pages 98-111.
  2. Jasper Vrugt, CJF ter Braak, CGH Diks, Bruce Robinson, James Hyman, Dave Higdon,
    Accelerating Markov Chain Monte Carlo Simulation by Differential Evolution with Self-Adaptive Randomized Subspace Sampling,
    International Journal of Nonlinear Sciences and Numerical Simulation,
    Volume 10, Number 3, March 2009, pages 271-288.

Source Code:

Examples and Tests:

PROBLEM0 is a small sample problem, in 10 dimensions, with a density that is the maximum of two gaussians centered at (-5,-5,...,-5) and (5,5,...,5).

PROBLEM1 is based on the first example in the Vrugt reference. The Vrugt version involves 100 variables, with a multidimensional normal distribution with specified mean vector and covariance matrix. So far, I have simply set up the user routines, with just 5 variables, and created a small stand-alone main program to test it. An important issue was to find a simple and efficient way of handling the covariance. We need to evaluate the matrix, compute its Cholesky factor, find its determinant, just one time, and then provide this information to any function that needs it, quickly and simply. In this version of the code, I opted to define a "Covariance" structure, making it an "extern" variable so the main program could access it.

PROBLEM1C is a version of PROBLEM1 that uses a class to store the covariance information, instead of a structure. I didn't like this approach, since it seemed like, every time I needed some information, I had to call a function and provide an array to store a copy of the information, rather than simply accessing the information directly.

PROBLEM2 is based on the second example in the Vrugt reference. The Vrugt version involves 10 variables, with a "twisted" Gaussian density function.

List of Routines:

You can go up one level to the C++ source codes.

Last revised on 27 June 2013.