https://mooseframework.inl.gov
AdaptiveImportanceStats.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 #include "Sampler.h"
12 #include "Distribution.h"
13 #include "Normal.h"
14 #include "libmesh/utility.h"
15 
16 registerMooseObject("StochasticToolsApp", AdaptiveImportanceStats);
17 
20 {
22  params.addClassDescription("Reporter to compute statistics corresponding to the "
23  "AdaptiveImportanceSampler.");
24  params.addRequiredParam<ReporterName>("output_value",
25  "Value of the model output from the SubApp.");
26  params.addParam<ReporterValueName>("mu_imp", "mu_imp", "Means of the importance distributions.");
27  params.addParam<ReporterValueName>(
28  "std_imp", "std_imp", "Standard deviations of the importance distributions.");
29  params.addParam<ReporterValueName>("pf", "pf", "Failure probability estimate.");
30  params.addParam<ReporterValueName>(
31  "cov_pf", "cov_pf", "Coefficient of variation of failure probability.");
32  params.addParam<ReporterName>("flag_sample",
33  "Flag samples if the surrogate prediction was inadequate.");
34  params.addRequiredParam<SamplerName>("sampler", "The sampler object.");
35  return params;
36 }
37 
39  : GeneralReporter(parameters),
40  _output_value(isParamValid("flag_sample") ? getReporterValue<std::vector<Real>>("output_value")
41  : getReporterValue<std::vector<Real>>(
42  "output_value", REPORTER_MODE_DISTRIBUTED)),
43  _mu_imp(declareValue<std::vector<Real>>("mu_imp")),
44  _std_imp(declareValue<std::vector<Real>>("std_imp")),
45  _pf(declareValue<std::vector<Real>>("pf")),
46  _cov_pf(declareValue<std::vector<Real>>("cov_pf")),
47  _step(getCheckedPointerParam<FEProblemBase *>("_fe_problem_base")->timeStep()),
48  _ais(getSampler<AdaptiveImportanceSampler>("sampler")),
49  _gp_flag(isParamValid("flag_sample") ? &getReporterValue<std::vector<bool>>("flag_sample")
50  : nullptr),
51  _check_step(std::numeric_limits<int>::max())
52 {
53  // Initialize variables
54  const auto rows = _ais.getNumberOfRows();
55  _mu_imp.resize(rows);
56  _std_imp.resize(rows);
57  _pf.resize(1);
58  _cov_pf.resize(1);
59  _pf_sum = 0.0;
60  _var_sum = 0.0;
63 }
64 
65 void
67 {
68  if (_ais.getNumberOfLocalRows() == 0 || _check_step == _step)
69  {
71  return;
72  }
73 
74  const bool gp_flag = _gp_flag ? (*_gp_flag)[0] : false;
75  // Compute AdaptiveImportanceSampler statistics at each sample during the evaluation phase only.
76  if (_step > _ais.getNumSamplesTrain() && !gp_flag)
77  {
78  // Get the statistics of the importance distributions in the standard Normal space.
81 
82  // Get the failure probability estimate.
83  const Real tmp = _ais.getUseAbsoluteValue() ? std::abs(_output_value[0]) : _output_value[0];
84  const bool output_limit_reached = tmp >= _ais.getOutputLimit();
85  Real prod1 = output_limit_reached ? 1.0 : 0.0;
86  std::vector<Real> input1 = _ais.getNextLocalRow();
87  Real input_tmp = 0.0;
88  for (dof_id_type ss = 0; ss < _ais.getNumberOfCols(); ++ss)
89  {
90  input_tmp = Normal::quantile(_distributions_store[ss]->cdf(input1[ss]), 0.0, 1.0);
91  prod1 = prod1 * (Normal::pdf(input_tmp, 0.0, 1.0) /
92  Normal::pdf(input_tmp, _mu_imp[ss], _factor * _std_imp[ss]));
93  }
94  _pf_sum += prod1;
95  _var_sum += Utility::pow<2>(prod1);
97 
98  // Get coefficient of variation of failure probability.
99  Real tmp_var =
100  std::sqrt(1.0 / (_step - _ais.getNumSamplesTrain()) *
101  (_var_sum / (_step - _ais.getNumSamplesTrain()) - Utility::pow<2>(_pf[0])));
102  _cov_pf[0] = tmp_var / _pf[0];
103  }
104 }
Real _factor
Storage for the standard deviation factor over the importance distribution.
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
registerMooseObject("StochasticToolsApp", AdaptiveImportanceStats)
A class used to perform Adaptive Importance Sampling using a Markov Chain Monte Carlo algorithm...
std::vector< Real > & _std_imp
Standard deviations of the importance distributions.
std::vector< Real > getNextLocalRow()
AdaptiveImportanceStats(const InputParameters &parameters)
AdaptiveImportanceStats will help make sample accept/reject decisions in adaptive Monte Carlo schemes...
AdaptiveImportanceSampler & _ais
Adaptive Importance Sampler.
static InputParameters validParams()
virtual void execute() override
const std::vector< const Distribution * > & getDistributionNames() const
dof_id_type getNumberOfLocalRows() const
const std::vector< Real > & getImportanceVectorMean() const
void addRequiredParam(const std::string &name, const std::string &doc_string)
virtual Real pdf(const Real &x) const override
Definition: Normal.C:68
auto max(const L &left, const R &right)
const std::vector< Real > & getImportanceVectorStd() const
const std::vector< bool > * _gp_flag
Flag for GP utilization.
std::vector< Real > & _pf
Failure probability estimate.
const int & _step
Track the current step of the main App.
const ReporterMode REPORTER_MODE_DISTRIBUTED
dof_id_type getNumberOfRows() const
const int & getNumSamplesTrain() const
const bool & getUseAbsoluteValue() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static InputParameters validParams()
void addClassDescription(const std::string &doc_string)
std::vector< Real > & _mu_imp
Means of the importance distributions.
Real _pf_sum
Storage for the sequential sum of pf.
std::vector< const Distribution * > _distributions_store
Storage for the distribution names.
virtual Real quantile(const Real &p) const override
Definition: Normal.C:80
const std::vector< Real > & _output_value
Model output value from SubApp.
Real _var_sum
Storage for the sequential sum of variance of pf.
void ErrorVector unsigned int
dof_id_type getNumberOfCols() const
int _check_step
Ensure that the MCMC algorithm proceeds in a sequential fashion.
std::vector< Real > & _cov_pf
Coefficient of variation of failure probability.
uint8_t dof_id_type