https://mooseframework.inl.gov
GaussianProcess.h
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 
11 #pragma once
12 
13 #include "Standardizer.h"
14 
15 #include "CovarianceFunctionBase.h"
16 
17 #include "LibtorchUtils.h"
18 
19 namespace StochasticTools
20 {
21 
28 {
29 public:
31 
33 
34  enum class OptimizerType
35  {
36  Adam,
38  };
39 
50  void initialize(CovarianceFunctionBase * covariance_function,
51  const std::vector<std::string> & params_to_tune,
52  const std::vector<Real> & min = std::vector<Real>(),
53  const std::vector<Real> & max = std::vector<Real>());
54 
58  {
73  GPOptimizerOptions(const unsigned int show_every_nth_iteration = 0,
74  const unsigned int num_iter = 1000,
75  const unsigned int batch_size = 0,
76  const Real learning_rate = 1e-3,
77  const Real b1 = 0.9,
78  const Real b2 = 0.999,
79  const Real eps = 1e-7,
80  const Real lambda = 1e-4,
82 
84  const unsigned int show_every_nth_iteration = 0;
86  const unsigned int num_iter = 1000;
88  const unsigned int batch_size = 0;
90  const Real learning_rate = 1e-3;
92  const Real b1 = 0.9;
94  const Real b2 = 0.999;
96  const Real eps = 1e-7;
98  const Real lambda = 1e-4;
101  };
110  void setupCovarianceMatrix(const torch::Tensor & training_params,
111  const torch::Tensor & training_data,
112  const GPOptimizerOptions & opts);
113 
118  void setupStoredMatrices(const torch::Tensor & input);
119 
126  void linkCovarianceFunction(CovarianceFunctionBase * covariance_function);
127 
134  void generateTuningMap(const std::vector<std::string> & params_to_tune,
135  const std::vector<Real> & min = std::vector<Real>(),
136  const std::vector<Real> & max = std::vector<Real>());
137 
143  void standardizeParameters(torch::Tensor & parameters, bool keep_moments = false);
144 
150  void standardizeData(torch::Tensor & data, bool keep_moments = false);
151 
152  // Tune hyperparameters using Adam with manually supplied gradients
153  void tuneHyperParamsAdam(const torch::Tensor & training_params,
154  const torch::Tensor & training_data,
155  const GPOptimizerOptions & opts);
156 
157  // Computes the loss function
158  Real getLoss(torch::Tensor & inputs, torch::Tensor & outputs);
159 
160  // Computes Gradient of the loss function
161  std::vector<Real> getGradient(torch::Tensor & inputs) const;
162 
165  void mapToVec(
166  const std::unordered_map<std::string, std::tuple<unsigned int, unsigned int, Real, Real>> &
167  tuning_data,
168  const HyperParameterMap & hyperparam_map,
169  std::vector<Real> & vec) const;
170 
172  void vecToMap(
173  const std::unordered_map<std::string, std::tuple<unsigned int, unsigned int, Real, Real>> &
174  tuning_data,
175  HyperParameterMap & hyperparam_map,
176  const std::vector<Real> & vec) const;
177 
179 
184  const torch::Tensor & getK() const { return _K; }
185  const torch::Tensor & getKResultsSolve() const { return _K_results_solve; }
186  const torch::Tensor & getKCholeskyDecomp() const { return _K_cho_decomp; }
189  const std::string & getCovarType() const { return _covar_type; }
190  const std::string & getCovarName() const { return _covar_name; }
191  const std::vector<UserObjectName> & getDependentCovarNames() const
192  {
193  return _dependent_covar_names;
194  }
195  const std::map<UserObjectName, std::string> & getDependentCovarTypes() const
196  {
197  return _dependent_covar_types;
198  }
199  const unsigned int & getCovarNumOutputs() const { return _num_outputs; }
200  const unsigned int & getNumTunableParams() const { return _num_tunable; }
202  const std::vector<Real> & getLengthScales() const { return _length_scales; }
204 
206 
212  torch::Tensor & K() { return _K; }
213  torch::Tensor & KResultsSolve() { return _K_results_solve; }
214  torch::Tensor & KCholeskyDecomp() { return _K_cho_decomp; }
217  std::string & covarType() { return _covar_type; }
218  std::string & covarName() { return _covar_name; }
219  std::map<UserObjectName, std::string> & dependentCovarTypes() { return _dependent_covar_types; }
220  std::vector<UserObjectName> & dependentCovarNames() { return _dependent_covar_names; }
221  unsigned int & covarNumOutputs() { return _num_outputs; }
222  std::unordered_map<std::string, std::tuple<unsigned int, unsigned int, Real, Real>> & tuningData()
223  {
224  return _tuning_data;
225  }
227  std::vector<Real> & lengthScales() { return _length_scales; }
229 
230 protected:
233 
235  std::unordered_map<std::string, std::tuple<unsigned int, unsigned int, Real, Real>> _tuning_data;
236 
238  unsigned int _num_tunable = 0;
239 
241  std::string _covar_type;
242 
244  std::string _covar_name;
245 
247  std::vector<UserObjectName> _dependent_covar_names;
248 
250  std::map<UserObjectName, std::string> _dependent_covar_types;
251 
253  unsigned int _num_outputs = 0;
254 
257 
260 
263 
265  torch::Tensor _K;
266 
268  torch::Tensor _K_results_solve;
269 
271  torch::Tensor _K_cho_decomp;
272 
274  unsigned int _batch_size = 0;
275 
277  std::vector<Real> _length_scales;
278 };
279 
280 } // StochasticTools namespac
281 
282 template <>
283 void dataStore(std::ostream & stream, StochasticTools::GaussianProcess & gp_utils, void * context);
284 template <>
285 void dataLoad(std::istream & stream, StochasticTools::GaussianProcess & gp_utils, void * context);
286 
287 #endif
unsigned int _num_tunable
Number of tunable hyperparameters.
void linkCovarianceFunction(CovarianceFunctionBase *covariance_function)
Finds and links the covariance function to this object.
const std::vector< UserObjectName > & getDependentCovarNames() const
GPOptimizerOptions(const unsigned int show_every_nth_iteration=0, const unsigned int num_iter=1000, const unsigned int batch_size=0, const Real learning_rate=1e-3, const Real b1=0.9, const Real b2=0.999, const Real eps=1e-7, const Real lambda=1e-4, const OptimizerType optimizer_type=OptimizerType::Adam)
Construct a new GPOptimizerOptions object using input parameters that will control the optimization...
CovarianceFunctionBase::HyperParameterMap HyperParameterMap
CovarianceFunctionBase * _covariance_function
Covariance function object.
const HyperParameterMap & getHyperParamMap() const
const torch::Tensor & getKResultsSolve() const
StochasticTools::Standardizer _data_standardizer
Standardizer for use with data (y)
const Real lambda
Legacy MOOSE shrink parameter.
const unsigned int show_every_nth_iteration
Switch to enable verbose output for parameter tuning at every n-th iteration.
std::map< UserObjectName, std::string > & dependentCovarTypes()
std::unordered_map< std::string, torch::Tensor > HyperParameterMap
torch::Tensor _K_results_solve
A solve of Ax=b via Cholesky.
std::unordered_map< std::string, std::tuple< unsigned int, unsigned int, Real, Real > > & tuningData()
const CovarianceFunctionBase & getCovarFunction() const
const Real eps
Tuning parameter from the paper.
void generateTuningMap(const std::vector< std::string > &params_to_tune, const std::vector< Real > &min=std::vector< Real >(), const std::vector< Real > &max=std::vector< Real >())
Sets up the tuning map which is used if the user requires parameter tuning.
Base class for covariance functions that are used in Gaussian Processes.
StochasticTools::Standardizer _param_standardizer
Standardizer for use with params (x)
void tuneHyperParamsAdam(const torch::Tensor &training_params, const torch::Tensor &training_data, const GPOptimizerOptions &opts)
std::string _covar_name
The name of the covariance function used in this GP.
std::map< UserObjectName, std::string > _dependent_covar_types
The types of the covariance functions the used covariance function depends on.
const unsigned int & getCovarNumOutputs() const
HyperParameterMap _hyperparam_map
Hyperparameters. Stored as tensors for use in surrogate reload/reporting.
const unsigned int batch_size
The batch size for Adam optimizer.
const torch::Tensor & getK() const
const unsigned int & getNumTunableParams() const
Structure containing the optimization options for hyperparameter-tuning.
HyperParameterMap & hyperparamMap()
unsigned int _num_outputs
The number of outputs of the GP.
CovarianceFunctionBase & covarFunction()
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).
torch::Tensor _K_cho_decomp
Cholesky decomposition libtorch tensor object.
StochasticTools::Standardizer & dataStandardizer()
StochasticTools::Standardizer & paramStandardizer()
Get non-constant reference to the contained structures (if they need to be modified from the utside) ...
const std::string & getCovarName() const
const Real b2
Tuning parameter from the paper.
std::vector< UserObjectName > _dependent_covar_names
The names of the covariance functions the used covariance function depends on.
const OptimizerType optimizer_type
Adam optimizer mode to use.
const CovarianceFunctionBase * getCovarFunctionPtr() const
const Real b1
Tuning parameter from the paper.
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.
void setupStoredMatrices(const torch::Tensor &input)
Sets up the Cholesky decomposition and inverse action of the covariance matrix.
void mapToVec(const std::unordered_map< std::string, std::tuple< unsigned int, unsigned int, Real, Real >> &tuning_data, const HyperParameterMap &hyperparam_map, std::vector< Real > &vec) const
Function used to convert the hyperparameter map in this object to a flat vector.
std::unordered_map< std::string, std::tuple< unsigned int, unsigned int, Real, Real > > _tuning_data
Contains tuning inforation. Index of hyperparam, size, and min/max bounds.
const torch::Tensor & getKCholeskyDecomp() const
const StochasticTools::Standardizer & getParamStandardizer() const
Get constant reference to the contained structures.
const std::map< UserObjectName, std::string > & getDependentCovarTypes() const
unsigned int _batch_size
The batch size for Adam optimization.
std::vector< Real > _length_scales
To return the GP length scales for active learning.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< Real > getGradient(torch::Tensor &inputs) const
Real getLoss(torch::Tensor &inputs, torch::Tensor &outputs)
const unsigned int num_iter
The number of iterations for Adam optimizer.
Class for standardizing data (centering and scaling)
Definition: Standardizer.h:24
void dataLoad(std::istream &stream, StochasticTools::GaussianProcess &gp_utils, void *context)
void vecToMap(const std::unordered_map< std::string, std::tuple< unsigned int, unsigned int, Real, Real >> &tuning_data, HyperParameterMap &hyperparam_map, const std::vector< Real > &vec) const
Function used to convert the vector back to the hyperparameter map.
std::string _covar_type
Type of covariance function used for this GP.
torch::Tensor _K
An _n_sample by _n_sample covariance matrix constructed from the selected kernel function.
std::vector< Real > & lengthScales()
const StochasticTools::Standardizer & getDataStandardizer() const
void dataStore(std::ostream &stream, StochasticTools::GaussianProcess &gp_utils, void *context)
const std::string & getCovarType() const
void standardizeData(torch::Tensor &data, bool keep_moments=false)
Standardizes the vector of responses (y values).
Utility class dedicated to hold structures and functions commont to Gaussian Processes.
std::vector< UserObjectName > & dependentCovarNames()
CovarianceFunctionBase * covarFunctionPtr()
const std::vector< Real > & getLengthScales() const
const Real learning_rate
The learning rate for Adam optimizer.