https://mooseframework.inl.gov
ActiveLearningGaussianProcess.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 
13 #include <petsctao.h>
14 #include <petscdmda.h>
15 
16 #include "libmesh/petsc_vector.h"
17 #include "libmesh/petsc_matrix.h"
18 
19 #include <math.h>
20 
22 
25 {
27  params.addClassDescription(
28  "Permit re-training Gaussian Process surrogate model for active learning.");
29  params.addRequiredParam<UserObjectName>("covariance_function", "Name of covariance function.");
30  params.addParam<bool>(
31  "standardize_params", true, "Standardize (center and scale) training parameters (x values)");
32  params.addParam<bool>(
33  "standardize_data", true, "Standardize (center and scale) training data (y values)");
34  params.addParam<unsigned int>("num_iters", 1000, "Tolerance value for Adam optimization");
35  params.addParam<unsigned int>("batch_size", 0, "The batch size for Adam optimization");
36  params.addParam<Real>("learning_rate", 0.001, "The learning rate for Adam optimization");
37  params.addParam<MooseEnum>(
38  "optimizer",
39  MooseEnum("adam=0 legacy_adam=1", "adam"),
40  "The Adam optimizer semantics to use for Gaussian process hyperparameter tuning.");
41  params.addParam<unsigned int>(
42  "show_every_nth_iteration",
43  0,
44  "Switch to show Adam optimization loss values at every nth step. If 0, nothing is showed.");
45  params.addParam<std::vector<std::string>>(
46  "tune_parameters", {}, "Select hyperparameters to be tuned");
47  params.addParam<std::vector<Real>>("tuning_min", {}, "Minimum allowable tuning value");
48  params.addParam<std::vector<Real>>("tuning_max", {}, "Maximum allowable tuning value");
49  return params;
50 }
51 
53  : SurrogateTrainerBase(parameters),
54  CovarianceInterface(parameters),
56  _gp(declareModelData<StochasticTools::GaussianProcess>("_gp")),
57  _training_params(declareModelData<torch::Tensor>("_training_params")),
58  _training_data(declareModelData<torch::Tensor>("_training_data")),
59  _standardize_params(getParam<bool>("standardize_params")),
60  _standardize_data(getParam<bool>("standardize_data")),
61  _optimization_opts(StochasticTools::GaussianProcess::GPOptimizerOptions(
62  getParam<unsigned int>("show_every_nth_iteration"),
63  getParam<unsigned int>("num_iters"),
64  getParam<unsigned int>("batch_size"),
65  getParam<Real>("learning_rate"),
66  0.9,
67  0.999,
68  1e-7,
69  1e-4,
70  getParam<MooseEnum>("optimizer")
71  .getEnum<StochasticTools::GaussianProcess::OptimizerType>()))
72 {
73  _gp.initialize(getCovarianceFunctionByName(getParam<UserObjectName>("covariance_function")),
74  getParam<std::vector<std::string>>("tune_parameters"),
75  getParam<std::vector<Real>>("tuning_min"),
76  getParam<std::vector<Real>>("tuning_max"));
77 }
78 
79 void
80 ActiveLearningGaussianProcess::reTrain(const std::vector<std::vector<Real>> & inputs,
81  const std::vector<Real> & outputs) const
82 {
83  // Addtional error check for each re-train call of the GP surrogate
84  if (inputs.size() != outputs.size())
85  mooseError("Number of inputs (",
86  inputs.size(),
87  ") does not match number of outputs (",
88  outputs.size(),
89  ").");
90  if (inputs.empty())
91  mooseError("There is no data for retraining.");
92 
93  const auto input_size = inputs[0].size();
94  std::vector<Real> flat_inputs;
95  flat_inputs.reserve(outputs.size() * input_size);
96 
97  for (const auto & input : inputs)
98  {
99  if (input.size() != input_size)
100  mooseError("All active learning retraining inputs must have the same dimension.");
101  flat_inputs.insert(flat_inputs.end(), input.begin(), input.end());
102  }
103 
105  flat_inputs, {cast_int<int64_t>(outputs.size()), cast_int<int64_t>(input_size)});
107  LibtorchUtils::vectorToTensorCopy(outputs, {cast_int<int64_t>(outputs.size()), 1});
108 
111 
112  // Standardize (center and scale) training params
115  // if not standardizing data set mean=0, std=1 for use in surrogate
116  else
117  _gp.paramStandardizer().set(0, 1, input_size);
118 
119  // Standardize (center and scale) training data
120  if (_standardize_data)
122  // if not standardizing data set mean=0, std=1 for use in surrogate
123  else
124  _gp.dataStandardizer().set(0, 1);
125 
126  // Setup the covariance
128 }
129 
130 const std::vector<Real> &
132 {
133  return _gp.getLengthScales();
134 }
135 
138 {
139  return _gp.getDataStandardizer();
140 }
141 
142 void
143 ActiveLearningGaussianProcess::getNormTrainingOuts(std::vector<Real> & norm_training_outs) const
144 {
145  norm_training_outs.resize(_training_data.size(0));
146  const auto training_data = LibtorchUtils::toCPUContiguous(_training_data);
147  const auto data_accessor = training_data.accessor<Real, 2>();
148  for (unsigned int i = 0; i < norm_training_outs.size(); ++i)
149  norm_training_outs[i] = data_accessor[i][0];
150 }
151 
152 #endif
const T & getParam(const std::string &name) 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
torch::Tensor vectorToTensorCopy(const std::vector< DataType > &vector, c10::IntArrayRef sizes)
torch::Tensor toCPUContiguous(const torch::Tensor &tensor)
const std::vector< Real > & getLengthScales() const
Return the current length scales from GP training.
void addRequiredParam(const std::string &name, const std::string &doc_string)
torch::Tensor & _training_data
Outputs (y) used for training, along with statistics.
static InputParameters validParams()
Enum for batch type in stochastic tools MultiApp.
void standardizeParameters(torch::Tensor &parameters, bool keep_moments=false)
Standardizes the vector of input parameters (x values).
StochasticTools::Standardizer & dataStandardizer()
registerMooseObject("StochasticToolsApp", ActiveLearningGaussianProcess)
StochasticTools::Standardizer & paramStandardizer()
Get non-constant reference to the contained structures (if they need to be modified from the utside) ...
ActiveLearningGaussianProcess(const InputParameters &parameters)
torch::DeviceType getLibtorchDevice() const
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...
void setupCovarianceMatrix(const torch::Tensor &training_params, const torch::Tensor &training_data, const GPOptimizerOptions &opts)
Sets up the covariance matrix given data and optimization options.
torch::Tensor & _training_params
Paramaters (x) used for training, along with statistics.
bool _standardize_data
Switch for training data(y) standardization.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Interface for objects that need to use samplers.
NumberTensorValue Tensor
void set(const Real &n)
Methods for setting mean and standard deviation directly Sets mean=0, std=1 for n variables...
Definition: Standardizer.C:48
Class for standardizing data (centering and scaling)
Definition: Standardizer.h:24
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
const StochasticTools::Standardizer & getDataStandardizer() const
void moveToLibtorchDevice(torch::Tensor &tensor, const torch::DeviceType device_type)
StochasticTools::GaussianProcess & _gp
The GP handler.
const StochasticTools::GaussianProcess::GPOptimizerOptions _optimization_opts
Struct holding parameters necessary for parameter tuning.
This is the base trainer class whose main functionality is the API for declaring model data...
void standardizeData(torch::Tensor &data, bool keep_moments=false)
Standardizes the vector of responses (y values).
bool _standardize_params
Switch for training param (x) standardization.
const std::vector< Real > & getLengthScales() const
void ErrorVector unsigned int
const StochasticTools::Standardizer & getTrainingStandardizer() const
Return the training data outputs standardizer.
void getNormTrainingOuts(std::vector< Real > &norm_training_outs) const
Return the normalized training outputs.
CovarianceFunctionBase * getCovarianceFunctionByName(const UserObjectName &name) const
Lookup a CovarianceFunction object by name and return pointer.