From 6c7f3f1932c11277c0d670e4c6e7980454632004 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?=
 <stephane.adjemian@univ-lemans.fr>
Date: Fri, 29 Apr 2016 23:12:52 +0200
Subject: [PATCH] Added input to pass sequence of shocks.

---
 matlab/simul_backward_nonlinear_model.m | 50 +++++++++++++------------
 1 file changed, 27 insertions(+), 23 deletions(-)

diff --git a/matlab/simul_backward_nonlinear_model.m b/matlab/simul_backward_nonlinear_model.m
index 788320c481..507f371d9d 100644
--- a/matlab/simul_backward_nonlinear_model.m
+++ b/matlab/simul_backward_nonlinear_model.m
@@ -1,4 +1,4 @@
-function DynareOutput = simul_backward_nonlinear_model(initial_conditions, sample_size, DynareOptions, DynareModel, DynareOutput)
+function DynareOutput = simul_backward_nonlinear_model(initial_conditions, sample_size, DynareOptions, DynareModel, DynareOutput, innovations)
 
 %@info:
 %! @deftypefn {Function File} {@var{DynareOutput} =} simul_backward_nonlinear_model (@var{sample_size},@var{DynareOptions}, @var{DynareModel}, @var{DynareOutput})
@@ -55,31 +55,35 @@ if DynareModel.maximum_lead
     error(['simul_backward_nonlinear_model:: The specified model is not backward looking!'])
 end
 
-% Set the covariance matrix of the structural innovations.
-variances = diag(DynareModel.Sigma_e);
-number_of_shocks = length(DynareModel.Sigma_e);
-positive_var_indx = find(variances>0);
-effective_number_of_shocks = length(positive_var_indx);
-covariance_matrix = DynareModel.Sigma_e(positive_var_indx,positive_var_indx);
-covariance_matrix_upper_cholesky = chol(covariance_matrix);
+if nargin<6
+    % Set the covariance matrix of the structural innovations.
+    variances = diag(DynareModel.Sigma_e);
+    number_of_shocks = length(DynareModel.Sigma_e);
+    positive_var_indx = find(variances>0);
+    effective_number_of_shocks = length(positive_var_indx);
+    covariance_matrix = DynareModel.Sigma_e(positive_var_indx,positive_var_indx);
+    covariance_matrix_upper_cholesky = chol(covariance_matrix);
 
-% Set seed to its default state.
-if DynareOptions.bnlms.set_dynare_seed_to_default
-    set_dynare_seed('default');
-end
+    % Set seed to its default state.
+    if DynareOptions.bnlms.set_dynare_seed_to_default
+        set_dynare_seed('default');
+    end
 
-% Simulate structural innovations.
-switch DynareOptions.bnlms.innovation_distribution
-  case 'gaussian'
-      DynareOutput.bnlms.shocks = randn(sample_size,effective_number_of_shocks)*covariance_matrix_upper_cholesky;
-  otherwise
-    error(['simul_backward_nonlinear_model:: ' DynareOption.bnlms.innovation_distribution ' distribution for the structural innovations is not (yet) implemented!'])
-end
+    % Simulate structural innovations.
+    switch DynareOptions.bnlms.innovation_distribution
+      case 'gaussian'
+        DynareOutput.bnlms.shocks = randn(sample_size,effective_number_of_shocks)*covariance_matrix_upper_cholesky;
+      otherwise
+        error(['simul_backward_nonlinear_model:: ' DynareOption.bnlms.innovation_distribution ' distribution for the structural innovations is not (yet) implemented!'])
+    end
 
-% Put the simulated innovations in DynareOutput.exo_simul.
-DynareOutput.exo_simul = zeros(sample_size,number_of_shocks);
-DynareOutput.exo_simul(:,positive_var_indx) = DynareOutput.bnlms.shocks;
-DynareOutput.exo_simul = [zeros(1,number_of_shocks); DynareOutput.exo_simul];
+    % Put the simulated innovations in DynareOutput.exo_simul.
+    DynareOutput.exo_simul = zeros(sample_size,number_of_shocks);
+    DynareOutput.exo_simul(:,positive_var_indx) = DynareOutput.bnlms.shocks;
+    DynareOutput.exo_simul = [zeros(1,number_of_shocks); DynareOutput.exo_simul];
+else
+    DynareOutput.exo_simul = innovations;
+end
 
 % Get usefull vector of indices.
 ny0 = nnz(DynareModel.lead_lag_incidence(2,:));
-- 
GitLab