1 #ifndef STAN_MATH_PRIM_MAT_FUN_GP_EXP_QUAD_COV_HPP 2 #define STAN_MATH_PRIM_MAT_FUN_GP_EXP_QUAD_COV_HPP 34 template <
typename T_x,
typename T_sigma,
typename T_l>
36 typename Eigen::Matrix<typename stan::return_type<T_x, T_sigma, T_l>::type,
37 Eigen::Dynamic, Eigen::Dynamic>
39 const T_l &length_scale) {
44 size_t x_size = x.size();
45 Eigen::Matrix<typename stan::return_type<T_x, T_sigma, T_l>::type,
46 Eigen::Dynamic, Eigen::Dynamic>
52 for (
size_t n = 0; n < x.size(); ++n)
55 T_sigma sigma_sq =
square(sigma);
56 T_l neg_half_inv_l_sq = -0.5 /
square(length_scale);
58 for (
size_t j = 0; j < x_size; ++j) {
60 for (
size_t i = j + 1; i < x_size; ++i) {
63 cov(j, i) = cov(i, j);
83 template <
typename T_x,
typename T_sigma,
typename T_l>
85 typename Eigen::Matrix<typename stan::return_type<T_x, T_sigma, T_l>::type,
86 Eigen::Dynamic, Eigen::Dynamic>
89 const std::vector<T_l> &length_scale) {
95 size_t x_size = x.size();
96 Eigen::Matrix<typename stan::return_type<T_x, T_sigma, T_l>::type,
97 Eigen::Dynamic, Eigen::Dynamic>
102 size_t l_size = length_scale.size();
104 "number of length scales", l_size);
106 T_sigma sigma_sq =
square(sigma);
108 Eigen::Matrix<typename return_type<T_x, T_l>::type, Eigen::Dynamic, 1>>
111 for (
size_t j = 0; j < x_size; ++j) {
112 cov(j, j) = sigma_sq;
113 for (
size_t i = j + 1; i < x_size; ++i) {
115 cov(j, i) = cov(i, j);
141 template <
typename T_x1,
typename T_x2,
typename T_sigma,
typename T_l>
142 inline typename Eigen::Matrix<
146 const T_sigma &sigma,
const T_l &length_scale) {
149 const char *function_name =
"gp_exp_quad_cov";
153 size_t x1_size = x1.size();
154 size_t x2_size = x2.size();
155 Eigen::Matrix<typename stan::return_type<T_x1, T_x2, T_sigma, T_l>::type,
156 Eigen::Dynamic, Eigen::Dynamic>
157 cov(x1_size, x2_size);
158 if (x1_size == 0 || x2_size == 0)
161 for (
size_t i = 0; i < x1_size; ++i)
163 for (
size_t i = 0; i < x2_size; ++i)
166 T_sigma sigma_sq =
square(sigma);
167 T_l neg_half_inv_l_sq = -0.5 /
square(length_scale);
169 for (
size_t i = 0; i < x1.size(); ++i) {
170 for (
size_t j = 0; j < x2.size(); ++j) {
197 template <
typename T_x1,
typename T_x2,
typename T_s,
typename T_l>
198 inline typename Eigen::Matrix<
202 const std::vector<Eigen::Matrix<T_x2, Eigen::Dynamic, 1>> &x2,
203 const T_s &sigma,
const std::vector<T_l> &length_scale) {
205 size_t x1_size = x1.size();
206 size_t x2_size = x2.size();
207 size_t l_size = length_scale.size();
209 Eigen::Matrix<typename stan::return_type<T_x1, T_x2, T_s, T_l>::type,
210 Eigen::Dynamic, Eigen::Dynamic>
211 cov(x1_size, x2_size);
212 if (x1_size == 0 || x2_size == 0)
215 const char *function_name =
"gp_exp_quad_cov";
216 for (
size_t i = 0; i < x1_size; ++i)
218 for (
size_t i = 0; i < x2_size; ++i)
223 "number of length scales", l_size);
225 "number of length scales", l_size);
227 T_s sigma_sq =
square(sigma);
229 std::vector<Eigen::Matrix<typename return_type<T_x1, T_l, T_s>::type,
232 std::vector<Eigen::Matrix<typename return_type<T_x2, T_l, T_s>::type,
236 for (
size_t i = 0; i < x1_size; ++i) {
237 for (
size_t j = 0; j < x2_size; ++j) {
Eigen::Matrix< typename stan::return_type< T_x, T_sigma, T_l >::type, Eigen::Dynamic, Eigen::Dynamic > gp_exp_quad_cov(const std::vector< T_x > &x, const T_sigma &sigma, const T_l &length_scale)
Returns a squared exponential kernel.
void check_size_match(const char *function, const char *name_i, T_size1 i, const char *name_j, T_size2 j)
Check if the provided sizes match.
fvar< T > square(const fvar< T > &x)
void check_positive_finite(const char *function, const char *name, const T_y &y)
Check if y is positive and finite.
std::vector< Eigen::Matrix< typename return_type< T_x, T_v, double >::type, Eigen::Dynamic, 1 > > divide_columns(const std::vector< Eigen::Matrix< T_x, Eigen::Dynamic, 1 >> &x, const std::vector< T_v > &vec)
Takes Stan data type vector[n] x[D] and divides column vector in x element-wise by the values in vec...
fvar< T > squared_distance(const Eigen::Matrix< fvar< T >, R, C > &v1, const Eigen::Matrix< double, R, C > &v2)
Returns the squared distance between the specified vectors of the same dimensions.
boost::math::tools::promote_args< double, typename scalar_type< T >::type, typename return_type< Types_pack... >::type >::type type
fvar< T > exp(const fvar< T > &x)
void check_not_nan(const char *function, const char *name, const T_y &y)
Check if y is not NaN.
int size(const std::vector< T > &x)
Return the size of the specified standard vector.
void check_positive(const char *function, const char *name, const T_y &y)
Check if y is positive.