Loading [MathJax]/extensions/tex2jax.js
https://mooseframework.inl.gov
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
GaussianProcessTrainer.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 
10 #include "GaussianProcessTrainer.h"
11 #include "Sampler.h"
12 #include "CartesianProduct.h"
13 
14 #include <petsctao.h>
15 #include <petscdmda.h>
16 
17 #include "libmesh/petsc_vector.h"
18 #include "libmesh/petsc_matrix.h"
19 
20 #include <cmath>
21 
22 registerMooseObject("StochasticToolsApp", GaussianProcessTrainer);
23 
26 {
28  params.addClassDescription("Provides data preperation and training for a single- or multi-output "
29  "Gaussian Process surrogate model.");
30 
31  params.addRequiredParam<UserObjectName>("covariance_function", "Name of covariance function.");
32  params.addParam<bool>(
33  "standardize_params", true, "Standardize (center and scale) training parameters (x values)");
34  params.addParam<bool>(
35  "standardize_data", true, "Standardize (center and scale) training data (y values)");
36  // Already preparing to use Adam here
37  params.addParam<unsigned int>("num_iters", 1000, "Tolerance value for Adam optimization");
38  params.addParam<unsigned int>("batch_size", 0, "The batch size for Adam optimization");
39  params.addParam<Real>("learning_rate", 0.001, "The learning rate for Adam optimization");
40  params.addParam<unsigned int>(
41  "show_every_nth_iteration",
42  0,
43  "Switch to show Adam optimization loss values at every nth step. If 0, nothing is showed.");
44  params.addParam<std::vector<std::string>>("tune_parameters",
45  "Select hyperparameters to be tuned");
46  params.addParam<std::vector<Real>>("tuning_min", "Minimum allowable tuning value");
47  params.addParam<std::vector<Real>>("tuning_max", "Maximum allowable tuning value");
48  return params;
49 }
50 
52  : SurrogateTrainer(parameters),
53  CovarianceInterface(parameters),
54  _predictor_row(getPredictorData()),
55  _gp(declareModelData<StochasticTools::GaussianProcess>("_gp")),
56  _training_params(declareModelData<RealEigenMatrix>("_training_params")),
57  _standardize_params(getParam<bool>("standardize_params")),
58  _standardize_data(getParam<bool>("standardize_data")),
59  _do_tuning(isParamValid("tune_parameters")),
60  _optimization_opts(StochasticTools::GaussianProcess::GPOptimizerOptions(
61  getParam<unsigned int>("show_every_nth_iteration"),
62  getParam<unsigned int>("num_iters"),
63  getParam<unsigned int>("batch_size"),
64  getParam<Real>("learning_rate"))),
65  _sampler_row(getSamplerData())
66 {
67  // Error Checking
68  if (parameters.isParamSetByUser("batch_size"))
70  paramError("batch_size", "Batch size cannot be greater than the training data set size.");
71 
72  std::vector<std::string> tune_parameters(
73  _do_tuning ? getParam<std::vector<std::string>>("tune_parameters")
74  : std::vector<std::string>{});
75 
76  if (isParamValid("tuning_min") &&
77  (getParam<std::vector<Real>>("tuning_min").size() != tune_parameters.size()))
78  mooseError("tuning_min size does not match tune_parameters");
79  if (isParamValid("tuning_max") &&
80  (getParam<std::vector<Real>>("tuning_max").size() != tune_parameters.size()))
81  mooseError("tuning_max size does not match tune_parameters");
82 
83  std::vector<Real> lower_bounds, upper_bounds;
84  if (isParamValid("tuning_min"))
85  lower_bounds = getParam<std::vector<Real>>("tuning_min");
86  if (isParamValid("tuning_max"))
87  upper_bounds = getParam<std::vector<Real>>("tuning_max");
88 
89  _gp.initialize(getCovarianceFunctionByName(parameters.get<UserObjectName>("covariance_function")),
90  tune_parameters,
91  lower_bounds,
92  upper_bounds);
93 
95 }
96 
97 void
99 {
100  _params_buffer.clear();
101  _data_buffer.clear();
103  _data_buffer.reserve(getLocalSampleSize());
104 }
105 
106 void
108 {
109  _params_buffer.push_back(_predictor_row);
110 
111  if (_rvecval && _rvecval->size() != _n_outputs)
112  mooseError("The size of the provided response (",
113  _rvecval->size(),
114  ") does not match the number of expected outputs from the covariance (",
115  _n_outputs,
116  ")!");
117 
118  _data_buffer.push_back(_rvecval ? (*_rvecval) : std::vector<Real>(1, *_rval));
119 }
120 
121 void
123 {
124  // Instead of gatherSum, we have to allgather.
127 
128  _training_params.resize(_params_buffer.size(), _n_dims);
129  _training_data.resize(_data_buffer.size(), _n_outputs);
130 
131  for (auto ii : make_range(_training_params.rows()))
132  {
133  for (auto jj : make_range(_n_dims))
134  _training_params(ii, jj) = _params_buffer[ii][jj];
135  for (auto jj : make_range(_n_outputs))
136  _training_data(ii, jj) = _data_buffer[ii][jj];
137  }
138 
139  // Standardize (center and scale) training params
142  // if not standardizing data set mean=0, std=1 for use in surrogate
143  else
144  _gp.paramStandardizer().set(0, 1, _n_dims);
145 
146  // Standardize (center and scale) training data
147  if (_standardize_data)
149  // if not standardizing data set mean=0, std=1 for use in surrogate
150  else
152 
153  // Setup the covariance
155 }
const StochasticTools::GaussianProcess::GPOptimizerOptions _optimization_opts
Struct holding parameters necessary for parameter tuning.
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
void setupCovarianceMatrix(const RealEigenMatrix &training_params, const RealEigenMatrix &training_data, const GPOptimizerOptions &opts)
Sets up the covariance matrix given data and optimization options.
virtual void train() override
const Real * _rval
Response value.
unsigned int _n_dims
Dimension of predictor data - either _sampler.getNumberOfCols() or _pvals.size() + _pcols...
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
const std::vector< Real > * _rvecval
Vector response value.
const CovarianceFunctionBase & getCovarFunction() const
RealEigenMatrix & _training_params
Paramaters (x) used for training, along with statistics.
const Parallel::Communicator & _communicator
void standardizeData(RealEigenMatrix &data, bool keep_moments=false)
Standardizes the vector of responses (y values).
const unsigned int batch_size
The batch isize for Adam optimizer.
void addRequiredParam(const std::string &name, const std::string &doc_string)
bool _do_tuning
Flag to toggle hyperparameter tuning/optimization.
unsigned int & _n_outputs
The number of outputs.
virtual void postTrain() override
bool isParamValid(const std::string &name) const
GaussianProcessTrainer(const InputParameters &parameters)
Enum for batch type in stochastic tools MultiApp.
StochasticTools::Standardizer & dataStandardizer()
StochasticTools::Standardizer & paramStandardizer()
Get non-constant reference to the contained structures (if they need to be modified from the utside) ...
static InputParameters validParams()
registerMooseObject("StochasticToolsApp", GaussianProcessTrainer)
const T & getParam(const std::string &name) const
const std::vector< Real > & _predictor_row
Data from the current predictor row.
void paramError(const std::string &param, Args... args) const
Eigen::Matrix< Real, Eigen::Dynamic, Eigen::Dynamic > RealEigenMatrix
void initialize(CovarianceFunctionBase *covariance_function, const std::vector< std::string > &params_to_tune, const std::vector< Real > &min=std::vector< Real >(), const std::vector< Real > &max=std::vector< Real >())
Initializes the most important structures in the Gaussian Process: the covariance function and a tuni...
dof_id_type getNumberOfRows() const
bool isParamSetByUser(const std::string &name) const
virtual void preTrain() override
unsigned int getLocalSampleSize() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
This is the main trainer base class.
void set(const Real &n)
Methods for setting mean and standard deviation directly Sets mean=0, std=1 for n variables...
Definition: Standardizer.C:16
IntRange< T > make_range(T beg, T end)
void mooseError(Args &&... args) const
bool _standardize_data
Switch for training data(y) standardization.
std::vector< std::vector< Real > > _data_buffer
Data (y) used for training.
RealEigenMatrix _training_data
Data (y) used for training.
void addClassDescription(const std::string &doc_string)
const InputParameters & parameters() const
unsigned int numOutputs() const
Return the number of outputs assumed for this covariance function.
static InputParameters validParams()
StochasticTools::GaussianProcess & _gp
Gaussian process handler responsible for managing training related tasks.
std::vector< std::vector< Real > > _params_buffer
Parameters (x) used for training – we&#39;ll allgather these in postTrain().
void ErrorVector unsigned int
void standardizeParameters(RealEigenMatrix &parameters, bool keep_moments=false)
Standardizes the vector of input parameters (x values).
bool _standardize_params
Switch for training param (x) standardization.
CovarianceFunctionBase * getCovarianceFunctionByName(const UserObjectName &name) const
Lookup a CovarianceFunction object by name and return pointer.