https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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{
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
79void
80ActiveLearningGaussianProcess::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
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
130const std::vector<Real> &
135
141
142void
143ActiveLearningGaussianProcess::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
registerMooseObject("StochasticToolsApp", ActiveLearningGaussianProcess)
void ErrorVector unsigned int
torch::Tensor & _training_data
Outputs (y) used for training, along with statistics.
const std::vector< Real > & getLengthScales() const
Return the current length scales from GP training.
StochasticTools::GaussianProcess & _gp
The GP handler.
bool _standardize_params
Switch for training param (x) standardization.
virtual void reTrain(const std::vector< std::vector< Real > > &inputs, const std::vector< Real > &outputs) const final
ActiveLearningGaussianProcess(const InputParameters &parameters)
const StochasticTools::GaussianProcess::GPOptimizerOptions _optimization_opts
Struct holding parameters necessary for parameter tuning.
void getNormTrainingOuts(std::vector< Real > &norm_training_outs) const
Return the normalized training outputs.
const StochasticTools::Standardizer & getTrainingStandardizer() const
Return the training data outputs standardizer.
torch::Tensor & _training_params
Paramaters (x) used for training, along with statistics.
bool _standardize_data
Switch for training data(y) standardization.
CovarianceFunctionBase * getCovarianceFunctionByName(const UserObjectName &name) const
Lookup a CovarianceFunction object by name and return pointer.
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
torch::DeviceType getLibtorchDevice() const
void mooseError(Args &&... args) const
const T & getParam(const std::string &name) const
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...
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).
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.
const std::vector< Real > & getLengthScales() const
const StochasticTools::Standardizer & getDataStandardizer() const
Class for standardizing data (centering and scaling)
void set(const Real &n)
Methods for setting mean and standard deviation directly Sets mean=0, std=1 for n variables.
Interface for objects that need to use samplers.
This is the base trainer class whose main functionality is the API for declaring model data.
static InputParameters validParams()
torch::Tensor toCPUContiguous(const torch::Tensor &tensor)
void moveToLibtorchDevice(torch::Tensor &tensor, const torch::DeviceType device_type)
torch::Tensor vectorToTensorCopy(const std::vector< DataType > &vector, c10::IntArrayRef sizes)
Enum for batch type in stochastic tools MultiApp.