Preprocessor: corrected bug on HISTVAL with lags > 1
parent
49daa411f4
commit
a5b5f39987
|
@ -182,16 +182,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)
|
||||||
|
|
|
@ -364,6 +364,15 @@ SymbolTable::addExpectationAuxiliaryVar(int information_set, int index, const st
|
||||||
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].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
|
void
|
||||||
SymbolTable::markPredetermined(int symb_id) throw (UnknownSymbolIDException, FrozenException)
|
SymbolTable::markPredetermined(int symb_id) throw (UnknownSymbolIDException, FrozenException)
|
||||||
{
|
{
|
||||||
|
|
|
@ -204,6 +204,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, const string &information_set_name) throw (FrozenException);
|
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
|
//! 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)
|
||||||
|
|
Loading…
Reference in New Issue