https://mooseframework.inl.gov
ActiveLearningGPDecision.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 #ifdef MOOSE_LIBTORCH_ENABLED
10 
12 #include "Sampler.h"
14 
15 #include <math.h>
16 
17 registerMooseObject("StochasticToolsApp", ActiveLearningGPDecision);
18 
21 {
23  params.addClassDescription(
24  "Evaluates a GP surrogate model, determines its prediction quality, "
25  "launches full model if GP prediction is inadequate, and retrains GP.");
26  MooseEnum learning_function("Ufunction COV");
28  "learning_function", learning_function, "The learning function for active learning.");
29  params.addRequiredParam<Real>("learning_function_threshold", "The learning function threshold.");
30  params.addParam<Real>("learning_function_parameter",
31  std::numeric_limits<Real>::max(),
32  "The learning function parameter.");
33  params.addRequiredParam<UserObjectName>("al_gp", "Active learning GP trainer.");
34  params.addRequiredParam<UserObjectName>("gp_evaluator", "Evaluate the trained GP.");
35  params.addRequiredParam<SamplerName>("sampler", "The sampler object.");
36  params.addParam<ReporterValueName>("flag_sample", "flag_sample", "Flag samples.");
37  params.addRequiredParam<int>("n_train", "Number of training steps.");
38  params.addParam<ReporterValueName>("inputs", "inputs", "The inputs.");
39  params.addParam<ReporterValueName>("gp_mean", "gp_mean", "The GP mean prediction.");
40  params.addParam<ReporterValueName>("gp_std", "gp_std", "The GP standard deviation.");
41  return params;
42 }
43 
45  : ActiveLearningReporterTempl<Real>(parameters),
47  _learning_function(getParam<MooseEnum>("learning_function")),
48  _learning_function_threshold(getParam<Real>("learning_function_threshold")),
49  _learning_function_parameter(getParam<Real>("learning_function_parameter")),
50  _al_gp(getUserObject<ActiveLearningGaussianProcess>("al_gp")),
51  _gp_eval(getSurrogateModel<GaussianProcessSurrogate>("gp_evaluator")),
52  _flag_sample(declareValue<std::vector<bool>>(
53  "flag_sample", std::vector<bool>(sampler().getNumberOfRows(), false))),
54  _n_train(getParam<int>("n_train")),
55  _inputs(declareValue<std::vector<std::vector<Real>>>(
56  "inputs",
57  std::vector<std::vector<Real>>(sampler().getNumberOfRows(),
58  std::vector<Real>(sampler().getNumberOfCols())))),
59  _gp_mean(
60  declareValue<std::vector<Real>>("gp_mean", std::vector<Real>(sampler().getNumberOfRows()))),
61  _gp_std(
62  declareValue<std::vector<Real>>("gp_std", std::vector<Real>(sampler().getNumberOfRows()))),
63  _decision(true),
64  _inputs_global(getGlobalInputData()),
65  _outputs_global(getGlobalOutputData())
66 {
67  if (_learning_function == "Ufunction" &&
68  !parameters.isParamSetByUser("learning_function_parameter"))
69  paramError("learning_function",
70  "The Ufunction requires the model failure threshold ('learning_function_parameter') "
71  "to be specified.");
72 }
73 
74 bool
75 ActiveLearningGPDecision::learningFunction(const Real & gp_mean, const Real & gp_std) const
76 {
77  if (_learning_function == "Ufunction")
78  return (std::abs(gp_mean - _learning_function_parameter) / gp_std) >
80  else if (_learning_function == "COV")
81  return (gp_std / std::abs(gp_mean)) < _learning_function_threshold;
82  else
83  mooseError("Invalid learning function ", std::string(_learning_function));
84  return false;
85 }
86 
87 void
88 ActiveLearningGPDecision::setupData(const std::vector<std::vector<Real>> & inputs,
89  const std::vector<Real> & outputs)
90 {
91  _inputs_batch.insert(_inputs_batch.end(), inputs.begin(), inputs.end());
92  _outputs_batch.insert(_outputs_batch.end(), outputs.begin(), outputs.end());
93 }
94 
95 bool
97 {
98  for (dof_id_type i = 0; i < _inputs.size(); ++i)
99  {
102  }
103 
104  for (const auto & fs : _flag_sample)
105  if (!fs)
106  return false;
107  return true;
108 }
109 
110 void
112 {
113  // Accumulate inputs and outputs if we previously decided we needed a sample
114  if (_t_step > 1 && _decision)
115  {
116  // Accumulate data into _batch members
118 
119  // Retrain if we are outside the training phase
120  if (_t_step > _n_train)
122  }
123 
124  // Gather inputs for the current step
126 
127  // Evaluate GP and decide if we need more data if outside training phase
128  if (_t_step > _n_train)
130 }
131 
132 bool
133 ActiveLearningGPDecision::needSample(const std::vector<Real> &,
134  dof_id_type,
135  dof_id_type global_ind,
136  Real & val)
137 {
138  if (!_decision)
139  val = _gp_mean[global_ind];
140  return _decision;
141 }
142 
143 #endif
registerMooseObject("StochasticToolsApp", ActiveLearningGPDecision)
virtual void setupData(const std::vector< std::vector< Real >> &inputs, const std::vector< Real > &outputs)
This sets up data for re-training the GP.
std::vector< Real > _outputs_batch
Store all the outputs used for training.
const int _n_train
Number of initial training points for GP.
static InputParameters validParams()
bool _decision
GP pass/fail decision.
void paramError(const std::string &param, Args... args) const
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
virtual void reTrain(const std::vector< std::vector< Real >> &inputs, const std::vector< Real > &outputs) const final
const Real & _learning_function_threshold
The learning function threshold.
const InputParameters & parameters() const
virtual void preNeedSample() override
This is where most of the computations happen:
const std::vector< Real > & _outputs_global
Reference to global output data requested from base class.
const MooseEnum & _learning_function
The learning function for active learning.
void addRequiredParam(const std::string &name, const std::string &doc_string)
virtual Real evaluate(const std::vector< Real > &x) const
Evaluate surrogate model given a row of parameters.
const Real & _learning_function_parameter
The learning function parameter.
std::vector< std::vector< Real > > _inputs_batch
Store all the input vectors used for training.
bool isParamSetByUser(const std::string &name) const
const ActiveLearningGaussianProcess & _al_gp
The active learning GP trainer that permits re-training.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Interface for objects that need to use samplers.
static InputParameters validParams()
bool learningFunction(const Real &gp_mean, const Real &gp_std) const
This method evaluates the active learning acquisition function and returns bool that indicates whethe...
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
virtual bool needSample(const std::vector< Real > &row, dof_id_type local_ind, dof_id_type global_ind, Real &val) override
Based on the computations in preNeedSample, the decision to get more data is passed and results from ...
std::vector< Real > & _gp_mean
Broadcast the GP mean prediciton to JSON.
virtual bool facilitateDecision()
Make decisions whether to call the full model or not based on GP prediction and uncertainty.
const SurrogateModel & _gp_eval
The GP evaluator object that permits re-evaluations.
ActiveLearningGPDecision(const InputParameters &parameters)
std::vector< std::vector< Real > > & _inputs
Storage for the input vectors to be transferred to the output file.
std::vector< Real > & _gp_std
Broadcast the GP standard deviation to JSON.
void ErrorVector unsigned int
This is a base class for performing active learning routines, meant to be used in conjunction with Sa...
const std::vector< std::vector< Real > > & _inputs_global
Reference to global input data requested from base class.
uint8_t dof_id_type
std::vector< bool > & _flag_sample
Flag samples when the GP fails.