From 9d3c391707e9d2fc4f6983fdb90d06341d1082b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Mon, 18 Mar 2024 15:58:06 +0100
Subject: [PATCH] Bytecode / conditional forecast: fix test over consistency of
 variable flipping

Function Interpreter::check_for_controlled_exo_validity() would give incorrect
results because the sconstrained_extended_path structure was containing 1-based
variable indices (it is expecting 0-based ones).
---
 mex/sources/bytecode/bytecode.cc | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/mex/sources/bytecode/bytecode.cc b/mex/sources/bytecode/bytecode.cc
index daab14ccb0..08942f165e 100644
--- a/mex/sources/bytecode/bytecode.cc
+++ b/mex/sources/bytecode/bytecode.cc
@@ -317,8 +317,8 @@ mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
       vector_table_conditional_local_type vv3 = table_conditional_global[0];
       for (int i = 0; i < nb_constrained; i++)
         {
-          sconditional_extended_path[i].exo_num = ceil(constrained_var_value[i]);
-          sconditional_extended_path[i].var_num = ceil(controlled_varexo_value[i]);
+          sconditional_extended_path[i].exo_num = ceil(constrained_var_value[i]) - 1;
+          sconditional_extended_path[i].var_num = ceil(controlled_varexo_value[i]) - 1;
           mxArray* Array_constrained_paths_ = mxGetCell(constrained_paths_, i);
           double* specific_constrained_paths_ = mxGetPr(Array_constrained_paths_);
           double* specific_constrained_int_date_ = mxGetPr(mxGetCell(constrained_int_date_, i));
@@ -341,11 +341,11 @@ mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
             {
               constrained_int_date[j] = static_cast<int>(specific_constrained_int_date_[j]) - 1;
               conditional_local.is_cond = true;
-              conditional_local.var_exo = sconditional_extended_path[i].var_num - 1;
-              conditional_local.var_endo = sconditional_extended_path[i].exo_num - 1;
+              conditional_local.var_exo = sconditional_extended_path[i].var_num;
+              conditional_local.var_endo = sconditional_extended_path[i].exo_num;
               conditional_local.constrained_value = specific_constrained_paths_[j];
               table_conditional_global[constrained_int_date[j]]
-                                      [sconditional_extended_path[i].exo_num - 1]
+                                      [sconditional_extended_path[i].exo_num]
                   = conditional_local;
               sconditional_extended_path[i].per_value[j]
                   = {constrained_int_date[j], specific_constrained_paths_[j]};
-- 
GitLab