Skip to content

Commit 07f2871

Browse files
add try catch blocks in filter recursions
1 parent 82ff7ec commit 07f2871

File tree

5 files changed

+268
-233
lines changed

5 files changed

+268
-233
lines changed

src/filters/multivariate_kalman_filter.jl

Lines changed: 86 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -187,15 +187,10 @@ function update_P!(
187187
end
188188

189189
function update_llk!(kalman_state::MultivariateKalmanState{Fl}) where Fl
190-
try
191-
kalman_state.llk -= (
192-
HALF_LOG_2_PI + 0.5 * (logdet(kalman_state.F) +
193-
kalman_state.v' * inv(kalman_state.F) * kalman_state.v)
194-
)
195-
catch
196-
@error("Numerical error in the log-likelihood calculation. F = $(kalman_state.F), v = $(kalman_state.v). det(F) can only be positive.")
197-
rethrow()
198-
end
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)
193+
)
199194
return kalman_state
200195
end
201196

@@ -307,21 +302,26 @@ function filter_recursions!(
307302
steadystate_tol::Fl,
308303
skip_llk_instants::Int,
309304
) where Fl
310-
RQR = sys.R * sys.Q * sys.R'
311-
@inbounds for t in 1:size(sys.y, 1)
312-
update_kalman_state!(
313-
kalman_state,
314-
sys.y[t, :],
315-
sys.Z,
316-
sys.T,
317-
sys.H,
318-
RQR,
319-
sys.d,
320-
sys.c,
321-
skip_llk_instants,
322-
steadystate_tol,
323-
t,
324-
)
305+
try
306+
RQR = sys.R * sys.Q * sys.R'
307+
@inbounds for t in 1:size(sys.y, 1)
308+
update_kalman_state!(
309+
kalman_state,
310+
sys.y[t, :],
311+
sys.Z,
312+
sys.T,
313+
sys.H,
314+
RQR,
315+
sys.d,
316+
sys.c,
317+
skip_llk_instants,
318+
steadystate_tol,
319+
t,
320+
)
321+
end
322+
catch
323+
@error("Numerical error when applying Kalman filter euqations, the current state is: $kalman_state")
324+
rethrow()
325325
end
326326
return kalman_state.llk
327327
end
@@ -333,20 +333,25 @@ function filter_recursions!(
333333
steadystate_tol::Fl,
334334
skip_llk_instants::Int,
335335
) where Fl
336-
@inbounds for t in 1:size(sys.y, 1)
337-
update_kalman_state!(
338-
kalman_state,
339-
sys.y[t, :],
340-
sys.Z[t],
341-
sys.T[t],
342-
sys.H[t],
343-
sys.R[t],
344-
sys.Q[t],
345-
sys.d[t],
346-
sys.c[t],
347-
skip_llk_instants,
348-
t,
349-
)
336+
try
337+
@inbounds for t in 1:size(sys.y, 1)
338+
update_kalman_state!(
339+
kalman_state,
340+
sys.y[t, :],
341+
sys.Z[t],
342+
sys.T[t],
343+
sys.H[t],
344+
sys.R[t],
345+
sys.Q[t],
346+
sys.d[t],
347+
sys.c[t],
348+
skip_llk_instants,
349+
t,
350+
)
351+
end
352+
catch
353+
@error("Numerical error when applying Kalman filter euqations, the current state is: $kalman_state")
354+
rethrow()
350355
end
351356
return kalman_state.llk
352357
end
@@ -358,23 +363,28 @@ function filter_recursions!(
358363
steadystate_tol::Fl,
359364
skip_llk_instants::Int,
360365
) where Fl
361-
RQR = sys.R * sys.Q * sys.R'
362-
save_a1_P1_in_filter_output!(filter_output, kalman_state)
363-
@inbounds for t in 1:size(sys.y, 1)
364-
update_kalman_state!(
365-
kalman_state,
366-
sys.y[t, :],
367-
sys.Z,
368-
sys.T,
369-
sys.H,
370-
RQR,
371-
sys.d,
372-
sys.c,
373-
skip_llk_instants,
374-
steadystate_tol,
375-
t,
376-
)
377-
save_kalman_state_in_filter_output!(filter_output, kalman_state, t)
366+
try
367+
RQR = sys.R * sys.Q * sys.R'
368+
save_a1_P1_in_filter_output!(filter_output, kalman_state)
369+
@inbounds for t in 1:size(sys.y, 1)
370+
update_kalman_state!(
371+
kalman_state,
372+
sys.y[t, :],
373+
sys.Z,
374+
sys.T,
375+
sys.H,
376+
RQR,
377+
sys.d,
378+
sys.c,
379+
skip_llk_instants,
380+
steadystate_tol,
381+
t,
382+
)
383+
save_kalman_state_in_filter_output!(filter_output, kalman_state, t)
384+
end
385+
catch
386+
@error("Numerical error when applying Kalman filter euqations, the current state is: $kalman_state")
387+
rethrow()
378388
end
379389
return filter_output
380390
end
@@ -386,22 +396,27 @@ function filter_recursions!(
386396
steadystate_tol::Fl,
387397
skip_llk_instants::Int,
388398
) where Fl
389-
save_a1_P1_in_filter_output!(filter_output, kalman_state)
390-
@inbounds for t in 1:size(sys.y, 1)
391-
update_kalman_state!(
392-
kalman_state,
393-
sys.y[t, :],
394-
sys.Z[t],
395-
sys.T[t],
396-
sys.H[t],
397-
sys.R[t],
398-
sys.Q[t],
399-
sys.d[t],
400-
sys.c[t],
401-
skip_llk_instants,
402-
t,
403-
)
404-
save_kalman_state_in_filter_output!(filter_output, kalman_state, t)
399+
try
400+
save_a1_P1_in_filter_output!(filter_output, kalman_state)
401+
@inbounds for t in 1:size(sys.y, 1)
402+
update_kalman_state!(
403+
kalman_state,
404+
sys.y[t, :],
405+
sys.Z[t],
406+
sys.T[t],
407+
sys.H[t],
408+
sys.R[t],
409+
sys.Q[t],
410+
sys.d[t],
411+
sys.c[t],
412+
skip_llk_instants,
413+
t,
414+
)
415+
save_kalman_state_in_filter_output!(filter_output, kalman_state, t)
416+
end
417+
catch
418+
@error("Numerical error when applying Kalman filter euqations, the current state is: $kalman_state")
419+
rethrow()
405420
end
406421
return filter_output
407422
end

