Skip to content

Commit 193f6ae

Browse files
Better treatment for numerical errors
1 parent 6a86265 commit 193f6ae

File tree

5 files changed

+22
-5
lines changed

5 files changed

+22
-5
lines changed

src/filters/multivariate_kalman_filter.jl

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,14 @@ function update_P!(
187187
end
188188

189189
function update_llk!(kalman_state::MultivariateKalmanState{Fl}) where Fl
190-
kalman_state.llk -=
191-
HALF_LOG_2_PI + 0.5 * (logdet(kalman_state.F) +
192-
kalman_state.v' * inv(kalman_state.F) * kalman_state.v)
190+
detF = det(kalman_state.F)
191+
if detF < 0
192+
error("Numerical error, the determinant of F $(kalman_state.F) is negative: $detF")
193+
else
194+
kalman_state.llk -=
195+
HALF_LOG_2_PI + 0.5 * (log(detF) +
196+
kalman_state.v' * inv(kalman_state.F) * kalman_state.v)
197+
end
193198
return kalman_state
194199
end
195200

src/filters/regression_kalman_filter.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ function regression_update_v!(
5858
end
5959

6060
function update_llk!(kalman_state::RegressionKalmanState{Fl}) where Fl
61+
if kalman_state.F < 0
62+
error("Numerical error, F is negative: $(kalman_state.F)")
63+
end
6164
kalman_state.llk -= (
6265
HALF_LOG_2_PI + 0.5 * (log(kalman_state.F) + kalman_state.v^2 / kalman_state.F)
6366
)

src/filters/scalar_kalman_filter.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ function scalar_update_P!(kalman_state::ScalarKalmanState{Fl}, T::Fl, RQR::Fl) w
125125
end
126126

127127
function update_llk!(kalman_state::ScalarKalmanState{Fl}) where Fl
128+
if kalman_state.F < 0
129+
error("Numerical error, F is negative: $(kalman_state.F)")
130+
end
128131
kalman_state.llk -= (
129132
HALF_LOG_2_PI + 0.5 * (log(kalman_state.F) + kalman_state.v^2 / kalman_state.F)
130133
)

src/filters/sparse_univariate_kalman_filter.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,11 @@ function update_P!(
179179
end
180180

181181
function update_llk!(kalman_state::SparseUnivariateKalmanState{Fl}) where Fl
182+
if kalman_state.F < 0
183+
error("Numerical error, F is negative: $(kalman_state.F)")
184+
end
182185
kalman_state.llk -= (
183-
HALF_LOG_2_PI + (log(kalman_state.F) + kalman_state.v^2 / kalman_state.F) / 2
186+
HALF_LOG_2_PI + 0.5 * (log(kalman_state.F) + kalman_state.v^2 / kalman_state.F)
184187
)
185188
return kalman_state
186189
end

src/filters/univariate_kalman_filter.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,11 @@ function update_P!(
195195
end
196196

197197
function update_llk!(kalman_state::UnivariateKalmanState{Fl}) where Fl
198+
if kalman_state.F < 0
199+
error("Numerical error, F is negative: $(kalman_state.F)")
200+
end
198201
kalman_state.llk -= (
199-
HALF_LOG_2_PI + (log(kalman_state.F) + kalman_state.v^2 / kalman_state.F) / 2
202+
HALF_LOG_2_PI + 0.5 * (log(kalman_state.F) + kalman_state.v^2 / kalman_state.F)
200203
)
201204
return kalman_state
202205
end

0 commit comments

Comments
 (0)