The vector-V overload checks the innovation variance Q only in the first time step (if (i == 0) check_positive(function, "Q0", Q)). Later time steps compute 1.0 / Q and log(Q) unchecked. A deterministic model whose state covariance collapses after the first update returns NaN silently:
Eigen::MatrixXd y(1, 2); y << 0.5, 0.5; // r = 1 variable, T = 2
Eigen::MatrixXd F(1, 1); F << 1.0;
Eigen::MatrixXd G(1, 1); G << 1.0;
Eigen::VectorXd V(1); V << 0.0; // passes check_nonnegative
Eigen::MatrixXd W(1, 1); W << 0.0; // passes check_pos_semidefinite
Eigen::VectorXd m0(1); m0 << 0.0;
Eigen::MatrixXd C0(1, 1); C0 << 1.0;
double lp = stan::math::gaussian_dlm_obs_lpdf<false>(y, F, G, V, W, m0, C0);
// lp = -nan, no exception
At t = 0, Q = 1 > 0 so the check passes; the update collapses C to zero, so from t = 1 on, Q = 0, Q_inv = inf, and the log density is NaN. The doc comment promises std::domain_error for non-PSD matrices in the Kalman filter.
Environment:
- Ubuntu 22.04.5 LTS (WSL2, kernel 6.18.33.2-microsoft-standard-WSL2), x86_64
- stan-dev/math develop @ d20b238
- g++ 11.4.0 (Ubuntu 22.04), -std=c++17
The vector-
Voverload checks the innovation varianceQonly in the first time step (if (i == 0) check_positive(function, "Q0", Q)). Later time steps compute1.0 / Qandlog(Q)unchecked. A deterministic model whose state covariance collapses after the first update returns NaN silently:At
t = 0,Q = 1 > 0so the check passes; the update collapsesCto zero, so fromt = 1on,Q = 0,Q_inv = inf, and the log density is NaN. The doc comment promisesstd::domain_errorfor non-PSD matrices in the Kalman filter.Environment: