From cd350a6f578a6e343965533740ed192e3f9920c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Argos=29?=
 <stepan@adjemian.eu>
Date: Mon, 14 Apr 2025 20:23:31 +0200
Subject: [PATCH] [WIP] Fix auxiliary particle filter.

---
 .../nonlinear-filters/auxiliary_particle_filter.m   | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/matlab/nonlinear-filters/auxiliary_particle_filter.m b/matlab/nonlinear-filters/auxiliary_particle_filter.m
index 74354dc69e..803cff035c 100644
--- a/matlab/nonlinear-filters/auxiliary_particle_filter.m
+++ b/matlab/nonlinear-filters/auxiliary_particle_filter.m
@@ -76,13 +76,14 @@ H = ReducedForm.H;
 StateVectorMean = ReducedForm.StateVectorMean;
 StateVectorVarianceSquareRoot = chol(ReducedForm.StateVectorVariance)';
 state_variance_rank = size(StateVectorVarianceSquareRoot,2);
-Q_lower_triangular_cholesky = chol(Q)';
+Q_lower_triangular_cholesky = chol(Q, 'lower');
+H_lower_triangular_cholesky = chol(H, 'lower');
 
 % Set seed for randn().
 options_=set_dynare_seed_local_options(options_,'default');
 
 % Initialization of the likelihood.
-const_lik = log(2*pi)*number_of_observed_variables+log(det(H));
+const_lik = log(2*pi)*number_of_observed_variables + sum(log(diag(H_lower_triangular_cholesky)));
 lik  = NaN(sample_size,1);
 LIK  = NaN;
 
@@ -140,13 +141,15 @@ for t=1:sample_size
             end
         end
     end
-    PredictionError = bsxfun(@minus,Y(:,t),tmp(mf1,:));
-    z = sum(PredictionError.*(H\PredictionError),1) ;
+    StandardPredictionError = H_lower_triangular_cholesky\bsxfun(@minus,Y(:,t), tmp(mf1,:));
+    lambda = weights.*exp(-.5*(const_lik + sum(StandardPredictionError.*StandardPredictionError, 1)));
+    LAMBDA = lambda/sum(lambda);
+    indx = resample(0, LAMBDA, ParticleOptions);
     %    tau_tilde = weights.*(tpdf(z,3*ones(size(z)))+1e-99) ;
     ddl = 3 ;
     tau_tilde = weights.*(exp(gammaln((ddl + 1) / 2) - gammaln(ddl/2))./(sqrt(ddl*pi).*(1 + (z.^2)./ddl).^((ddl + 1)/2))+1e-99) ;
     tau_tilde = tau_tilde/sum(tau_tilde) ;
-    indx = resample(0,tau_tilde',ParticleOptions);
+    
     if pruning
         yhat_ = yhat_(:,indx) ;
     end
-- 
GitLab