Commit 7b5d57d4 authored by ferhat's avatar ferhat
Browse files

Solves issues in deterministic simulation:

- replaces maximum_endo_(lead|lag) by maximum_(lead|lag) to determine the maximum number of lead and lag in deterministic simulation
- allows to use bytecode in solve_perfect_foresight_model.m
- Adds model information in bytecode
parent 4fc785f8
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#ifndef _CODEINTERPRETER_HH #ifndef _CODEINTERPRETER_HH
#define _CODEINTERPRETER_HH #define _CODEINTERPRETER_HH
//#define DEBUGL //#define DEBUGL
#include <iostream>
#include <cstdlib> #include <cstdlib>
#include <cstdio> #include <cstdio>
#include <fstream> #include <fstream>
...@@ -1414,7 +1416,7 @@ private: ...@@ -1414,7 +1416,7 @@ private:
int u_count_int; int u_count_int;
int nb_col_jacob; int nb_col_jacob;
unsigned int det_exo_size, exo_size, other_endo_size; unsigned int det_exo_size, exo_size, other_endo_size;
unsigned int nb_col_other_endo_jacob; unsigned int nb_col_det_exo_jacob, nb_col_exo_jacob, nb_col_other_endo_jacob;
public: public:
inline inline
FBEGINBLOCK_() FBEGINBLOCK_()
...@@ -1426,7 +1428,7 @@ public: ...@@ -1426,7 +1428,7 @@ public:
FBEGINBLOCK_(unsigned int size_arg, BlockSimulationType type_arg, int unsigned first_element, int unsigned block_size, FBEGINBLOCK_(unsigned int size_arg, BlockSimulationType type_arg, int unsigned first_element, int unsigned block_size,
const vector<int> &variable_arg, const vector<int> &equation_arg, const vector<int> &variable_arg, const vector<int> &equation_arg,
bool is_linear_arg, int endo_nbr_arg, int Max_Lag_arg, int Max_Lead_arg, int &u_count_int_arg, int nb_col_jacob_arg, bool is_linear_arg, int endo_nbr_arg, int Max_Lag_arg, int Max_Lead_arg, int &u_count_int_arg, int nb_col_jacob_arg,
unsigned int det_exo_size_arg, unsigned int exo_size_arg, unsigned int other_endo_size_arg, unsigned int nb_col_other_endo_jacob_arg, unsigned int det_exo_size_arg, unsigned int nb_col_det_exo_jacob_arg, unsigned int exo_size_arg, unsigned int nb_col_exo_jacob_arg, unsigned int other_endo_size_arg, unsigned int nb_col_other_endo_jacob_arg,
const vector<unsigned int> &det_exogenous_arg, const vector<unsigned int> &exogenous_arg, const vector<unsigned int> &other_endogenous_arg) const vector<unsigned int> &det_exogenous_arg, const vector<unsigned int> &exogenous_arg, const vector<unsigned int> &other_endogenous_arg)
{ {
op_code = FBEGINBLOCK; size = size_arg; type = type_arg; op_code = FBEGINBLOCK; size = size_arg; type = type_arg;
...@@ -1436,8 +1438,10 @@ public: ...@@ -1436,8 +1438,10 @@ public:
exogenous = vector<unsigned int>(exogenous_arg); exogenous = vector<unsigned int>(exogenous_arg);
other_endogenous = vector<unsigned int>(other_endogenous_arg); other_endogenous = vector<unsigned int>(other_endogenous_arg);
is_linear = is_linear_arg; endo_nbr = endo_nbr_arg; Max_Lag = Max_Lag_arg; Max_Lead = Max_Lead_arg; u_count_int = u_count_int_arg; is_linear = is_linear_arg; endo_nbr = endo_nbr_arg; Max_Lag = Max_Lag_arg; Max_Lead = Max_Lead_arg; u_count_int = u_count_int_arg;
nb_col_jacob = nb_col_jacob_arg; det_exo_size = det_exo_size_arg; exo_size = exo_size_arg; other_endo_size = other_endo_size_arg; nb_col_jacob = nb_col_jacob_arg;
nb_col_other_endo_jacob = nb_col_other_endo_jacob_arg; det_exo_size = det_exo_size_arg; nb_col_det_exo_jacob = nb_col_det_exo_jacob_arg;
exo_size = exo_size_arg; nb_col_exo_jacob = nb_col_exo_jacob_arg;
other_endo_size = other_endo_size_arg; nb_col_other_endo_jacob = nb_col_other_endo_jacob_arg;
}; };
inline inline
FBEGINBLOCK_(unsigned int size_arg, BlockSimulationType type_arg, int unsigned first_element, int unsigned block_size, FBEGINBLOCK_(unsigned int size_arg, BlockSimulationType type_arg, int unsigned first_element, int unsigned block_size,
...@@ -1450,7 +1454,7 @@ public: ...@@ -1450,7 +1454,7 @@ public:
is_linear = is_linear_arg; endo_nbr = endo_nbr_arg; Max_Lag = Max_Lag_arg; Max_Lead = Max_Lead_arg; u_count_int = u_count_int_arg; is_linear = is_linear_arg; endo_nbr = endo_nbr_arg; Max_Lag = Max_Lag_arg; Max_Lead = Max_Lead_arg; u_count_int = u_count_int_arg;
nb_col_jacob = nb_col_jacob_arg; nb_col_jacob = nb_col_jacob_arg;
det_exo_size = 0; exo_size = 0; other_endo_size = 0; det_exo_size = 0; exo_size = 0; other_endo_size = 0;
nb_col_other_endo_jacob = 0; nb_col_det_exo_jacob = 0;nb_col_exo_jacob = 0;nb_col_other_endo_jacob = 0;
} }
inline unsigned int inline unsigned int
get_size() get_size()
...@@ -1503,11 +1507,21 @@ public: ...@@ -1503,11 +1507,21 @@ public:
return exo_size; return exo_size;
}; };
inline unsigned int inline unsigned int
get_nb_col_exo_jacob()
{
return nb_col_exo_jacob;
};
inline unsigned int
get_det_exo_size() get_det_exo_size()
{ {
return det_exo_size; return det_exo_size;
}; };
inline unsigned int inline unsigned int
get_nb_col_det_exo_jacob()
{
return nb_col_det_exo_jacob;
};
inline unsigned int
get_other_endo_size() get_other_endo_size()
{ {
return other_endo_size; return other_endo_size;
...@@ -1539,7 +1553,9 @@ public: ...@@ -1539,7 +1553,9 @@ public:
} }
CompileCode.write(reinterpret_cast<char *>(&nb_col_jacob), sizeof(nb_col_jacob)); CompileCode.write(reinterpret_cast<char *>(&nb_col_jacob), sizeof(nb_col_jacob));
CompileCode.write(reinterpret_cast<char *>(&det_exo_size), sizeof(det_exo_size)); CompileCode.write(reinterpret_cast<char *>(&det_exo_size), sizeof(det_exo_size));
CompileCode.write(reinterpret_cast<char *>(&nb_col_det_exo_jacob), sizeof(nb_col_det_exo_jacob));
CompileCode.write(reinterpret_cast<char *>(&exo_size), sizeof(exo_size)); CompileCode.write(reinterpret_cast<char *>(&exo_size), sizeof(exo_size));
CompileCode.write(reinterpret_cast<char *>(&nb_col_exo_jacob), sizeof(nb_col_exo_jacob));
CompileCode.write(reinterpret_cast<char *>(&other_endo_size), sizeof(other_endo_size)); CompileCode.write(reinterpret_cast<char *>(&other_endo_size), sizeof(other_endo_size));
CompileCode.write(reinterpret_cast<char *>(&nb_col_other_endo_jacob), sizeof(nb_col_other_endo_jacob)); CompileCode.write(reinterpret_cast<char *>(&nb_col_other_endo_jacob), sizeof(nb_col_other_endo_jacob));
...@@ -1577,7 +1593,9 @@ public: ...@@ -1577,7 +1593,9 @@ public:
} }
memcpy(&nb_col_jacob, code, sizeof(nb_col_jacob)); code += sizeof(nb_col_jacob); memcpy(&nb_col_jacob, code, sizeof(nb_col_jacob)); code += sizeof(nb_col_jacob);
memcpy(&det_exo_size, code, sizeof(det_exo_size)); code += sizeof(det_exo_size); memcpy(&det_exo_size, code, sizeof(det_exo_size)); code += sizeof(det_exo_size);
memcpy(&nb_col_det_exo_jacob, code, sizeof(nb_col_det_exo_jacob)); code += sizeof(nb_col_det_exo_jacob);
memcpy(&exo_size, code, sizeof(exo_size)); code += sizeof(exo_size); memcpy(&exo_size, code, sizeof(exo_size)); code += sizeof(exo_size);
memcpy(&nb_col_exo_jacob, code, sizeof(nb_col_exo_jacob)); code += sizeof(nb_col_exo_jacob);
memcpy(&other_endo_size, code, sizeof(other_endo_size)); code += sizeof(other_endo_size); memcpy(&other_endo_size, code, sizeof(other_endo_size)); code += sizeof(other_endo_size);
memcpy(&nb_col_other_endo_jacob, code, sizeof(nb_col_other_endo_jacob)); code += sizeof(nb_col_other_endo_jacob); memcpy(&nb_col_other_endo_jacob, code, sizeof(nb_col_other_endo_jacob)); code += sizeof(nb_col_other_endo_jacob);
......
...@@ -868,6 +868,7 @@ DynamicModel::writeModelEquationsCode(string &file_name, const string &bin_basen ...@@ -868,6 +868,7 @@ DynamicModel::writeModelEquationsCode(string &file_name, const string &bin_basen
prev_lag = -999999999; prev_lag = -999999999;
int prev_type = -1; int prev_type = -1;
int count_col_exo = 0; int count_col_exo = 0;
int count_col_det_exo = 0;
for (map<pair< pair<int, int>, pair<int, int> >, expr_t>::const_iterator it = first_derivatives_reordered_exo.begin(); for (map<pair< pair<int, int>, pair<int, int> >, expr_t>::const_iterator it = first_derivatives_reordered_exo.begin();
it != first_derivatives_reordered_exo.end(); it++) it != first_derivatives_reordered_exo.end(); it++)
...@@ -880,7 +881,10 @@ DynamicModel::writeModelEquationsCode(string &file_name, const string &bin_basen ...@@ -880,7 +881,10 @@ DynamicModel::writeModelEquationsCode(string &file_name, const string &bin_basen
prev_var = var; prev_var = var;
prev_lag = lag; prev_lag = lag;
prev_type = type; prev_type = type;
count_col_exo++; if (type == eExogenous)
count_col_exo++;
else if (type == eExogenousDet)
count_col_det_exo++;
} }
} }
...@@ -892,13 +896,15 @@ DynamicModel::writeModelEquationsCode(string &file_name, const string &bin_basen ...@@ -892,13 +896,15 @@ DynamicModel::writeModelEquationsCode(string &file_name, const string &bin_basen
equation_reordered, equation_reordered,
false, false,
symbol_table.endo_nbr(), symbol_table.endo_nbr(),
0, max_endo_lag,
0, max_endo_lead,
u_count_int, u_count_int,
count_col_endo, count_col_endo,
symbol_table.exo_det_nbr(), symbol_table.exo_det_nbr(),
count_col_det_exo,
symbol_table.exo_nbr(),
count_col_exo, count_col_exo,
other_endo_size, 0,
0, 0,
exo_det, exo_det,
exo, exo,
...@@ -1101,6 +1107,7 @@ DynamicModel::writeModelEquationsCode_Block(string &file_name, const string &bin ...@@ -1101,6 +1107,7 @@ DynamicModel::writeModelEquationsCode_Block(string &file_name, const string &bin
unsigned int block_exo_det_size = exo_det_block[block].size(); unsigned int block_exo_det_size = exo_det_block[block].size();
unsigned int block_other_endo_size = other_endo_block[block].size(); unsigned int block_other_endo_size = other_endo_block[block].size();
int block_max_lag = max_leadlag_block[block].first; int block_max_lag = max_leadlag_block[block].first;
int block_max_lead = max_leadlag_block[block].second;
if (simulation_type == SOLVE_TWO_BOUNDARIES_SIMPLE || simulation_type == SOLVE_TWO_BOUNDARIES_COMPLETE if (simulation_type == SOLVE_TWO_BOUNDARIES_SIMPLE || simulation_type == SOLVE_TWO_BOUNDARIES_COMPLETE
|| simulation_type == SOLVE_BACKWARD_COMPLETE || simulation_type == SOLVE_FORWARD_COMPLETE) || simulation_type == SOLVE_BACKWARD_COMPLETE || simulation_type == SOLVE_FORWARD_COMPLETE)
...@@ -1135,19 +1142,40 @@ DynamicModel::writeModelEquationsCode_Block(string &file_name, const string &bin ...@@ -1135,19 +1142,40 @@ DynamicModel::writeModelEquationsCode_Block(string &file_name, const string &bin
count_col_endo++; count_col_endo++;
} }
} }
unsigned int count_col_det_exo = 0;
vector<unsigned int> exo_det; vector<unsigned int> exo_det;
for (lag_var_t::const_iterator it = exo_det_block[block].begin(); it != exo_det_block[block].end(); it++) for (lag_var_t::const_iterator it = exo_det_block[block].begin(); it != exo_det_block[block].end(); it++)
exo_det.push_back(it->first); for (var_t::const_iterator it1 = it->second.begin(); it1 != it->second.end(); it1++)
{
count_col_det_exo++;
if (find (exo_det.begin(), exo_det.end(), *it1) == exo_det.end())
exo_det.push_back(*it1);
}
unsigned int count_col_exo = 0;
vector<unsigned int> exo; vector<unsigned int> exo;
for (lag_var_t::const_iterator it = exo_block[block].begin(); it != exo_block[block].end(); it++) for (lag_var_t::const_iterator it = exo_block[block].begin(); it != exo_block[block].end(); it++)
exo.push_back(it->first); for (var_t::const_iterator it1 = it->second.begin(); it1 != it->second.end(); it1++)
{
count_col_exo++;
if (find (exo.begin(), exo.end(), *it1) == exo.end())
exo.push_back(*it1);
}
vector<unsigned int> other_endo; vector<unsigned int> other_endo;
unsigned int count_col_other_endo = 0; unsigned int count_col_other_endo = 0;
for (lag_var_t::const_iterator it = other_endo_block[block].begin(); it != other_endo_block[block].end(); it++) for (lag_var_t::const_iterator it = other_endo_block[block].begin(); it != other_endo_block[block].end(); it++)
{ for (var_t::const_iterator it1 = it->second.begin(); it1 != it->second.end(); it1++)
other_endo.push_back(it->first); {
count_col_other_endo += it->second.size(); count_col_other_endo++;
} if (find (exo_det.begin(), exo_det.end(), *it1) == exo_det.end())
{
//other_endo.push_back(it->first);
//count_col_other_endo += it->second.size();
other_endo.push_back(*it1);
}
}
FBEGINBLOCK_ fbeginblock(block_mfs, FBEGINBLOCK_ fbeginblock(block_mfs,
simulation_type, simulation_type,
getBlockFirstEquation(block), getBlockFirstEquation(block),
...@@ -1157,19 +1185,21 @@ DynamicModel::writeModelEquationsCode_Block(string &file_name, const string &bin ...@@ -1157,19 +1185,21 @@ DynamicModel::writeModelEquationsCode_Block(string &file_name, const string &bin
blocks_linear[block], blocks_linear[block],
symbol_table.endo_nbr(), symbol_table.endo_nbr(),
block_max_lag, block_max_lag,
block_max_lag, block_max_lead,
u_count_int, u_count_int,
count_col_endo, count_col_endo,
block_exo_det_size, exo_det.size(),
count_col_det_exo,
exo.size(),
getBlockExoColSize(block), getBlockExoColSize(block),
block_other_endo_size, other_endo.size(),
count_col_other_endo, count_col_other_endo,
exo_det, exo_det,
exo, exo,
other_endo other_endo
); );
fbeginblock.write(code_file, instruction_number); fbeginblock.write(code_file, instruction_number);
// The equations // The equations
for (i = 0; i < (int) block_size; i++) for (i = 0; i < (int) block_size; i++)
{ {
...@@ -1412,7 +1442,7 @@ DynamicModel::writeModelEquationsCode_Block(string &file_name, const string &bin ...@@ -1412,7 +1442,7 @@ DynamicModel::writeModelEquationsCode_Block(string &file_name, const string &bin
} }
prev_var = -1; prev_var = -1;
prev_lag = -999999999; prev_lag = -999999999;
int count_col_exo = 0; count_col_exo = 0;
for (map<pair<int, pair<int, int> >, expr_t>::const_iterator it = tmp_exo_derivative.begin(); it != tmp_exo_derivative.end(); it++) for (map<pair<int, pair<int, int> >, expr_t>::const_iterator it = tmp_exo_derivative.begin(); it != tmp_exo_derivative.end(); it++)
{ {
int lag = it->first.first; int lag = it->first.first;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment