Steady state file: in the presence of 'ramsey_policy', no longer check that the declarations are recursive, and use input vector of steady state file as initial values
parent
4cca2874ae
commit
c58312d3b7
|
@ -93,6 +93,9 @@ ModFile::checkPass()
|
||||||
it != statements.end(); it++)
|
it != statements.end(); it++)
|
||||||
(*it)->checkPass(mod_file_struct);
|
(*it)->checkPass(mod_file_struct);
|
||||||
|
|
||||||
|
// Check the steady state block
|
||||||
|
steady_state_model.checkPass(mod_file_struct.ramsey_policy_present);
|
||||||
|
|
||||||
// If order option has not been set, default to 2
|
// If order option has not been set, default to 2
|
||||||
if (!mod_file_struct.order_option)
|
if (!mod_file_struct.order_option)
|
||||||
mod_file_struct.order_option = 2;
|
mod_file_struct.order_option = 2;
|
||||||
|
@ -441,7 +444,7 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create steady state file
|
// Create steady state file
|
||||||
steady_state_model.writeSteadyStateFile(basename);
|
steady_state_model.writeSteadyStateFile(basename, mod_file_struct.ramsey_policy_present);
|
||||||
|
|
||||||
cout << "done" << endl;
|
cout << "done" << endl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1869,18 +1869,7 @@ ParsingDriver::add_steady_state_model_equal(string *varname, NodeID expr)
|
||||||
if (type != eEndogenous && type != eModFileLocalVariable)
|
if (type != eEndogenous && type != eModFileLocalVariable)
|
||||||
error(*varname + " has incorrect type");
|
error(*varname + " has incorrect type");
|
||||||
|
|
||||||
try
|
mod_file->steady_state_model.addDefinition(id, expr);
|
||||||
{
|
|
||||||
mod_file->steady_state_model.addDefinition(id, expr);
|
|
||||||
}
|
|
||||||
catch(SteadyStateModel::AlreadyDefinedException &e)
|
|
||||||
{
|
|
||||||
error(*varname + " has already been defined in the steady state block");
|
|
||||||
}
|
|
||||||
catch(SteadyStateModel::UndefinedVariableException &e)
|
|
||||||
{
|
|
||||||
error(e.varname + " is not yet initialized at this point");
|
|
||||||
}
|
|
||||||
|
|
||||||
delete varname;
|
delete varname;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,33 +28,50 @@ SteadyStateModel::SteadyStateModel(SymbolTable &symbol_table_arg, NumericalConst
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SteadyStateModel::addDefinition(int symb_id, NodeID expr) throw (UndefinedVariableException, AlreadyDefinedException)
|
SteadyStateModel::addDefinition(int symb_id, NodeID expr)
|
||||||
{
|
{
|
||||||
assert(symbol_table.getType(symb_id) == eEndogenous
|
assert(symbol_table.getType(symb_id) == eEndogenous
|
||||||
|| symbol_table.getType(symb_id) == eModFileLocalVariable);
|
|| symbol_table.getType(symb_id) == eModFileLocalVariable);
|
||||||
|
|
||||||
// Check that symbol is not already defined
|
|
||||||
if (find(recursive_order.begin(), recursive_order.end(), symb_id)
|
|
||||||
!= recursive_order.end())
|
|
||||||
throw AlreadyDefinedException(symbol_table.getName(symb_id));
|
|
||||||
|
|
||||||
// Check that expression has no undefined symbol
|
|
||||||
set<pair<int, int> > used_symbols;
|
|
||||||
expr->collectVariables(eEndogenous, used_symbols);
|
|
||||||
expr->collectVariables(eModFileLocalVariable, used_symbols);
|
|
||||||
for(set<pair<int, int> >::const_iterator it = used_symbols.begin();
|
|
||||||
it != used_symbols.end(); it++)
|
|
||||||
if (find(recursive_order.begin(), recursive_order.end(), it->first)
|
|
||||||
== recursive_order.end())
|
|
||||||
throw UndefinedVariableException(symbol_table.getName(it->first));
|
|
||||||
|
|
||||||
// Add the variable
|
// Add the variable
|
||||||
recursive_order.push_back(symb_id);
|
recursive_order.push_back(symb_id);
|
||||||
def_table[symb_id] = AddEqual(AddVariable(symb_id), expr);
|
def_table[symb_id] = AddEqual(AddVariable(symb_id), expr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SteadyStateModel::writeSteadyStateFile(const string &basename) const
|
SteadyStateModel::checkPass(bool ramsey_policy) const
|
||||||
|
{
|
||||||
|
for (vector<int>::const_iterator it = recursive_order.begin();
|
||||||
|
it != recursive_order.end(); ++it)
|
||||||
|
{
|
||||||
|
// Check that symbol is not already defined
|
||||||
|
if (find(recursive_order.begin(), it, *it) != it)
|
||||||
|
{
|
||||||
|
cerr << "ERROR: in the 'steady_state' block, variable '" << symbol_table.getName(*it) << "' is declared twice" << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that expression has no undefined symbol
|
||||||
|
if (!ramsey_policy)
|
||||||
|
{
|
||||||
|
set<pair<int, int> > used_symbols;
|
||||||
|
NodeID expr = def_table.find(*it)->second;
|
||||||
|
expr->collectVariables(eEndogenous, used_symbols);
|
||||||
|
expr->collectVariables(eModFileLocalVariable, used_symbols);
|
||||||
|
for(set<pair<int, int> >::const_iterator it2 = used_symbols.begin();
|
||||||
|
it2 != used_symbols.end(); ++it2)
|
||||||
|
if (find(recursive_order.begin(), it, it2->first) == it
|
||||||
|
&& *it != it2->first)
|
||||||
|
{
|
||||||
|
cerr << "ERROR: in the 'steady_state' block, variable '" << symbol_table.getName(it2->first) << "' is undefined in the declaration of variable '" << symbol_table.getName(*it) << "'" << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SteadyStateModel::writeSteadyStateFile(const string &basename, bool ramsey_policy) const
|
||||||
{
|
{
|
||||||
if (recursive_order.size() == 0)
|
if (recursive_order.size() == 0)
|
||||||
return;
|
return;
|
||||||
|
@ -69,7 +86,12 @@ SteadyStateModel::writeSteadyStateFile(const string &basename) const
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
output << "function [ys_, check_] = " << basename << "_steadystate(ys_orig_, exo_)" << endl
|
output << "function [ys_, check_] = " << basename << "_steadystate(";
|
||||||
|
if (ramsey_policy)
|
||||||
|
output << "ys_";
|
||||||
|
else
|
||||||
|
output << "ys_orig_";
|
||||||
|
output << ", exo_)" << endl
|
||||||
<< "% Steady state generated by Dynare preprocessor" << endl
|
<< "% Steady state generated by Dynare preprocessor" << endl
|
||||||
<< " global M_" << endl
|
<< " global M_" << endl
|
||||||
<< " ys_=zeros(" << symbol_table.orig_endo_nbr() << ",1);" << endl;
|
<< " ys_=zeros(" << symbol_table.orig_endo_nbr() << ",1);" << endl;
|
||||||
|
|
|
@ -34,24 +34,19 @@ private:
|
||||||
const StaticModel &static_model;
|
const StaticModel &static_model;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
class AlreadyDefinedException
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
const string &varname;
|
|
||||||
AlreadyDefinedException(const string &varname_arg) : varname(varname_arg) {}
|
|
||||||
};
|
|
||||||
class UndefinedVariableException
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
const string &varname;
|
|
||||||
UndefinedVariableException(const string &varname_arg) : varname(varname_arg) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
SteadyStateModel(SymbolTable &symbol_table_arg, NumericalConstants &num_constants, ExternalFunctionsTable &external_functions_table_arg, const StaticModel &static_model_arg);
|
SteadyStateModel(SymbolTable &symbol_table_arg, NumericalConstants &num_constants, ExternalFunctionsTable &external_functions_table_arg, const StaticModel &static_model_arg);
|
||||||
//! Add an expression of the form "var = expr;"
|
//! Add an expression of the form "var = expr;"
|
||||||
void addDefinition(int symb_id, NodeID expr) throw (UndefinedVariableException, AlreadyDefinedException);
|
void addDefinition(int symb_id, NodeID expr);
|
||||||
|
//! Checks that definitions are in a recursive order, and that no variable is declared twice
|
||||||
|
/*!
|
||||||
|
\param[in] ramsey_policy Is there a ramsey_policy statement in the MOD file? If yes, then disable the check on the recursivity of the declarations
|
||||||
|
*/
|
||||||
|
void checkPass(bool ramsey_policy) const;
|
||||||
//! Write the steady state file
|
//! Write the steady state file
|
||||||
void writeSteadyStateFile(const string &basename) const;
|
/*!
|
||||||
|
\param[in] ramsey_policy Is there a ramsey_policy statement in the MOD file? If yes, then use the "ys" in argument of the steady state file as initial values
|
||||||
|
*/
|
||||||
|
void writeSteadyStateFile(const string &basename, bool ramsey_policy) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue