https://mooseframework.inl.gov
GaussianProcessSurrogate.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 
11 #include "Sampler.h"
12 
13 #include "CovarianceFunctionBase.h"
14 
15 registerMooseObject("StochasticToolsApp", GaussianProcessSurrogate);
16 
19 {
21  params.addClassDescription("Computes and evaluates Gaussian Process surrogate model.");
22  return params;
23 }
24 
26  : SurrogateModel(parameters),
27  CovarianceInterface(parameters),
28  _gp(declareModelData<StochasticTools::GaussianProcess>("_gp")),
29  _training_params(getModelData<RealEigenMatrix>("_training_params"))
30 {
31 }
32 
33 void
35 {
36  if (_gp.getCovarFunctionPtr() != nullptr)
37  ::mooseError("Attempting to redefine covariance function using setupCovariance.");
39 }
40 
41 Real
42 GaussianProcessSurrogate::evaluate(const std::vector<Real> & x) const
43 {
44  // Overlaod for evaluate to maintain general compatibility. Only returns mean
45  Real dummy = 0;
46  return this->evaluate(x, dummy);
47 }
48 
49 Real
50 GaussianProcessSurrogate::evaluate(const std::vector<Real> & x, Real & std_dev) const
51 {
52  std::vector<Real> y;
53  std::vector<Real> std;
54  this->evaluate(x, y, std);
55  std_dev = std[0];
56  return y[0];
57 }
58 
59 void
60 GaussianProcessSurrogate::evaluate(const std::vector<Real> & x, std::vector<Real> & y) const
61 {
62  // Overlaod for evaluate to maintain general compatibility. Only returns mean
63  std::vector<Real> std_dummy;
64  this->evaluate(x, y, std_dummy);
65 }
66 
67 void
68 GaussianProcessSurrogate::evaluate(const std::vector<Real> & x,
69  std::vector<Real> & y,
70  std::vector<Real> & std) const
71 {
72  const unsigned int n_dims = _training_params.cols();
73 
74  mooseAssert(x.size() == n_dims,
75  "Number of parameters provided for evaluation does not match number of parameters "
76  "used for training.");
77  const unsigned int n_outputs = _gp.getCovarFunction().numOutputs();
78 
79  y = std::vector<Real>(n_outputs, 0.0);
80  std = std::vector<Real>(n_outputs, 0.0);
81 
82  RealEigenMatrix test_points(1, n_dims);
83  for (unsigned int ii = 0; ii < n_dims; ++ii)
84  test_points(0, ii) = x[ii];
85 
87 
88  RealEigenMatrix K_train_test(_training_params.rows() * n_outputs, n_outputs);
89 
91  K_train_test, _training_params, test_points, false);
92  RealEigenMatrix K_test(n_outputs, n_outputs);
93  _gp.getCovarFunction().computeCovarianceMatrix(K_test, test_points, test_points, true);
94 
95  // Compute the predicted mean value (centered)
96  RealEigenMatrix pred_value = (K_train_test.transpose() * _gp.getKResultsSolve()).transpose();
97  // De-center/scale the value and store for return
99 
100  RealEigenMatrix pred_var =
101  K_test - (K_train_test.transpose() * _gp.getKCholeskyDecomp().solve(K_train_test));
102 
103  // Vairance computed, take sqrt for standard deviation, scale up by training data std and store
104  RealEigenMatrix std_dev_mat = pred_var.array().sqrt();
105  _gp.getDataStandardizer().getDescaled(std_dev_mat);
106 
107  for (const auto output_i : make_range(n_outputs))
108  {
109  y[output_i] = pred_value(0, output_i);
110  std[output_i] = std_dev_mat(output_i, output_i);
111  }
112 }
void linkCovarianceFunction(CovarianceFunctionBase *covariance_function)
Finds and links the covariance function to this object.
const RealEigenMatrix & getKResultsSolve() const
void getDescaled(RealEigenMatrix &input) const
De-scales the assumed scaled input.
Definition: Standardizer.C:97
virtual void setupCovariance(UserObjectName _covar_name)
This function is called by LoadCovarianceDataAction when the surrogate is loading training data from ...
void getStandardized(RealEigenMatrix &input) const
Returns the standardized (centered and scaled) of the provided input.
Definition: Standardizer.C:80
const CovarianceFunctionBase & getCovarFunction() const
const std::vector< double > y
const RealEigenMatrix & _training_params
Paramaters (x) used for training.
Enum for batch type in stochastic tools MultiApp.
static InputParameters validParams()
const std::vector< double > x
void getDestandardized(RealEigenMatrix &input) const
De-standardizes (de-centered and de-scaled) the assumed standardized input.
Definition: Standardizer.C:88
const CovarianceFunctionBase * getCovarFunctionPtr() const
Eigen::Matrix< Real, Eigen::Dynamic, Eigen::Dynamic > RealEigenMatrix
const Eigen::LLT< RealEigenMatrix > & getKCholeskyDecomp() const
const StochasticTools::Standardizer & getParamStandardizer() const
Get constant reference to the contained structures.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
registerMooseObject("StochasticToolsApp", GaussianProcessSurrogate)
virtual void computeCovarianceMatrix(RealEigenMatrix &K, const RealEigenMatrix &x, const RealEigenMatrix &xp, const bool is_self_covariance) const =0
Generates the Covariance Matrix given two sets of points in the parameter space.
IntRange< T > make_range(T beg, T end)
void mooseError(Args &&... args) const
virtual Real evaluate(const std::vector< Real > &x) const
Evaluate surrogate model given a row of parameters.
void addClassDescription(const std::string &doc_string)
StochasticTools::GaussianProcess & _gp
unsigned int numOutputs() const
Return the number of outputs assumed for this covariance function.
const StochasticTools::Standardizer & getDataStandardizer() const
static InputParameters validParams()
GaussianProcessSurrogate(const InputParameters &parameters)
CovarianceFunctionBase * getCovarianceFunctionByName(const UserObjectName &name) const
Lookup a CovarianceFunction object by name and return pointer.