https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
16
17#include "LibtorchUtils.h"
18
19namespace StochasticTools
20{
21
28{
29public:
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 {
194 }
195 const std::map<UserObjectName, std::string> & getDependentCovarTypes() const
196 {
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
230protected:
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
282template <>
283void dataStore(std::ostream & stream, StochasticTools::GaussianProcess & gp_utils, void * context);
284template <>
285void dataLoad(std::istream & stream, StochasticTools::GaussianProcess & gp_utils, void * context);
286
287#endif
void dataStore(std::ostream &stream, StochasticTools::GaussianProcess &gp_utils, void *context)
void dataLoad(std::istream &stream, StochasticTools::GaussianProcess &gp_utils, void *context)
Base class for covariance functions that are used in Gaussian Processes.
std::unordered_map< std::string, torch::Tensor > HyperParameterMap
Utility class dedicated to hold structures and functions commont to Gaussian Processes.
void standardizeParameters(torch::Tensor &parameters, bool keep_moments=false)
Standardizes the vector of input parameters (x values).
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...
CovarianceFunctionBase::HyperParameterMap HyperParameterMap
unsigned int _num_tunable
Number of tunable hyperparameters.
unsigned int _batch_size
The batch size for Adam optimization.
const torch::Tensor & getK() const
Real getLoss(torch::Tensor &inputs, torch::Tensor &outputs)
const std::map< UserObjectName, std::string > & getDependentCovarTypes() const
unsigned int _num_outputs
The number of outputs of the GP.
const unsigned int & getNumTunableParams() const
std::vector< Real > _length_scales
To return the GP length scales for active learning.
const std::vector< UserObjectName > & getDependentCovarNames() const
HyperParameterMap _hyperparam_map
Hyperparameters. Stored as tensors for use in surrogate reload/reporting.
std::unordered_map< std::string, std::tuple< unsigned int, unsigned int, Real, Real > > & tuningData()
std::vector< UserObjectName > & dependentCovarNames()
void linkCovarianceFunction(CovarianceFunctionBase *covariance_function)
Finds and links the covariance function to this object.
std::string _covar_type
Type of covariance function used for this GP.
const HyperParameterMap & getHyperParamMap() const
CovarianceFunctionBase & covarFunction()
const StochasticTools::Standardizer & getParamStandardizer() const
Get constant reference to the contained structures.
const torch::Tensor & getKCholeskyDecomp() const
const CovarianceFunctionBase * getCovarFunctionPtr() const
std::vector< Real > & lengthScales()
std::string _covar_name
The name of the covariance function used in this GP.
void setupStoredMatrices(const torch::Tensor &input)
Sets up the Cholesky decomposition and inverse action of the covariance matrix.
std::map< UserObjectName, std::string > & dependentCovarTypes()
const std::string & getCovarType() const
CovarianceFunctionBase * _covariance_function
Covariance function object.
const std::string & getCovarName() const
void tuneHyperParamsAdam(const torch::Tensor &training_params, const torch::Tensor &training_data, const GPOptimizerOptions &opts)
const CovarianceFunctionBase & getCovarFunction() const
StochasticTools::Standardizer & paramStandardizer()
Get non-constant reference to the contained structures (if they need to be modified from the utside)
StochasticTools::Standardizer & dataStandardizer()
void standardizeData(torch::Tensor &data, bool keep_moments=false)
Standardizes the vector of responses (y values).
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.
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.
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 _K_results_solve
A solve of Ax=b via Cholesky.
const std::vector< Real > & getLengthScales() const
HyperParameterMap & hyperparamMap()
const torch::Tensor & getKResultsSolve() const
StochasticTools::Standardizer _param_standardizer
Standardizer for use with params (x)
std::vector< Real > getGradient(torch::Tensor &inputs) const
const StochasticTools::Standardizer & getDataStandardizer() const
torch::Tensor _K
An _n_sample by _n_sample covariance matrix constructed from the selected kernel function.
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.
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.
CovarianceFunctionBase * covarFunctionPtr()
std::map< UserObjectName, std::string > _dependent_covar_types
The types of the covariance functions the used covariance function depends on.
torch::Tensor _K_cho_decomp
Cholesky decomposition libtorch tensor object.
std::vector< UserObjectName > _dependent_covar_names
The names of the covariance functions the used covariance function depends on.
const unsigned int & getCovarNumOutputs() const
StochasticTools::Standardizer _data_standardizer
Standardizer for use with data (y)
Class for standardizing data (centering and scaling)
Enum for batch type in stochastic tools MultiApp.
Structure containing the optimization options for hyperparameter-tuning.
const Real b1
Tuning parameter from the paper.
const unsigned int num_iter
The number of iterations for Adam optimizer.
const Real eps
Tuning parameter from the paper.
const Real b2
Tuning parameter from the paper.
const OptimizerType optimizer_type
Adam optimizer mode to use.
const Real learning_rate
The learning rate for Adam optimizer.
const unsigned int batch_size
The batch size for Adam optimizer.
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.