https://mooseframework.inl.gov
Loading...
Searching...
No Matches
IndependentMHDecision.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
11
13
16{
18 params.addClassDescription("Perform decision making for independent Metropolis-Hastings MCMC.");
19 params.addParam<ReporterValueName>(
20 "seed_input", "seed_input", "The seed vector input for proposing new samples.");
21 return params;
22}
23
25 : PMCMCDecision(parameters),
26 _igmh(dynamic_cast<const IndependentGaussianMH *>(&_sampler)),
27 _seed_input(declareValue<std::vector<Real>>("seed_input")),
28 _seed_outputs(declareRestartableData<std::vector<Real>>("seed_outputs"))
29{
30 // Check whether the selected sampler is a M-H sampler or not
31 if (!_igmh)
32 paramError("sampler", "The selected sampler is not of type IndependentGaussianMH.");
33
35 _tpm_modified.assign(_props + 1, 1.0 / (_props + 1));
36}
37
38void
39IndependentMHDecision::computeEvidence(std::vector<Real> & evidence,
40 const DenseMatrix<Real> & input_matrix)
41{
42 std::vector<Real> out(_num_confg_values);
43 for (unsigned int i = 0; i < evidence.size(); ++i)
44 {
45 evidence[i] = 0.0;
46 for (unsigned int j = 0; j < _priors.size(); ++j)
47 evidence[i] += (std::log(_priors[j]->pdf(input_matrix(i, j))) -
48 std::log(_priors[j]->pdf(_seed_input[j])));
49 for (unsigned int j = 0; j < _num_confg_values; ++j)
50 out[j] = (*_outputs_required)[j * _props + i];
51 for (unsigned int j = 0; j < _likelihoods.size(); ++j)
52 evidence[i] += (_likelihoods[j]->function(out) - _likelihoods[j]->function(_seed_outputs));
53 }
54}
55
56void
58 const std::vector<Real> & evidence)
59{
60 for (unsigned int i = 0; i < tv.size(); ++i)
61 tv[i] = (1.0 / tv.size()) * std::exp(std::min(evidence[i], 0.0));
62 _tpm_modified = tv;
63 _tpm_modified.push_back((1.0 - std::accumulate(tv.begin(), tv.end(), 0.0)));
64 _outputs_sto = (*_outputs_required);
65}
66
67void
68IndependentMHDecision::nextSamples(std::vector<Real> & req_inputs,
69 DenseMatrix<Real> & input_matrix,
70 const std::vector<Real> & /*tv*/,
71 const unsigned int & parallel_index)
72{
73 const bool value = (_tpm_modified[0] == 1.0 / (_props + 1));
74 if (!value)
75 {
76 unsigned int index =
78 if (index < _props)
79 {
80 for (unsigned int k = 0; k < _sampler.getNumberOfCols() - _num_confg_params; ++k)
81 req_inputs[k] = input_matrix(index, k);
82 for (unsigned int k = 0; k < _num_confg_values; ++k)
83 (*_outputs_required)[k * _props + parallel_index] = _outputs_sto[k * _props + index];
84 }
85 else
86 {
87 req_inputs = _seed_input;
88 for (unsigned int k = 0; k < _num_confg_values; ++k)
89 (*_outputs_required)[k * _props + parallel_index] = _seed_outputs[k];
90 }
91 }
92 else
93 {
94 for (unsigned int k = 0; k < _sampler.getNumberOfCols() - _num_confg_params; ++k)
95 req_inputs[k] = input_matrix(parallel_index, k);
96 _variance[parallel_index] = _new_var_samples[parallel_index];
97 }
98}
99
100void
102{
104 for (unsigned int k = 0; k < _num_confg_values; ++k)
105 _seed_outputs[k] = (*_outputs_required)[(k + 1) * _props - 1];
106}
registerMooseObject("StochasticToolsApp", IndependentMHDecision)
A class for performing M-H MCMC sampling with independent Gaussian propoposals.
A class for performing independent Metropolis-Hastings MCMC decision making.
static InputParameters validParams()
std::vector< Real > & _seed_input
Seed vector input for proposing new samples.
virtual void nextSeeds() override
Compute the next set of seeds to facilitate proposals.
std::vector< Real > & _seed_outputs
Outputs corresponding to the seed input vector.
IndependentMHDecision(const InputParameters &parameters)
const IndependentGaussianMH *const _igmh
IndependentGaussianMH sampler.
virtual void computeEvidence(std::vector< Real > &evidence, const DenseMatrix< Real > &input_matrix) override
Compute the evidence (aka, betterness of the proposed sample vs the previous)
std::vector< Real > _outputs_sto
Store the gathered outputs.
virtual void nextSamples(std::vector< Real > &req_inputs, DenseMatrix< Real > &input_matrix, const std::vector< Real > &tv, const unsigned int &parallel_index) override
Resample inputs given the transition vector (after transition vector computed)
virtual void computeTransitionVector(std::vector< Real > &tv, const std::vector< Real > &evidence) override
Compute the transition probability vector (after the computation of evidence)
std::vector< Real > _tpm_modified
Modified transition vector considering the seed input.
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
void paramError(const std::string &param, Args... args) const
PMCMCDecision will help making sample accept/reject decisions in MCMC schemes (for e....
const std::vector< Real > & _rnd_vec
Storage for the random numbers for decision making.
dof_id_type _num_confg_values
Storage for the number of experimental configuration values.
std::vector< const LikelihoodFunctionBase * > _likelihoods
Storage for the likelihood objects to be utilized.
std::vector< Real > & _variance
Model variance term.
std::vector< std::vector< Real > > & _inputs
Model input data that is uncertain.
const std::vector< const Distribution * > _priors
Storage for the priors.
dof_id_type _num_confg_params
Storage for the number of experimental configuration parameters.
Sampler & _sampler
The MCMC sampler.
static InputParameters validParams()
const std::vector< Real > & _new_var_samples
Storage for new proposed variance samples.
dof_id_type _props
Storage for the number of parallel proposals.
std::vector< Real > * _outputs_required
Transfer the right outputs to the file.
dof_id_type getNumberOfCols() const
unsigned int weightedResample(const std::vector< Real > &weights, Real rnd)
return a resampled vector from a population given a weight vector.