src/filters/regression_kalman_filter.jl

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

6060
function update_llk!(kalman_state::RegressionKalmanState{Fl}) where Fl
61-
try
62-
kalman_state.llk -= (
63-
HALF_LOG_2_PI + 0.5 * (log(kalman_state.F) + kalman_state.v^2 / kalman_state.F)
64-
)
65-
catch
66-
@error("Numerical error in the log-likelihood calculation. F = $(kalman_state.F), v = $(kalman_state.v). F can only be positive.")
67-
rethrow()
68-
end
61+
kalman_state.llk -= (
62+
HALF_LOG_2_PI + 0.5 * (log(kalman_state.F) + kalman_state.v^2 / kalman_state.F)
63+
)
6964
return kalman_state
7065
end
7166

src/filters/scalar_kalman_filter.jl

Lines changed: 45 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +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-
try
129-
kalman_state.llk -= (
130-
HALF_LOG_2_PI + 0.5 * (log(kalman_state.F) + kalman_state.v^2 / kalman_state.F)
131-
)
132-
catch
133-
@error("Numerical error in the log-likelihood calculation. F = $(kalman_state.F), v = $(kalman_state.v). F can only be positive.")
134-
rethrow()
135-
end
128+
kalman_state.llk -= (
129+
HALF_LOG_2_PI + 0.5 * (log(kalman_state.F) + kalman_state.v^2 / kalman_state.F)
130+
)
136131
return kalman_state
137132
end
138133

@@ -196,21 +191,26 @@ function filter_recursions!(
196191
steadystate_tol::Fl,
197192
skip_llk_instants::Int,
198193
) where Fl
199-
RQR = sys.R[1] * sys.Q[1] * sys.R[1]
200-
@inbounds for t in eachindex(sys.y)
201-
scalar_update_kalman_state!(
202-
kalman_state,
203-
sys.y[t],
204-
sys.Z[1],
205-
sys.T[1],
206-
sys.H,
207-
RQR,
208-
sys.d,
209-
sys.c[1],
210-
skip_llk_instants,
211-
steadystate_tol,
212-
t,
213-
)
194+
try
195+
RQR = sys.R[1] * sys.Q[1] * sys.R[1]
196+
@inbounds for t in eachindex(sys.y)
197+
scalar_update_kalman_state!(
198+
kalman_state,
199+
sys.y[t],
200+
sys.Z[1],
201+
sys.T[1],
202+
sys.H,
203+
RQR,
204+
sys.d,
205+
sys.c[1],
206+
skip_llk_instants,
207+
steadystate_tol,
208+
t,
209+
)
210+
end
211+
catch
212+
@error("Numerical error when applying Kalman filter euqations, the current state is: $kalman_state")
213+
rethrow()
214214
end
215215
return kalman_state.llk
216216
end
@@ -222,23 +222,28 @@ function filter_recursions!(
222222
steadystate_tol::Fl,
223223
skip_llk_instants::Int,
224224
) where Fl
225-
RQR = sys.R[1] * sys.Q[1] * sys.R[1]
226-
save_a1_P1_in_filter_output!(filter_output, kalman_state)
227-
@inbounds for t in eachindex(sys.y)
228-
scalar_update_kalman_state!(
229-
kalman_state,
230-
sys.y[t],
231-
sys.Z[1],
232-
sys.T[1],
233-
sys.H,
234-
RQR,
235-
sys.d,
236-
sys.c[1],
237-
skip_llk_instants,
238-
steadystate_tol,
239-
t,
240-
)
241-
save_kalman_state_in_filter_output!(filter_output, kalman_state, t)
225+
try
226+
RQR = sys.R[1] * sys.Q[1] * sys.R[1]
227+
save_a1_P1_in_filter_output!(filter_output, kalman_state)
228+
@inbounds for t in eachindex(sys.y)
229+
scalar_update_kalman_state!(
230+
kalman_state,
231+
sys.y[t],
232+
sys.Z[1],
233+
sys.T[1],
234+
sys.H,
235+
RQR,
236+
sys.d,
237+
sys.c[1],
238+
skip_llk_instants,
239+
steadystate_tol,
240+
t,
241+
)
242+
save_kalman_state_in_filter_output!(filter_output, kalman_state, t)
243+
end
244+
catch
245+
@error("Numerical error when applying Kalman filter euqations, the current state is: $kalman_state")
246+
rethrow()
242247
end
243248
return filter_output
244249
end

0 commit comments

Comments
 (0)