Preprocessor: corrected bug on HISTVAL with lags > 1

time-shift
Michel Juillard 2010-09-10 11:43:48 +02:00
parent 49daa411f4
commit a5b5f39987
3 changed files with 35 additions and 3 deletions

View File

@ -182,16 +182,32 @@ HistValStatement::writeOutput(ostream &output, const string &basename) const
{
output << "%" << endl
<< "% HISTVAL instructions" << endl
<< "%" << endl;
<< "%" << endl
<< "oo_.endo_simul = zeros(M_.endo_nbr,M_.maximum_lag);" << endl;
for (hist_values_type::const_iterator it = hist_values.begin();
it != hist_values.end(); it++)
{
const int &symb_id = it->first.first;
const int &lag = it->first.second;
int symb_id = it->first.first;
int lag = it->first.second;
const NodeID expression = it->second;
SymbolType type = symbol_table.getType(symb_id);
if (type == eEndogenous && lag < 0)
{
const int new_symb_id = symbol_table.searchAuxiliaryVars(symb_id,lag);
if (new_symb_id != -1)
{
symb_id = new_symb_id;
lag = 0;
}
else if (symbol_table.AuxVarsSize() > 0)
{
cerr << "Histval: this variable doesn't exist with such a lag in the model" << endl;
exit(EXIT_FAILURE);
}
}
int tsid = symbol_table.getTypeSpecificID(symb_id) + 1;
if (type == eEndogenous)

View File

@ -364,6 +364,15 @@ SymbolTable::addExpectationAuxiliaryVar(int information_set, int index, const st
return symb_id;
}
int
SymbolTable::searchAuxiliaryVars(int orig_symb_id, int orig_lead_lag) const
{
for (int i=0; i < aux_vars.size();++i)
if ((aux_vars[i].get_orig_symb_id() == orig_symb_id) && (aux_vars[i].get_orig_lead_lag() == orig_lead_lag))
return aux_vars[i].get_symb_id();
return -1;
}
void
SymbolTable::markPredetermined(int symb_id) throw (UnknownSymbolIDException, FrozenException)
{

View File

@ -204,6 +204,13 @@ public:
\return the symbol ID of the new symbol
*/
int addExpectationAuxiliaryVar(int information_set, int index, const string &information_set_name) throw (FrozenException);
//! Searches auxiliary variables by symbol_id and lead_lag
/*!
\return the symbol ID of the auxiliary variable and -1 if not found
*/
int searchAuxiliaryVars(int orig_symb_id, int orig_lead_lag) const;
//! Returns the number of auxiliary variables
int AuxVarsSize() const {return aux_vars.size();};
//! Tests if symbol already exists
inline bool exists(const string &name) const;
//! Get symbol name (by ID)