From 7d11ed764263a71aec6efe76ad96e7d02f317610 Mon Sep 17 00:00:00 2001
From: Michel Juillard <michel.juillard@mjui.fr>
Date: Wed, 29 Jul 2015 15:41:17 +0200
Subject: [PATCH] histval: use now the same treatment for exogenous and
 exogenous det variables as for endogenous ones. Closes issue #617.

---
 matlab/global_initialization.m             |  2 ++
 matlab/perfect-foresight-models/make_ex_.m | 22 +++++++++++++++++-----
 preprocessor/NumericalInitialization.cc    | 10 ++++++----
 3 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/matlab/global_initialization.m b/matlab/global_initialization.m
index cdf4e9037e..65acab6edc 100644
--- a/matlab/global_initialization.m
+++ b/matlab/global_initialization.m
@@ -491,6 +491,8 @@ oo_.exo_det_simul = [];
 
 M_.params = [];
 M_.endo_histval = [];
+M_.exo_histval = [];
+M_.exo_det_histval = [];
 M_.Correlation_matrix = [];
 M_.Correlation_matrix_ME = [];
 
diff --git a/matlab/perfect-foresight-models/make_ex_.m b/matlab/perfect-foresight-models/make_ex_.m
index ea269c81bf..8ad894825a 100644
--- a/matlab/perfect-foresight-models/make_ex_.m
+++ b/matlab/perfect-foresight-models/make_ex_.m
@@ -39,15 +39,27 @@ if M_.exo_det_nbr > 1 && isempty(oo_.exo_det_steady_state)
 end
 
 % Initialize oo_.exo_simul
-if isempty(ex0_)
-    oo_.exo_simul = repmat(oo_.exo_steady_state',M_.maximum_lag+options_.periods+M_.maximum_lead,1);
+if isempty(M_.exo_histval)
+    if isempty(ex0_)
+        oo_.exo_simul = repmat(oo_.exo_steady_state',M_.maximum_lag+options_.periods+M_.maximum_lead,1);
+    else
+        oo_.exo_simul = [ repmat(ex0_',M_.maximum_lag,1) ; repmat(oo_.exo_steady_state',options_.periods+M_.maximum_lead,1) ];
+    end
 else
-    oo_.exo_simul = [ repmat(ex0_',M_.maximum_lag,1) ; repmat(oo_.exo_steady_state',options_.periods+M_.maximum_lead,1) ];
-end
+    if isempty(ex0_)
+        oo_.exo_simul = [M_.exo_histval'; repmat(oo_.exo_steady_state',options_.periods+M_.maximum_lead,1)];
+    else
+        error('histval and endval cannot be used simultaneously')
+    end
+end    
 
 % Initialize oo_.exo_det_simul
 if M_.exo_det_nbr > 0
-    oo_.exo_det_simul = [ones(M_.maximum_lag+options_.periods+M_.maximum_lead,1)*oo_.exo_det_steady_state'];
+    if isempty(M_.exo_det_histval)
+        oo_.exo_det_simul = repmat(oo_.exo_det_steady_state',M_.maximum_lag+options_.periods+M_.maximum_lead,1);
+    else
+        oo_.exo_det_simul = [M_.exo_det_histval'; repmat(oo_.exo_det_steady_state',options_.periods+M_.maximum_lead,1)];
+    end
 end
 
 % Add temporary shocks
diff --git a/preprocessor/NumericalInitialization.cc b/preprocessor/NumericalInitialization.cc
index f8491d8b02..48fc02ffba 100644
--- a/preprocessor/NumericalInitialization.cc
+++ b/preprocessor/NumericalInitialization.cc
@@ -274,7 +274,9 @@ HistValStatement::writeOutput(ostream &output, const string &basename, bool mini
   output << "%" << endl
          << "% HISTVAL instructions" << endl
          << "%" << endl
-         << "M_.endo_histval = zeros(M_.endo_nbr,M_.maximum_lag);" << endl;
+         << "M_.endo_histval = zeros(M_.endo_nbr,M_.maximum_lag);" << endl
+         << "M_.exo_histval = zeros(M_.exo_nbr,M_.maximum_lag);" << endl
+         << "M_.exo_det_histval = zeros(M_.exo_det_nbr,M_.maximum_lag);" << endl;
 
   for (hist_values_t::const_iterator it = hist_values.begin();
        it != hist_values.end(); it++)
@@ -312,9 +314,9 @@ HistValStatement::writeOutput(ostream &output, const string &basename, bool mini
       if (type == eEndogenous)
         output << "M_.endo_histval( " << tsid << ", M_.maximum_lag + " << lag << ") = ";
       else if (type == eExogenous)
-        output << "oo_.exo_simul( M_.maximum_lag + " << lag << ", " << tsid << " ) = ";
-      else if (type != eExogenousDet)
-        output << "oo_.exo_det_simul( M_.maximum_lag + " << lag  << ", " << tsid << " ) = ";
+        output << "M_.exo_histval( " << tsid << ", M_.maximum_lag + " << lag << ") = ";
+      else if (type == eExogenousDet)
+        output << "M_.exo_det_histval( " << tsid << ", M_.maximum_lag + " << lag << ") = ";
 
       expression->writeOutput(output);
       output << ";" << endl;
-- 
GitLab