From 0e5f9defbca9226eb8ad0599564022cf187fcfad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Tue, 14 Nov 2023 14:29:17 +0100
Subject: [PATCH] =?UTF-8?q?Preprocessor:=20error=20out=20if=20an=20?=
 =?UTF-8?q?=E2=80=9Cinitval=E2=80=9D=20block=20appears=20after=20an=20?=
 =?UTF-8?q?=E2=80=9Cendval=E2=80=9D=20block?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Ref. preprocessor#104
---
 meson.build                                   |  2 +
 preprocessor                                  |  2 +-
 .../rbc_det4_endval_initval_xfail.mod         | 86 +++++++++++++++++++
 3 files changed, 89 insertions(+), 1 deletion(-)
 create mode 100644 tests/deterministic_simulations/rbc_det4_endval_initval_xfail.mod

diff --git a/meson.build b/meson.build
index 41748b1494..e9ce6d58f9 100644
--- a/meson.build
+++ b/meson.build
@@ -1287,6 +1287,8 @@ mod_and_m_tests = [
   { 'test' : [ 'deterministic_simulations/rbc_det2.mod' ] },
   { 'test' : [ 'deterministic_simulations/rbc_det3.mod' ] },
   { 'test' : [ 'deterministic_simulations/rbc_det4.mod' ] },
+  { 'test' : [ 'deterministic_simulations/rbc_det4_endval_initval_xfail.mod' ],
+    'should_fail' : true },
   { 'test' : [ 'deterministic_simulations/rbc_det5.mod' ] },
   { 'test' : [ 'deterministic_simulations/rbc_det6.mod' ] },
   { 'test' : [ 'deterministic_simulations/homotopy.mod' ] },
diff --git a/preprocessor b/preprocessor
index 63f04636ee..ac35ef6101 160000
--- a/preprocessor
+++ b/preprocessor
@@ -1 +1 @@
-Subproject commit 63f04636ee848b3c70905e3f78dd51ba25cfc506
+Subproject commit ac35ef610143695ec5e1e9b74a8fdff4803b6ac0
diff --git a/tests/deterministic_simulations/rbc_det4_endval_initval_xfail.mod b/tests/deterministic_simulations/rbc_det4_endval_initval_xfail.mod
new file mode 100644
index 0000000000..e40c4f2697
--- /dev/null
+++ b/tests/deterministic_simulations/rbc_det4_endval_initval_xfail.mod
@@ -0,0 +1,86 @@
+// Checks that having an initval after an endval block triggers an error
+// See preprocessor#104
+
+var Capital, Output, Labour, Consumption, Efficiency, efficiency, ExpectedTerm;
+
+varexo EfficiencyInnovation;
+
+parameters beta, theta, tau, alpha, psi, delta, rho, effstar, sigma2;
+
+beta    =   0.9900;
+theta   =   0.3570;
+tau     =   2.0000;
+alpha   =   0.4500;
+psi     =  -0.1000;
+delta   =   0.0200;
+rho     =   0.8000;
+effstar =   1.0000;
+sigma2  =   0;
+
+model(block,bytecode,cutoff=0);
+
+  // Eq. n°1:
+  efficiency = rho*efficiency(-1) + EfficiencyInnovation;
+
+  // Eq. n°2:
+  Efficiency = effstar*exp(efficiency);
+
+  // Eq. n°3:
+  Output = Efficiency*(alpha*(Capital(-1)^psi)+(1-alpha)*(Labour^psi))^(1/psi);
+
+  // Eq. n°4:
+  Capital = Output-Consumption + (1-delta)*Capital(-1);
+
+  // Eq. n°5:
+  ((1-theta)/theta)*(Consumption/(1-Labour)) - (1-alpha)*(Output/Labour)^(1-psi);
+
+  // Eq. n°6:
+  (((Consumption^theta)*((1-Labour)^(1-theta)))^(1-tau))/Consumption  = ExpectedTerm(1);
+
+  // Eq. n°7:
+  ExpectedTerm = beta*((((Consumption^theta)*((1-Labour)^(1-theta)))^(1-tau))/Consumption)*(alpha*((Output/Capital(-1))^(1-psi))+(1-delta));
+
+end;
+
+steady_state_model;
+efficiency = EfficiencyInnovation/(1-rho);
+Efficiency = effstar*exp(efficiency);
+Output_per_unit_of_Capital=((1/beta-1+delta)/alpha)^(1/(1-psi));
+Consumption_per_unit_of_Capital=Output_per_unit_of_Capital-delta;
+Labour_per_unit_of_Capital=(((Output_per_unit_of_Capital/Efficiency)^psi-alpha)/(1-alpha))^(1/psi);
+Output_per_unit_of_Labour=Output_per_unit_of_Capital/Labour_per_unit_of_Capital;
+Consumption_per_unit_of_Labour=Consumption_per_unit_of_Capital/Labour_per_unit_of_Capital;
+
+% Compute steady state share of capital.
+ShareOfCapital=alpha/(alpha+(1-alpha)*Labour_per_unit_of_Capital^psi);
+
+% Compute steady state of the endogenous variables.
+Labour=1/(1+Consumption_per_unit_of_Labour/((1-alpha)*theta/(1-theta)*Output_per_unit_of_Labour^(1-psi)));
+Consumption=Consumption_per_unit_of_Labour*Labour;
+Capital=Labour/Labour_per_unit_of_Capital;
+Output=Output_per_unit_of_Capital*Capital;
+ExpectedTerm=beta*((((Consumption^theta)*((1-Labour)^(1-theta)))^(1-tau))/Consumption)
+             *(alpha*((Output/Capital)^(1-psi))+1-delta);
+end;
+
+endval;
+EfficiencyInnovation = (1-rho)*log(1.05);
+end;
+
+steady;
+
+initval;
+EfficiencyInnovation = 0;
+end;
+
+steady;
+
+perfect_foresight_setup(periods=300);
+perfect_foresight_solver;
+
+if ~oo_.deterministic_simulation.status
+   error('Perfect foresight simulation failed')
+end
+
+rplot Consumption;
+rplot Capital;
-- 
GitLab