https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
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
65void
67{
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}
registerMooseObject("StochasticToolsApp", AdaptiveImportanceStats)
const ReporterMode REPORTER_MODE_DISTRIBUTED
void ErrorVector unsigned int
A class used to perform Adaptive Importance Sampling using a Markov Chain Monte Carlo algorithm.
const bool & getUseAbsoluteValue() const
const std::vector< Real > & getImportanceVectorMean() const
const std::vector< Real > & getImportanceVectorStd() const
const std::vector< const Distribution * > & getDistributionNames() const
AdaptiveImportanceStats will help make sample accept/reject decisions in adaptive Monte Carlo schemes...
int _check_step
Ensure that the MCMC algorithm proceeds in a sequential fashion.
std::vector< const Distribution * > _distributions_store
Storage for the distribution names.
static InputParameters validParams()
virtual void execute() override
std::vector< Real > & _std_imp
Standard deviations of the importance distributions.
const std::vector< Real > & _output_value
Model output value from SubApp.
AdaptiveImportanceSampler & _ais
Adaptive Importance Sampler.
std::vector< Real > & _cov_pf
Coefficient of variation of failure probability.
Real _factor
Storage for the standard deviation factor over the importance distribution.
const int & _step
Track the current step of the main App.
std::vector< Real > & _mu_imp
Means of the importance distributions.
Real _pf_sum
Storage for the sequential sum of pf.
AdaptiveImportanceStats(const InputParameters &parameters)
const std::vector< bool > * _gp_flag
Flag for GP utilization.
Real _var_sum
Storage for the sequential sum of variance of pf.
std::vector< Real > & _pf
Failure probability estimate.
static InputParameters validParams()
void addRequiredParam(const std::string &name, const std::string &doc_string)
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)
virtual Real pdf(const Real &x) const override
Definition Normal.C:68
virtual Real quantile(const Real &p) const override
Definition Normal.C:80
std::vector< Real > getNextLocalRow()
dof_id_type getNumberOfLocalRows() const
dof_id_type getNumberOfRows() const
dof_id_type getNumberOfCols() const