diff --git a/ComputingTasks.cc b/ComputingTasks.cc index 2c48c5a4..74b541f5 100644 --- a/ComputingTasks.cc +++ b/ComputingTasks.cc @@ -202,6 +202,10 @@ RamseyModelStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsol void RamseyModelStatement::writeOutput(ostream &output, const string &basename) const { + // options_.ramsey_policy indicates that a Ramsey model is present in the *.mod file + // this affects the computation of the steady state that uses a special algorithm + // It should probably rather be a M_ field, but we leave it in options_ for historical reason + output << "options_.ramsey_policy = 1;\n"; } RamseyPolicyStatement::RamseyPolicyStatement(const SymbolList &symbol_list_arg, @@ -214,6 +218,10 @@ RamseyPolicyStatement::RamseyPolicyStatement(const SymbolList &symbol_list_arg, void RamseyPolicyStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) { + // ramsey_model_present indicates that the model is augmented with the FOC of the planner problem + mod_file_struct.ramsey_model_present = true; + // ramsey_policy_present indicates that ramsey_policy instruction for computation of first order approximation + // of a stochastic Ramsey problem if present in the *.mod file mod_file_struct.ramsey_policy_present = true; /* Fill in option_order of mod_file_struct diff --git a/ModFile.cc b/ModFile.cc index ff352c62..98ee8d7d 100644 --- a/ModFile.cc +++ b/ModFile.cc @@ -39,7 +39,7 @@ ModFile::ModFile(WarningConsolidation &warnings_arg) steady_state_model(symbol_table, num_constants, external_functions_table, static_model), linear(false), block(false), byte_code(false), use_dll(false), no_static(false), differentiate_forward_vars(false), - nonstationary_variables(false), ramsey_policy_orig_eqn_nbr(0), + nonstationary_variables(false), ramsey_model_orig_eqn_nbr(0), warnings(warnings_arg) { } @@ -113,7 +113,7 @@ ModFile::checkPass() (*it)->checkPass(mod_file_struct, warnings); // Check the steady state block - steady_state_model.checkPass(mod_file_struct.ramsey_policy_present, warnings); + steady_state_model.checkPass(mod_file_struct.ramsey_model_present, warnings); // If order option has not been set, default to 2 if (!mod_file_struct.order_option) @@ -136,12 +136,12 @@ ModFile::checkPass() exit(EXIT_FAILURE); } - if (((mod_file_struct.ramsey_policy_present || mod_file_struct.discretionary_policy_present) + if (((mod_file_struct.ramsey_model_present || mod_file_struct.discretionary_policy_present) && !mod_file_struct.planner_objective_present) - || (!(mod_file_struct.ramsey_policy_present || mod_file_struct.discretionary_policy_present) + || (!(mod_file_struct.ramsey_model_present || mod_file_struct.discretionary_policy_present) && mod_file_struct.planner_objective_present)) { - cerr << "ERROR: A planner_objective statement must be used with a ramsey_policy or a discretionary_policy statement and vice versa." << endl; + cerr << "ERROR: A planner_objective statement must be used with a ramsey_model, a ramsey_policy or a discretionary_policy statement and vice versa." << endl; exit(EXIT_FAILURE); } @@ -246,9 +246,9 @@ ModFile::checkPass() } if (dynamic_model.staticOnlyEquationsNbr() > 0 && - (mod_file_struct.ramsey_policy_present || mod_file_struct.discretionary_policy_present)) + (mod_file_struct.ramsey_model_present || mod_file_struct.discretionary_policy_present)) { - cerr << "ERROR: marking equations as [static] or [dynamic] is not possible with ramsey_policy or discretionary_policy" << endl; + cerr << "ERROR: marking equations as [static] or [dynamic] is not possible with ramsey_model, ramsey_policy or discretionary_policy" << endl; exit(EXIT_FAILURE); } @@ -330,7 +330,7 @@ ModFile::transformPass(bool nostrict) dynamic_model.removeTrendVariableFromEquations(); } - if (mod_file_struct.ramsey_policy_present) + if (mod_file_struct.ramsey_model_present) { StaticModel *planner_objective = NULL; for (vector::iterator it = statements.begin(); it != statements.end(); it++) @@ -340,7 +340,7 @@ ModFile::transformPass(bool nostrict) planner_objective = pos->getPlannerObjective(); } assert(planner_objective != NULL); - ramsey_policy_orig_eqn_nbr = dynamic_model.equation_number(); + ramsey_model_orig_eqn_nbr = dynamic_model.equation_number(); /* clone the model then clone the new equations back to the original because @@ -395,11 +395,11 @@ ModFile::transformPass(bool nostrict) /* Enforce the same number of equations and endogenous, except in three cases: - - ramsey_policy is used + - ramsey_model, ramsey_policy or discretionary_policy is used - a BVAR command is used and there is no equation (standalone BVAR estimation) - nostrict option is passed and there are more endogs than equations (dealt with before freeze) */ - if (!(mod_file_struct.ramsey_policy_present || mod_file_struct.discretionary_policy_present) + if (!(mod_file_struct.ramsey_model_present || mod_file_struct.discretionary_policy_present) && !(mod_file_struct.bvar_present && dynamic_model.equation_number() == 0) && (dynamic_model.equation_number() != symbol_table.endo_nbr())) { @@ -419,11 +419,11 @@ ModFile::transformPass(bool nostrict) exit(EXIT_FAILURE); } - if (!mod_file_struct.ramsey_policy_present) + if (!mod_file_struct.ramsey_model_present) cout << "Found " << dynamic_model.equation_number() << " equation(s)." << endl; else { - cout << "Found " << ramsey_policy_orig_eqn_nbr << " equation(s)." << endl; + cout << "Found " << ramsey_model_orig_eqn_nbr << " equation(s)." << endl; cout << "Found " << dynamic_model.equation_number() << " FOC equation(s) for Ramsey Problem." << endl; } @@ -461,7 +461,7 @@ ModFile::computingPass(bool no_tmp_terms, FileOutputType output) { if (mod_file_struct.stoch_simul_present || mod_file_struct.estimation_present || mod_file_struct.osr_present - || mod_file_struct.ramsey_policy_present || mod_file_struct.identification_present + || mod_file_struct.ramsey_model_present || mod_file_struct.identification_present || mod_file_struct.calib_smoother_present) static_model.set_cutoff_to_zero(); @@ -476,7 +476,7 @@ ModFile::computingPass(bool no_tmp_terms, FileOutputType output) if (mod_file_struct.simul_present || mod_file_struct.check_present || mod_file_struct.stoch_simul_present || mod_file_struct.estimation_present || mod_file_struct.osr_present - || mod_file_struct.ramsey_policy_present || mod_file_struct.identification_present + || mod_file_struct.ramsey_model_present || mod_file_struct.identification_present || mod_file_struct.calib_smoother_present) { if (mod_file_struct.simul_present) @@ -485,7 +485,7 @@ ModFile::computingPass(bool no_tmp_terms, FileOutputType output) { if (mod_file_struct.stoch_simul_present || mod_file_struct.estimation_present || mod_file_struct.osr_present - || mod_file_struct.ramsey_policy_present || mod_file_struct.identification_present + || mod_file_struct.ramsey_model_present || mod_file_struct.identification_present || mod_file_struct.calib_smoother_present) dynamic_model.set_cutoff_to_zero(); if (mod_file_struct.order_option < 1 || mod_file_struct.order_option > 3) @@ -714,8 +714,8 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool no_log, b if (block && !byte_code) mOutputFile << "addpath " << basename << ";" << endl; - if (mod_file_struct.ramsey_policy_present) - mOutputFile << "M_.orig_eq_nbr = " << ramsey_policy_orig_eqn_nbr << ";" << endl; + if (mod_file_struct.ramsey_model_present) + mOutputFile << "M_.orig_eq_nbr = " << ramsey_model_orig_eqn_nbr << ";" << endl; if (dynamic_model.equation_number() > 0) { @@ -799,7 +799,7 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool no_log, b } // Create steady state file - steady_state_model.writeSteadyStateFile(basename, mod_file_struct.ramsey_policy_present); + steady_state_model.writeSteadyStateFile(basename, mod_file_struct.ramsey_model_present); cout << "done" << endl; } @@ -884,7 +884,7 @@ void ModFile::writeExternalFiles(const string &basename, FileOutputType output, bool cuda) const { writeModelCC(basename, cuda); - steady_state_model.writeSteadyStateFileCC(basename, mod_file_struct.ramsey_policy_present, cuda); + steady_state_model.writeSteadyStateFileCC(basename, mod_file_struct.ramsey_model_present, cuda); dynamic_model.writeDynamicFile(basename, block, byte_code, use_dll, mod_file_struct.order_option); diff --git a/ModFile.hh b/ModFile.hh index 387fda17..aca8ef9d 100644 --- a/ModFile.hh +++ b/ModFile.hh @@ -93,7 +93,7 @@ public: eval_context_t global_eval_context; //! Stores the original number of equations in the model_block - int ramsey_policy_orig_eqn_nbr; + int ramsey_model_orig_eqn_nbr; //! Stores the list of extra files to be transefered during a parallel run /*! (i.e. option parallel_local_files of model block) */ diff --git a/Statement.cc b/Statement.cc index 3ce955d6..4331c4dc 100644 --- a/Statement.cc +++ b/Statement.cc @@ -29,6 +29,7 @@ ModFileStructure::ModFileStructure() : osr_present(false), osr_params_present(false), optim_weights_present(false), + ramsey_model_present(false), ramsey_policy_present(false), discretionary_policy_present(false), planner_objective_present(false), diff --git a/Statement.hh b/Statement.hh index 6abda8fc..9f4a3c04 100644 --- a/Statement.hh +++ b/Statement.hh @@ -48,6 +48,8 @@ public: bool osr_params_present; //! Whether an optim weight statement is present bool optim_weights_present; + //! Whether a ramsey_model statement is present + bool ramsey_model_present; //! Whether a ramsey_policy statement is present bool ramsey_policy_present; //! Whether a discretionary_objective statement is present diff --git a/SteadyStateModel.cc b/SteadyStateModel.cc index 6f33c7df..f1069642 100644 --- a/SteadyStateModel.cc +++ b/SteadyStateModel.cc @@ -56,7 +56,7 @@ SteadyStateModel::addMultipleDefinitions(const vector &symb_ids, expr_t exp } void -SteadyStateModel::checkPass(bool ramsey_policy, WarningConsolidation &warnings) const +SteadyStateModel::checkPass(bool ramsey_model, WarningConsolidation &warnings) const { if (def_table.size() == 0) return; @@ -74,7 +74,7 @@ SteadyStateModel::checkPass(bool ramsey_policy, WarningConsolidation &warnings) warnings << "WARNING: in the 'steady_state_model' block, variable '" << symbol_table.getName(symb_ids[j]) << "' is declared twice" << endl; // Check that expression has no undefined symbol - if (!ramsey_policy) + if (!ramsey_model) { set used_symbols; const expr_t &expr = def_table[i].second; @@ -105,7 +105,7 @@ SteadyStateModel::checkPass(bool ramsey_policy, WarningConsolidation &warnings) } void -SteadyStateModel::writeSteadyStateFile(const string &basename, bool ramsey_policy) const +SteadyStateModel::writeSteadyStateFile(const string &basename, bool ramsey_model) const { if (def_table.size() == 0) return; @@ -153,7 +153,7 @@ SteadyStateModel::writeSteadyStateFile(const string &basename, bool ramsey_polic } void -SteadyStateModel::writeSteadyStateFileCC(const string &basename, bool ramsey_policy, bool cuda) const +SteadyStateModel::writeSteadyStateFileCC(const string &basename, bool ramsey_model, bool cuda) const { string filename = basename + "_steadystate.cc"; diff --git a/SteadyStateModel.hh b/SteadyStateModel.hh index b5686157..817f84f5 100644 --- a/SteadyStateModel.hh +++ b/SteadyStateModel.hh @@ -41,15 +41,15 @@ public: void addMultipleDefinitions(const vector &symb_ids, expr_t 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 + \param[in] ramsey_model Is there a Ramsey model in the MOD file? If yes, then disable the check on the recursivity of the declarations */ - void checkPass(bool ramsey_policy, WarningConsolidation &warnings) const; + void checkPass(bool ramsey_model, WarningConsolidation &warnings) const; //! Write the steady state file /*! - \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 + \param[in] ramsey_model Is there a Ramsey model 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; - void writeSteadyStateFileCC(const string &basename, bool ramsey_policy, bool cuda) const; + void writeSteadyStateFile(const string &basename, bool ramsey_model) const; + void writeSteadyStateFileCC(const string &basename, bool ramsey_model, bool cuda) const; }; #endif