34mtbGPR::mtbGPR(
const Foam::dictionary& dict)
36 kernelTypeWord_ = dict.lookupOrDefault<Foam::word>(
"kernel",
"matern");
37 useDataNormalization_ = dict.lookupOrDefault<
bool>(
"normalize",
true);
38 optimizeHyperparams_ = dict.lookupOrDefault<
bool>(
"optimizeHyperparams",
true);
39 kernelScale_ = dict.lookupOrDefault<Foam::scalar>(
"kernelScale", 0.10);
40 lengthScale_ = dict.lookupOrDefault<Foam::scalar>(
"lengthScale", 0.10);
41 noise_ = dict.lookupOrDefault<Foam::scalar>(
"noise", 1e-5);
44mtbGPR::~mtbGPR() =
default;
46mathtoolbox::GaussianProcessRegressor::KernelType mtbGPR::parseKernelType(
const Foam::word& kernelWord)
const
48 const Foam::word lower = kernelWord;
49 if (lower ==
"matern")
51 return mathtoolbox::GaussianProcessRegressor::KernelType::ArdMatern52;
53 else if (lower ==
"squared_exp")
55 return mathtoolbox::GaussianProcessRegressor::KernelType::ArdSquaredExp;
59 <<
"Unknown GPR kernel: " << kernelWord
60 <<
". Valid options are: matern, squared_exp"
61 << Foam::exit(Foam::FatalError);
62 return mathtoolbox::GaussianProcessRegressor::KernelType::ArdMatern52;
65void mtbGPR::fit(
const Eigen::MatrixXd& X,
const Eigen::VectorXd& y)
69 FatalErrorInFunction <<
"Input matrix has zero rows" << Foam::exit(Foam::FatalError);
71 if (X.cols() != y.size())
74 <<
"Input size mismatch: cols(X) = " << X.cols() <<
", size(y) = " << y.size()
75 << Foam::exit(Foam::FatalError);
78 const auto kernelType = parseKernelType(kernelTypeWord_);
80 Eigen::VectorXd kernelHyperparams = Eigen::VectorXd::Constant(X.rows() + 1, lengthScale_);
81 kernelHyperparams[0] = kernelScale_;
83 impl_ = std::make_unique<mathtoolbox::GaussianProcessRegressor>(X, y, kernelType, useDataNormalization_);
85 if (optimizeHyperparams_)
87 impl_->PerformMaximumLikelihood(kernelHyperparams, noise_);
91 impl_->SetHyperparams(kernelHyperparams, noise_);
95Foam::scalar mtbGPR::predict(
const Eigen::VectorXd& x)
99 FatalErrorInFunction <<
"mtbGPR used before calling fit()" << Foam::exit(Foam::FatalError);
101 return impl_->PredictMean(x);
104Eigen::VectorXd mtbGPR::predict(
const Eigen::MatrixXd& X)
108 FatalErrorInFunction <<
"mtbGPR used before calling fit()" << Foam::exit(Foam::FatalError);
111 Eigen::VectorXd result(X.cols());
112 for (
int i = 0; i < X.cols(); ++i)
114 result(i) = impl_->PredictMean(X.col(i));
119void mtbGPR::printInfo()
const
121 Foam::Info <<
"mtbGPR Model Info:" << Foam::endl;
122 Foam::Info <<
"\t kernel: " << kernelTypeWord_ << Foam::endl;
123 Foam::Info <<
"\t normalize: " << (useDataNormalization_ ?
"true" :
"false") << Foam::endl;
124 Foam::Info <<
"\t optimizeHyperparams: " << (optimizeHyperparams_ ?
"true" :
"false") << Foam::endl;
125 Foam::Info <<
"\t kernelScale: " << kernelScale_ << Foam::endl;
126 Foam::Info <<
"\t lengthScale: " << lengthScale_ << Foam::endl;
127 Foam::Info <<
"\t noise: " << noise_ << Foam::endl;