`gaussian_dlm_obs_lpdf` returns NaN instead of rejecting when the innovation variance collapses after time zero

未关闭
#3,381 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
72/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
cpp
领域
tooling

调研方向

从 gaussian_dlm_obs_lpdf 的 vector-V 重载及其现有测试开始,追踪第一个时间步之后如何检查 Q。添加一个基于报告中确定性模型的回归用例,并验证后续的零创新方差会引发 std::domain_error,而不是返回 NaN。

由索引模型根据 Issue 内容生成。

描述

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 @ d20b238b9c
  • g++ 11.4.0 (Ubuntu 22.04), -std=c++17
主要语言
C++
星标
845
派生
225
平均合并
3 天 9 小时
30 天内合并 PR
12

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

stan-dev/math 的其他 Issue

查看 stan-dev/math 的全部 Issue

相似的 Issue

更多 C++ Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。