Skip to content
Snippets Groups Projects
Commit eb0ecd4c authored by Michel Juillard's avatar Michel Juillard Committed by Sébastien Villemot
Browse files

Preprocessor: corrected bug on HISTVAL with lags > 1

(manually cherry-picked from a5b5f399)
parent 2f250708
Branches
No related tags found
No related merge requests found
...@@ -175,16 +175,32 @@ HistValStatement::writeOutput(ostream &output, const string &basename) const ...@@ -175,16 +175,32 @@ HistValStatement::writeOutput(ostream &output, const string &basename) const
{ {
output << "%" << endl output << "%" << endl
<< "% HISTVAL instructions" << 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(); for (hist_values_type::const_iterator it = hist_values.begin();
it != hist_values.end(); it++) it != hist_values.end(); it++)
{ {
const int &symb_id = it->first.first; int symb_id = it->first.first;
const int &lag = it->first.second; int lag = it->first.second;
const NodeID expression = it->second; const NodeID expression = it->second;
SymbolType type = symbol_table.getType(symb_id); 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; int tsid = symbol_table.getTypeSpecificID(symb_id) + 1;
if (type == eEndogenous) if (type == eEndogenous)
......
/* /*
* Copyright (C) 2003-2009 Dynare Team * Copyright (C) 2003-2010 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
...@@ -343,6 +343,15 @@ SymbolTable::addExpectationAuxiliaryVar(int information_set, int index) throw (F ...@@ -343,6 +343,15 @@ SymbolTable::addExpectationAuxiliaryVar(int information_set, int index) throw (F
return symb_id; 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].orig_symb_id == orig_symb_id) && (aux_vars[i].orig_lead_lag == orig_lead_lag))
return aux_vars[i].symb_id;
return -1;
}
void void
SymbolTable::markPredetermined(int symb_id) throw (UnknownSymbolIDException, FrozenException) SymbolTable::markPredetermined(int symb_id) throw (UnknownSymbolIDException, FrozenException)
{ {
......
/* /*
* Copyright (C) 2003-2009 Dynare Team * Copyright (C) 2003-2010 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
...@@ -191,6 +191,13 @@ public: ...@@ -191,6 +191,13 @@ public:
\return the symbol ID of the new symbol \return the symbol ID of the new symbol
*/ */
int addExpectationAuxiliaryVar(int information_set, int index) throw (FrozenException); int addExpectationAuxiliaryVar(int information_set, int index) 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 //! Tests if symbol already exists
inline bool exists(const string &name) const; inline bool exists(const string &name) const;
//! Get symbol name (by ID) //! Get symbol name (by ID)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment