1 #ifndef STAN_MATH_PRIM_MAT_PROB_GAUSSIAN_DLM_OBS_LPDF_HPP 2 #define STAN_MATH_PRIM_MAT_PROB_GAUSSIAN_DLM_OBS_LPDF_HPP 66 template <
bool propto,
typename T_y,
typename T_F,
typename T_G,
typename T_V,
67 typename T_W,
typename T_m0,
typename T_C0>
71 const Eigen::Matrix<T_y, Eigen::Dynamic, Eigen::Dynamic>& y,
72 const Eigen::Matrix<T_F, Eigen::Dynamic, Eigen::Dynamic>& F,
73 const Eigen::Matrix<T_G, Eigen::Dynamic, Eigen::Dynamic>& G,
74 const Eigen::Matrix<T_V, Eigen::Dynamic, Eigen::Dynamic>& V,
75 const Eigen::Matrix<T_W, Eigen::Dynamic, Eigen::Dynamic>& W,
76 const Eigen::Matrix<T_m0, Eigen::Dynamic, 1>& m0,
77 const Eigen::Matrix<T_C0, Eigen::Dynamic, Eigen::Dynamic>& C0) {
78 static const char*
function =
"gaussian_dlm_obs_lpdf";
81 T_C0>::type>::type T_lp;
116 Eigen::Matrix<T_lp, Eigen::Dynamic, 1> m(n);
117 Eigen::Matrix<T_lp, Eigen::Dynamic, Eigen::Dynamic> C(n, n);
120 for (
int i = 0; i < m0.size(); i++) {
123 for (
int i = 0; i < C0.rows(); i++) {
124 for (
int j = 0; j < C0.cols(); j++) {
129 Eigen::Matrix<typename return_type<T_y>::type, Eigen::Dynamic, 1> yi(r);
130 Eigen::Matrix<T_lp, Eigen::Dynamic, 1> a(n);
131 Eigen::Matrix<T_lp, Eigen::Dynamic, Eigen::Dynamic> R(n, n);
132 Eigen::Matrix<T_lp, Eigen::Dynamic, 1> f(r);
133 Eigen::Matrix<T_lp, Eigen::Dynamic, Eigen::Dynamic> Q(r, r);
134 Eigen::Matrix<T_lp, Eigen::Dynamic, Eigen::Dynamic> Q_inv(r, r);
135 Eigen::Matrix<T_lp, Eigen::Dynamic, 1>
e(r);
136 Eigen::Matrix<T_lp, Eigen::Dynamic, Eigen::Dynamic> A(n, r);
138 for (
int i = 0; i < y.cols(); i++) {
166 template <
typename T_y,
typename T_F,
typename T_G,
typename T_V,
typename T_W,
167 typename T_m0,
typename T_C0>
171 const Eigen::Matrix<T_y, Eigen::Dynamic, Eigen::Dynamic>& y,
172 const Eigen::Matrix<T_F, Eigen::Dynamic, Eigen::Dynamic>& F,
173 const Eigen::Matrix<T_G, Eigen::Dynamic, Eigen::Dynamic>& G,
174 const Eigen::Matrix<T_V, Eigen::Dynamic, Eigen::Dynamic>& V,
175 const Eigen::Matrix<T_W, Eigen::Dynamic, Eigen::Dynamic>& W,
176 const Eigen::Matrix<T_m0, Eigen::Dynamic, 1>& m0,
177 const Eigen::Matrix<T_C0, Eigen::Dynamic, Eigen::Dynamic>& C0) {
178 return gaussian_dlm_obs_lpdf<false>(y, F, G, V, W, m0, C0);
216 template <
bool propto,
typename T_y,
typename T_F,
typename T_G,
typename T_V,
217 typename T_W,
typename T_m0,
typename T_C0>
221 const Eigen::Matrix<T_y, Eigen::Dynamic, Eigen::Dynamic>& y,
222 const Eigen::Matrix<T_F, Eigen::Dynamic, Eigen::Dynamic>& F,
223 const Eigen::Matrix<T_G, Eigen::Dynamic, Eigen::Dynamic>& G,
224 const Eigen::Matrix<T_V, Eigen::Dynamic, 1>& V,
225 const Eigen::Matrix<T_W, Eigen::Dynamic, Eigen::Dynamic>& W,
226 const Eigen::Matrix<T_m0, Eigen::Dynamic, 1>& m0,
227 const Eigen::Matrix<T_C0, Eigen::Dynamic, Eigen::Dynamic>& C0) {
228 static const char*
function =
"gaussian_dlm_obs_lpdf";
231 T_C0>::type>::type T_lp;
240 check_size_match(
function,
"columns of F", F.cols(),
"rows of y", y.rows());
244 check_size_match(
function,
"rows of G", G.rows(),
"columns of G", G.cols());
265 if (y.cols() == 0 || y.rows() == 0)
278 Eigen::Matrix<T_lp, Eigen::Dynamic, 1> A(n);
279 Eigen::Matrix<T_lp, Eigen::Dynamic, 1> Fj(n);
280 Eigen::Matrix<T_lp, Eigen::Dynamic, 1> m(n);
281 Eigen::Matrix<T_lp, Eigen::Dynamic, Eigen::Dynamic> C(n, n);
284 for (
int i = 0; i < m0.size(); i++) {
287 for (
int i = 0; i < C0.rows(); i++) {
288 for (
int j = 0; j < C0.cols(); j++) {
293 for (
int i = 0; i < y.cols(); i++) {
298 for (
int j = 0; j < y.rows(); ++j) {
302 for (
int k = 0; k < F.rows(); ++k) {
321 lp -= 0.5 * (
log(Q) +
pow(e, 2) * Q_inv);
328 template <
typename T_y,
typename T_F,
typename T_G,
typename T_V,
typename T_W,
329 typename T_m0,
typename T_C0>
333 const Eigen::Matrix<T_y, Eigen::Dynamic, Eigen::Dynamic>& y,
334 const Eigen::Matrix<T_F, Eigen::Dynamic, Eigen::Dynamic>& F,
335 const Eigen::Matrix<T_G, Eigen::Dynamic, Eigen::Dynamic>& G,
336 const Eigen::Matrix<T_V, Eigen::Dynamic, 1>& V,
337 const Eigen::Matrix<T_W, Eigen::Dynamic, Eigen::Dynamic>& W,
338 const Eigen::Matrix<T_m0, Eigen::Dynamic, 1>& m0,
339 const Eigen::Matrix<T_C0, Eigen::Dynamic, Eigen::Dynamic>& C0) {
340 return gaussian_dlm_obs_lpdf<false>(y, F, G, V, W, m0, C0);
auto subtract(const matrix_cl &A, const matrix_cl &B)
Matrix subtraction on the OpenCL device Subtracts the second matrix from the first matrix and stores ...
void check_finite(const char *function, const char *name, const T_y &y)
Check if y is finite.
fvar< T > trace_quad_form(const Eigen::Matrix< fvar< T >, RA, CA > &A, const Eigen::Matrix< fvar< T >, RB, CB > &B)
fvar< T > log(const fvar< T > &x)
void check_square(const char *function, const char *name, const matrix_cl &y)
Check if the matrix_cl is square.
Eigen::Matrix< fvar< T >, R1, C1 > multiply(const Eigen::Matrix< fvar< T >, R1, C1 > &m, const fvar< T > &c)
Template metaprogram to calculate the base scalar return type resulting from promoting all the scalar...
bool size_zero(T &x)
Returns 1 if input is of length 0, returns 0 otherwise.
return_type< T_y, typename return_type< T_F, T_G, T_V, T_W, T_m0, T_C0 >::type >::type gaussian_dlm_obs_lpdf(const Eigen::Matrix< T_y, Eigen::Dynamic, Eigen::Dynamic > &y, const Eigen::Matrix< T_F, Eigen::Dynamic, Eigen::Dynamic > &F, const Eigen::Matrix< T_G, Eigen::Dynamic, Eigen::Dynamic > &G, const Eigen::Matrix< T_V, Eigen::Dynamic, Eigen::Dynamic > &V, const Eigen::Matrix< T_W, Eigen::Dynamic, Eigen::Dynamic > &W, const Eigen::Matrix< T_m0, Eigen::Dynamic, 1 > &m0, const Eigen::Matrix< T_C0, Eigen::Dynamic, Eigen::Dynamic > &C0)
The log of a Gaussian dynamic linear model (GDLM).
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.
Template metaprogram to calculate whether a summand needs to be included in a proportional (log) prob...
void check_nonnegative(const char *function, const char *name, const T_y &y)
Check if y is non-negative.
boost::math::tools::promote_args< double, typename scalar_type< T >::type, typename return_type< Types_pack... >::type >::type type
void check_not_nan(const char *function, const char *name, const T_y &y)
Check if y is not NaN.
void check_spsd_matrix(const char *function, const char *name, const Eigen::Matrix< T_y, Eigen::Dynamic, Eigen::Dynamic > &y)
Check if the specified matrix is a square, symmetric, and positive semi-definite. ...
fvar< T > dot_product(const Eigen::Matrix< fvar< T >, R1, C1 > &v1, const Eigen::Matrix< fvar< T >, R2, C2 > &v2)
matrix_cl transpose(const matrix_cl &src)
Takes the transpose of the matrix on the OpenCL device.
double e()
Return the base of the natural logarithm.
matrix_cl add(const matrix_cl &A, const matrix_cl &B)
Matrix addition on the OpenCL device.
Eigen::Matrix< fvar< T >, CB, CB > quad_form_sym(const Eigen::Matrix< fvar< T >, RA, CA > &A, const Eigen::Matrix< double, RB, CB > &B)
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > inverse_spd(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &m)
Returns the inverse of the specified symmetric, pos/neg-definite matrix.
const double NEG_LOG_TWO_PI
fvar< T > pow(const fvar< T > &x1, const fvar< T > &x2)
void check_pos_definite(const char *function, const char *name, const Eigen::Matrix< T_y, -1, -1 > &y)
Check if the specified square, symmetric matrix is positive definite.
T log_determinant_spd(const Eigen::Matrix< T, R, C > &m)
Returns the log absolute determinant of the specified square matrix.