@@ -192,7 +192,7 @@ def lgssm_info_filter(
192192 if param is not None and not callable (param ) and param .ndim == ndim + 1 :
193193 assert param .shape [0 ] == num_timesteps
194194 inputs = jnp .zeros ((num_timesteps , 0 )) if inputs is None else inputs
195- def _filter_step (carry , t , predict = True ):
195+ def _filter_step (carry , t ):
196196 """Run a single step of the Kalman filter."""
197197 ll , pred_eta , pred_prec = carry
198198
@@ -212,22 +212,19 @@ def _filter_step(carry, t, predict=True):
212212 filtered_eta , filtered_prec = _info_condition_on (pred_eta , pred_prec , H , R_prec , D , u , d , y )
213213
214214 # Predict the next state
215- if predict :
216- F = _get_params (params .dynamics_weights , 2 , t + 1 )
217- Q_prec = _get_params (params .dynamics_precision , 2 , t + 1 )
218- B = _get_params (params .dynamics_input_weights , 2 , t + 1 )
219- b = _get_params (params .dynamics_bias , 1 , t + 1 )
220- pred_eta , pred_prec = _info_predict (filtered_eta , filtered_prec , F , Q_prec , B , inputs [t + 1 ], b )
215+ t_next = jnp . minimum ( t + 1 , num_timesteps - 1 )
216+ F = _get_params (params .dynamics_weights , 2 , t_next )
217+ Q_prec = _get_params (params .dynamics_precision , 2 , t_next )
218+ B = _get_params (params .dynamics_input_weights , 2 , t_next )
219+ b = _get_params (params .dynamics_bias , 1 , t_next )
220+ pred_eta , pred_prec = _info_predict (filtered_eta , filtered_prec , F , Q_prec , B , inputs [t_next ], b )
221221
222222 return (ll , pred_eta , pred_prec ), (filtered_eta , filtered_prec )
223223
224224 # Run the Kalman filter
225225 initial_eta = params .initial_precision @ params .initial_mean
226226 carry = (0.0 , initial_eta , params .initial_precision )
227- carry , (filtered_etas , filtered_precisions ) = lax .scan (_filter_step , carry , jnp .arange (num_timesteps - 1 ))
228- (ll , _ , _ ), (filtered_eta , filtered_prec ) = _filter_step (carry , num_timesteps - 1 , predict = False )
229- filtered_etas = jnp .concatenate ((filtered_etas , filtered_eta [None ]))
230- filtered_precisions = jnp .concatenate ((filtered_precisions , filtered_prec [None ]))
227+ (ll , _ , _ ), (filtered_etas , filtered_precisions ) = lax .scan (_filter_step , carry , jnp .arange (num_timesteps ))
231228 return PosteriorGSSMInfoFiltered (marginal_loglik = ll , filtered_etas = filtered_etas , filtered_precisions = filtered_precisions )
232229
233230
0 commit comments