Example Multilevel MCMC with parallel model
Defines a hierarchy of simple Gaussian models and applies Multilevel MCMC to it. The UQ method is sequential. However, the models themselves may exploit MPI parallelism. We use simple Gaussian target densities here, but the example can serve as a template for actually parallel models.
#include "MUQ/SamplingAlgorithms/SLMCMC.h"
#include "MUQ/SamplingAlgorithms/GreedyMLMCMC.h"
#include "MUQ/SamplingAlgorithms/MIMCMC.h"
#include "MUQ/Modeling/Distributions/Gaussian.h"
#include "MUQ/Modeling/Distributions/Density.h"
#include "MUQ/SamplingAlgorithms/MHKernel.h"
#include "MUQ/SamplingAlgorithms/MHProposal.h"
#include "MUQ/SamplingAlgorithms/CrankNicolsonProposal.h"
#include "MUQ/SamplingAlgorithms/SamplingProblem.h"
#include "MUQ/SamplingAlgorithms/SubsamplingMIProposal.h"
#include "MUQ/SamplingAlgorithms/MIComponentFactory.h"
#include <boost/property_tree/ptree.hpp>
namespace pt = boost::property_tree;
using namespace muq::Modeling;
using namespace muq::SamplingAlgorithms;
using namespace muq::Utilities;
#include "Problem.h"
int main(){
pt::ptree pt;
pt.put("NumSamples", 1e4); // number of samples for single level
pt.put("NumInitialSamples", 1e3); // number of initial samples for greedy MLMCMC
pt.put("GreedyTargetVariance", 0.05); // estimator variance to be achieved by greedy algorithm
pt.put("verbosity", 1); // show some output
pt.put("MLMCMC.Subsampling", 5);
auto componentFactory = std::make_shared<MyMIComponentFactory>(pt);
std::cout << std::endl << "*************** greedy multilevel chain" << std::endl << std::endl;
GreedyMLMCMC greedymlmcmc (pt, componentFactory);
greedymlmcmc.Run();
std::cout << "mean QOI: " << greedymlmcmc.MeanQOI().transpose() << std::endl;
std::cout << std::endl << "*************** single chain reference" << std::endl << std::endl;
SLMCMC slmcmc (pt, componentFactory);
slmcmc.Run();
std::cout << "mean QOI: " << slmcmc.MeanQOI().transpose() << std::endl;
return 0;
}
Complete Code
#include "MUQ/SamplingAlgorithms/SLMCMC.h"
#include "MUQ/SamplingAlgorithms/GreedyMLMCMC.h"
#include "MUQ/SamplingAlgorithms/MIMCMC.h"
#include "MUQ/Modeling/Distributions/Gaussian.h"
#include "MUQ/Modeling/Distributions/Density.h"
#include "MUQ/SamplingAlgorithms/MHKernel.h"
#include "MUQ/SamplingAlgorithms/MHProposal.h"
#include "MUQ/SamplingAlgorithms/CrankNicolsonProposal.h"
#include "MUQ/SamplingAlgorithms/SamplingProblem.h"
#include "MUQ/SamplingAlgorithms/SubsamplingMIProposal.h"
#include "MUQ/SamplingAlgorithms/MIComponentFactory.h"
#include <boost/property_tree/ptree.hpp>
namespace pt = boost::property_tree;
using namespace muq::Modeling;
using namespace muq::SamplingAlgorithms;
using namespace muq::Utilities;
#include "Problem.h"
int main(){
pt::ptree pt;
pt.put("NumSamples", 1e4); // number of samples for single level
pt.put("NumInitialSamples", 1e3); // number of initial samples for greedy MLMCMC
pt.put("GreedyTargetVariance", 0.05); // estimator variance to be achieved by greedy algorithm
pt.put("verbosity", 1); // show some output
pt.put("MLMCMC.Subsampling", 5);
auto componentFactory = std::make_shared<MyMIComponentFactory>(pt);
std::cout << std::endl << "*************** greedy multilevel chain" << std::endl << std::endl;
GreedyMLMCMC greedymlmcmc (pt, componentFactory);
greedymlmcmc.Run();
std::cout << "mean QOI: " << greedymlmcmc.MeanQOI().transpose() << std::endl;
std::cout << std::endl << "*************** single chain reference" << std::endl << std::endl;
SLMCMC slmcmc (pt, componentFactory);
slmcmc.Run();
std::cout << "mean QOI: " << slmcmc.MeanQOI().transpose() << std::endl;
return 0;
}
Defines a hierarchy of simple Gaussian models and applies Multilevel MCMC to it. The UQ method is sequential. However, the models themselves may exploit MPI parallelism. We use simple Gaussian target densities here, but the example can serve as a template for actually parallel models.
#include "MUQ/SamplingAlgorithms/SLMCMC.h" #include "MUQ/SamplingAlgorithms/GreedyMLMCMC.h" #include "MUQ/SamplingAlgorithms/MIMCMC.h" #include "MUQ/Modeling/Distributions/Gaussian.h" #include "MUQ/Modeling/Distributions/Density.h" #include "MUQ/SamplingAlgorithms/MHKernel.h" #include "MUQ/SamplingAlgorithms/MHProposal.h" #include "MUQ/SamplingAlgorithms/CrankNicolsonProposal.h" #include "MUQ/SamplingAlgorithms/SamplingProblem.h" #include "MUQ/SamplingAlgorithms/SubsamplingMIProposal.h" #include "MUQ/SamplingAlgorithms/MIComponentFactory.h" #include <boost/property_tree/ptree.hpp> namespace pt = boost::property_tree; using namespace muq::Modeling; using namespace muq::SamplingAlgorithms; using namespace muq::Utilities; #include "Problem.h" int main(){ pt::ptree pt; pt.put("NumSamples", 1e4); // number of samples for single level pt.put("NumInitialSamples", 1e3); // number of initial samples for greedy MLMCMC pt.put("GreedyTargetVariance", 0.05); // estimator variance to be achieved by greedy algorithm pt.put("verbosity", 1); // show some output pt.put("MLMCMC.Subsampling", 5); auto componentFactory = std::make_shared<MyMIComponentFactory>(pt); std::cout << std::endl << "*************** greedy multilevel chain" << std::endl << std::endl; GreedyMLMCMC greedymlmcmc (pt, componentFactory); greedymlmcmc.Run(); std::cout << "mean QOI: " << greedymlmcmc.MeanQOI().transpose() << std::endl; std::cout << std::endl << "*************** single chain reference" << std::endl << std::endl; SLMCMC slmcmc (pt, componentFactory); slmcmc.Run(); std::cout << "mean QOI: " << slmcmc.MeanQOI().transpose() << std::endl; return 0; }
Complete Code
#include "MUQ/SamplingAlgorithms/SLMCMC.h" #include "MUQ/SamplingAlgorithms/GreedyMLMCMC.h" #include "MUQ/SamplingAlgorithms/MIMCMC.h" #include "MUQ/Modeling/Distributions/Gaussian.h" #include "MUQ/Modeling/Distributions/Density.h" #include "MUQ/SamplingAlgorithms/MHKernel.h" #include "MUQ/SamplingAlgorithms/MHProposal.h" #include "MUQ/SamplingAlgorithms/CrankNicolsonProposal.h" #include "MUQ/SamplingAlgorithms/SamplingProblem.h" #include "MUQ/SamplingAlgorithms/SubsamplingMIProposal.h" #include "MUQ/SamplingAlgorithms/MIComponentFactory.h" #include <boost/property_tree/ptree.hpp> namespace pt = boost::property_tree; using namespace muq::Modeling; using namespace muq::SamplingAlgorithms; using namespace muq::Utilities; #include "Problem.h" int main(){ pt::ptree pt; pt.put("NumSamples", 1e4); // number of samples for single level pt.put("NumInitialSamples", 1e3); // number of initial samples for greedy MLMCMC pt.put("GreedyTargetVariance", 0.05); // estimator variance to be achieved by greedy algorithm pt.put("verbosity", 1); // show some output pt.put("MLMCMC.Subsampling", 5); auto componentFactory = std::make_shared<MyMIComponentFactory>(pt); std::cout << std::endl << "*************** greedy multilevel chain" << std::endl << std::endl; GreedyMLMCMC greedymlmcmc (pt, componentFactory); greedymlmcmc.Run(); std::cout << "mean QOI: " << greedymlmcmc.MeanQOI().transpose() << std::endl; std::cout << std::endl << "*************** single chain reference" << std::endl << std::endl; SLMCMC slmcmc (pt, componentFactory); slmcmc.Run(); std::cout << "mean QOI: " << slmcmc.MeanQOI().transpose() << std::endl; return 0; }
- Join our slack workspace to connect with other users, get help, and discuss new features.
This material is based upon work supported by the National Science Foundation under Grant No. 1550487.
Any opinions, findings, and conclusions or recommendations expressed in this material are those of the author(s) and do not necessarily reflect the views of the National Science Foundation.
This material is based upon work supported by the US Department of Energy, Office of Advanced Scientific Computing Research, SciDAC (Scientific Discovery through Advanced Computing) program under awards DE-SC0007099 and DE-SC0021226, for the QUEST and FASTMath SciDAC Institutes.