@@ -54,15 +54,22 @@ gp_dot_prod_cov(const std::vector<Eigen::Matrix<T_x, Eigen::Dynamic, 1>> &x,
5454 }
5555
5656 T_sigma sigma_sq = square (sigma);
57-
58- for (size_t i = 0 ; i < (x_size - 1 ); ++i) {
59- cov (i, i) = sigma_sq + dot_self (x[i]);
60- for (size_t j = i + 1 ; j < x_size; ++j) {
61- cov (i, j) = sigma_sq + dot_product (x[i], x[j]);
62- cov (j, i) = cov (i, j);
57+ size_t block_size = 10 ;
58+
59+ for (size_t jb = 0 ; jb < x_size; jb += block_size) {
60+ for (size_t ib = jb; ib < x_size; ib += block_size) {
61+ size_t j_end = std::min (x_size, jb + block_size);
62+ for (size_t j = jb; j < j_end; ++j) {
63+ cov.coeffRef (j, j) = sigma_sq + dot_self (x[j]);
64+ size_t i_end = std::min (x_size, ib + block_size);
65+ for (size_t i = std::max (ib, j + 1 ); i < i_end; ++i) {
66+ cov.coeffRef (j, i) = cov.coeffRef (i, j)
67+ = sigma_sq + dot_product (x[i], x[j]);
68+ }
69+ }
6370 }
6471 }
65- cov (x_size - 1 , x_size - 1 ) = sigma_sq + dot_self (x[x_size - 1 ]);
72+ cov. coeffRef (x_size - 1 , x_size - 1 ) = sigma_sq + dot_self (x[x_size - 1 ]);
6673 return cov;
6774}
6875
@@ -91,12 +98,10 @@ gp_dot_prod_cov(const std::vector<Eigen::Matrix<T_x, Eigen::Dynamic, 1>> &x,
9198template <typename T_x, typename T_sigma>
9299Eigen::Matrix<return_type_t <T_x, T_sigma>, Eigen::Dynamic, Eigen::Dynamic>
93100gp_dot_prod_cov (const std::vector<T_x> &x, const T_sigma &sigma) {
94- check_not_nan (" gp_dot_prod_cov" , " sigma" , sigma);
95101 check_nonnegative (" gp_dot_prod_cov" , " sigma" , sigma);
96102 check_finite (" gp_dot_prod_cov" , " sigma" , sigma);
97103
98104 size_t x_size = x.size ();
99- check_not_nan (" gp_dot_prod_cov" , " x" , x);
100105 check_finite (" gp_dot_prod_cov" , " x" , x);
101106
102107 Eigen::Matrix<return_type_t <T_x, T_sigma>, Eigen::Dynamic, Eigen::Dynamic>
@@ -106,12 +111,18 @@ gp_dot_prod_cov(const std::vector<T_x> &x, const T_sigma &sigma) {
106111 }
107112
108113 T_sigma sigma_sq = square (sigma);
109-
110- for (size_t i = 0 ; i < (x_size - 1 ); ++i) {
111- cov (i, i) = sigma_sq + x[i] * x[i];
112- for (size_t j = i + 1 ; j < x_size; ++j) {
113- cov (i, j) = sigma_sq + x[i] * x[j];
114- cov (j, i) = cov (i, j);
114+ size_t block_size = 10 ;
115+
116+ for (size_t jb = 0 ; jb < x_size; jb += block_size) {
117+ for (size_t ib = jb; ib < x_size; ib += block_size) {
118+ size_t j_end = std::min (x_size, jb + block_size);
119+ for (size_t j = jb; j < j_end; ++j) {
120+ cov.coeffRef (j, j) = sigma_sq + x[j] * x[j];
121+ size_t i_end = std::min (x_size, ib + block_size);
122+ for (size_t i = std::max (ib, j + 1 ); i < i_end; ++i) {
123+ cov.coeffRef (j, i) = cov.coeffRef (i, j) = sigma_sq + x[i] * x[j];
124+ }
125+ }
115126 }
116127 }
117128 cov (x_size - 1 , x_size - 1 ) = sigma_sq + x[x_size - 1 ] * x[x_size - 1 ];
@@ -146,18 +157,15 @@ Eigen::Matrix<return_type_t<T_x1, T_x2, T_sigma>, Eigen::Dynamic,
146157gp_dot_prod_cov (const std::vector<Eigen::Matrix<T_x1, Eigen::Dynamic, 1 >> &x1,
147158 const std::vector<Eigen::Matrix<T_x2, Eigen::Dynamic, 1 >> &x2,
148159 const T_sigma &sigma) {
149- check_not_nan (" gp_dot_prod_cov" , " sigma" , sigma);
150160 check_nonnegative (" gp_dot_prod_cov" , " sigma" , sigma);
151161 check_finite (" gp_dot_prod_cov" , " sigma" , sigma);
152162
153163 size_t x1_size = x1.size ();
154164 size_t x2_size = x2.size ();
155165 for (size_t i = 0 ; i < x1_size; ++i) {
156- check_not_nan (" gp_dot_prod_cov" , " x1" , x1[i]);
157166 check_finite (" gp_dot_prod_cov" , " x1" , x1[i]);
158167 }
159168 for (size_t i = 0 ; i < x2_size; ++i) {
160- check_not_nan (" gp_dot_prod_cov" , " x2" , x2[i]);
161169 check_finite (" gp_dot_prod_cov" , " x2" , x2[i]);
162170 }
163171 Eigen::Matrix<return_type_t <T_x1, T_x2, T_sigma>, Eigen::Dynamic,
@@ -169,10 +177,17 @@ gp_dot_prod_cov(const std::vector<Eigen::Matrix<T_x1, Eigen::Dynamic, 1>> &x1,
169177 }
170178
171179 T_sigma sigma_sq = square (sigma);
172-
173- for (size_t i = 0 ; i < x1_size; ++i) {
174- for (size_t j = 0 ; j < x2_size; ++j) {
175- cov (i, j) = sigma_sq + dot_product (x1[i], x2[j]);
180+ size_t block_size = 10 ;
181+
182+ for (size_t ib = 0 ; ib < x1_size; ib += block_size) {
183+ for (size_t jb = 0 ; jb < x2_size; jb += block_size) {
184+ size_t j_end = std::min (x2_size, jb + block_size);
185+ for (size_t j = jb; j < j_end; ++j) {
186+ size_t i_end = std::min (x1_size, ib + block_size);
187+ for (size_t i = ib; i < i_end; ++i) {
188+ cov (i, j) = sigma_sq + dot_product (x1[i], x2[j]);
189+ }
190+ }
176191 }
177192 }
178193 return cov;
@@ -205,15 +220,12 @@ Eigen::Matrix<return_type_t<T_x1, T_x2, T_sigma>, Eigen::Dynamic,
205220 Eigen::Dynamic>
206221gp_dot_prod_cov (const std::vector<T_x1> &x1, const std::vector<T_x2> &x2,
207222 const T_sigma &sigma) {
208- check_not_nan (" gp_dot_prod_cov" , " sigma" , sigma);
209223 check_nonnegative (" gp_dot_prod_cov" , " sigma" , sigma);
210224 check_finite (" gp_dot_prod_cov" , " sigma" , sigma);
211225
212226 size_t x1_size = x1.size ();
213227 size_t x2_size = x2.size ();
214- check_not_nan (" gp_dot_prod_cov" , " x1" , x1);
215228 check_finite (" gp_dot_prod_cov" , " x1" , x1);
216- check_not_nan (" gp_dot_prod_cov" , " x2" , x2);
217229 check_finite (" gp_dot_prod_cov" , " x2" , x2);
218230
219231 Eigen::Matrix<return_type_t <T_x1, T_x2, T_sigma>, Eigen::Dynamic,
0 commit comments