9 #ifdef MOOSE_LIBTORCH_ENABLED 23 "Length factors to use for Covariance Kernel");
25 "Signal Variance ($\\sigma_f^2$) to use for kernel calculation.");
27 "noise_variance", 0.0,
"Noise Variance ($\\sigma_n^2$) to use for kernel calculation.");
29 "p",
"Integer p to use for Matern Half Integer Covariance Kernel");
35 _length_factor(addVectorRealHyperParameter(
36 "length_factor", getParam<
std::vector<
Real>>(
"length_factor"), true)),
38 addRealHyperParameter(
"signal_variance", getParam<
Real>(
"signal_variance"), true)),
40 addRealHyperParameter(
"noise_variance", getParam<
Real>(
"noise_variance"), true)),
41 _p(addRealHyperParameter(
"p", getParam<unsigned
int>(
"p"), false))
47 const torch::Tensor &
x,
48 const torch::Tensor & xp,
49 const bool is_self_covariance)
const 52 mooseError(
"length_factor size does not match dimension of trainer input.");
60 const torch::Tensor &
x,
61 const torch::Tensor & xp,
62 const torch::Tensor & length_factor,
63 const torch::Tensor & sigma_f_squared,
64 const torch::Tensor & sigma_n_squared,
65 const torch::Tensor &
p,
66 const bool is_self_covariance)
69 mooseAssert(
x.sizes()[1] == xp.sizes()[1],
70 "Number of parameters do not match in covariance kernel calculation");
72 const auto l_factor = length_factor.unsqueeze(0);
73 K = torch::cdist(torch::div(
x, l_factor), torch::div(xp, l_factor), 2.0);
74 const Real factor = std::sqrt(2 * p_value + 1);
75 const Real normalization = std::tgamma(p_value + 1) / std::tgamma(2 * p_value + 1);
77 auto summation = torch::zeros_like(
K);
80 const Real coefficient =
81 std::tgamma(p_value + tt + 1) / (std::tgamma(tt + 1) * std::tgamma(p_value - tt + 1));
82 summation = summation + coefficient *
torch::pow(2.0 * factor *
K,
Real(p_value - tt));
85 K = sigma_f_squared * torch::exp(-factor *
K) * normalization * summation;
86 if (is_self_covariance)
87 K.diagonal().add_(sigma_n_squared);
92 const torch::Tensor &
x,
93 const std::string & hyper_param_name,
94 unsigned int ind)
const 96 if (
name().length() + 1 > hyper_param_name.length())
99 const std::string name_without_prefix = hyper_param_name.substr(
name().length() + 1);
101 if (name_without_prefix ==
"noise_variance")
103 const auto options =
x.options().dtype(at::kDouble);
108 torch::tensor(0.0, options),
109 torch::tensor(1.0, options),
115 if (name_without_prefix ==
"signal_variance")
117 const auto options =
x.options().dtype(at::kDouble);
122 torch::tensor(1.0, options),
123 torch::tensor(0.0, options),
129 if (name_without_prefix ==
"length_factor")
140 const torch::Tensor &
x,
141 const torch::Tensor & length_factor,
142 const torch::Tensor & sigma_f_squared,
143 const torch::Tensor &
p,
148 mooseAssert(ind <
x.sizes()[1],
"Incorrect length factor index");
150 const auto l_factor = length_factor.unsqueeze(0);
151 const auto scaled_distance = torch::cdist(torch::div(
x, l_factor), torch::div(
x, l_factor), 2.0);
152 const auto nonzero_distance = scaled_distance > 0;
153 const auto safe_scaled_distance =
154 torch::where(nonzero_distance, scaled_distance, torch::ones_like(scaled_distance));
155 const Real factor = std::sqrt(2 * p_value + 1);
156 const Real normalization = std::tgamma(p_value + 1) / std::tgamma(2 * p_value + 1);
158 auto summation = torch::zeros_like(safe_scaled_distance);
161 const Real coefficient =
162 std::tgamma(p_value + tt + 1) / (std::tgamma(tt + 1) * std::tgamma(p_value - tt + 1));
163 summation = summation +
164 coefficient *
torch::pow(2.0 * factor * safe_scaled_distance,
Real(p_value - tt));
167 auto summation_derivative = torch::zeros_like(safe_scaled_distance);
170 const Real coefficient =
171 std::tgamma(p_value + tt + 1) / (std::tgamma(tt + 1) * std::tgamma(p_value - tt + 1));
172 summation_derivative =
173 summation_derivative +
174 coefficient * 2.0 * factor * (p_value - tt) *
175 torch::pow(2.0 * factor * safe_scaled_distance,
Real(p_value - tt - 1));
178 const auto coordinate =
x.select(1, ind);
179 const auto coordinate_distance_squared =
180 torch::pow(coordinate.unsqueeze(1) - coordinate.unsqueeze(0), 2);
181 const auto length_factor_ind = length_factor.select(0, ind);
182 const auto dr_dlength_factor =
183 -coordinate_distance_squared / (
torch::pow(length_factor_ind, 3) * safe_scaled_distance);
184 const auto dK_dlength_factor = sigma_f_squared * normalization *
185 torch::exp(-factor * safe_scaled_distance) *
186 (summation_derivative - factor * summation) * dr_dlength_factor;
188 K = torch::where(nonzero_distance, dK_dlength_factor, torch::zeros_like(dK_dlength_factor));
const torch::Tensor & _sigma_f_squared
signal variance (^2)
static const std::string K
torch::Tensor toCPUContiguous(const torch::Tensor &tensor)
Base class for covariance functions that are used in Gaussian Processes.
static InputParameters validParams()
registerMooseObject("StochasticToolsApp", MaternHalfIntCovariance)
const std::string & name() const
const std::vector< double > x
static InputParameters validParams()
const torch::Tensor & _length_factor
lengh factor () for the kernel, in vector form for multiple parameters
const torch::Tensor & _p
non-negative p factor for use in Matern half-int. = p+(1/2) in terms of general Matern ...
static void maternHalfIntFunction(torch::Tensor &K, const torch::Tensor &x, const torch::Tensor &xp, const torch::Tensor &length_factor, const torch::Tensor &sigma_f_squared, const torch::Tensor &sigma_n_squared, const torch::Tensor &p, const bool is_self_covariance)
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
static void computedKdlf(torch::Tensor &K, const torch::Tensor &x, const torch::Tensor &length_factor, const torch::Tensor &sigma_f_squared, const torch::Tensor &p, const int ind)
Computes dK/dlf for individual length factors.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)
void mooseError(Args &&... args) const
const torch::Tensor & _sigma_n_squared
noise variance (^2)
MaternHalfIntCovariance(const InputParameters ¶meters)
void ErrorVector unsigned int
bool computedKdhyper(torch::Tensor &dKdhp, const torch::Tensor &x, const std::string &hyper_param_name, unsigned int ind) const override
Redirect dK/dhp for hyperparameter "hp".
void computeCovarianceMatrix(torch::Tensor &K, const torch::Tensor &x, const torch::Tensor &xp, const bool is_self_covariance) const override
Generates the Covariance Matrix given two points in the parameter space.