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

Ouverte
#3,381 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
3/5
Temps estimé
1-2 jours
Accessibilité débutants
72/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
cpp
Domaine
tooling

Piste de recherche

Commencez par la surcharge vector-V de gaussian_dlm_obs_lpdf et ses tests existants, en retraçant la manière dont Q est vérifié après le premier pas de temps. Ajoutez un cas de régression basé sur le modèle déterministe du rapport et vérifiez que la variance d’innovation nulle ultérieure lève std::domain_error au lieu de renvoyer NaN.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

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
Langage dominant
C++
Étoiles
845
Forks
225
Merge moyen
4 j 21 h
PR mergées (30 j)
13

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de stan-dev/math

Toutes les issues de stan-dev/math

Issues similaires

Plus d'issues C++

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.