preprocessor: fix bug that caused all models declared linear to fail under ramsey. closes #419
parent
392829ef40
commit
7ec3dcc6e2
|
@ -36,6 +36,7 @@ ModFile::ModFile(WarningConsolidation &warnings_arg)
|
||||||
dynamic_model(symbol_table, num_constants, external_functions_table),
|
dynamic_model(symbol_table, num_constants, external_functions_table),
|
||||||
trend_dynamic_model(symbol_table, num_constants, external_functions_table),
|
trend_dynamic_model(symbol_table, num_constants, external_functions_table),
|
||||||
ramsey_FOC_equations_dynamic_model(symbol_table, num_constants, external_functions_table),
|
ramsey_FOC_equations_dynamic_model(symbol_table, num_constants, external_functions_table),
|
||||||
|
orig_ramsey_dynamic_model(symbol_table, num_constants, external_functions_table),
|
||||||
static_model(symbol_table, num_constants, external_functions_table),
|
static_model(symbol_table, num_constants, external_functions_table),
|
||||||
steady_state_model(symbol_table, num_constants, external_functions_table, static_model),
|
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),
|
linear(false), block(false), byte_code(false), use_dll(false), no_static(false),
|
||||||
|
@ -360,6 +361,8 @@ ModFile::transformPass(bool nostrict)
|
||||||
clone the model then clone the new equations back to the original because
|
clone the model then clone the new equations back to the original because
|
||||||
we have to call computeDerivIDs (in computeRamseyPolicyFOCs and computingPass)
|
we have to call computeDerivIDs (in computeRamseyPolicyFOCs and computingPass)
|
||||||
*/
|
*/
|
||||||
|
if (linear)
|
||||||
|
dynamic_model.cloneDynamic(orig_ramsey_dynamic_model);
|
||||||
dynamic_model.cloneDynamic(ramsey_FOC_equations_dynamic_model);
|
dynamic_model.cloneDynamic(ramsey_FOC_equations_dynamic_model);
|
||||||
ramsey_FOC_equations_dynamic_model.computeRamseyPolicyFOCs(*planner_objective);
|
ramsey_FOC_equations_dynamic_model.computeRamseyPolicyFOCs(*planner_objective);
|
||||||
ramsey_FOC_equations_dynamic_model.replaceMyEquations(dynamic_model);
|
ramsey_FOC_equations_dynamic_model.replaceMyEquations(dynamic_model);
|
||||||
|
@ -529,15 +532,22 @@ ModFile::computingPass(bool no_tmp_terms, FileOutputType output, bool compute_xr
|
||||||
if (mod_file_struct.identification_present || mod_file_struct.estimation_analytic_derivation)
|
if (mod_file_struct.identification_present || mod_file_struct.estimation_analytic_derivation)
|
||||||
paramsDerivsOrder = params_derivs_order;
|
paramsDerivsOrder = params_derivs_order;
|
||||||
dynamic_model.computingPass(true, hessian, thirdDerivatives, paramsDerivsOrder, global_eval_context, no_tmp_terms, block, use_dll, byte_code, compute_xrefs);
|
dynamic_model.computingPass(true, hessian, thirdDerivatives, paramsDerivsOrder, global_eval_context, no_tmp_terms, block, use_dll, byte_code, compute_xrefs);
|
||||||
|
if (linear && mod_file_struct.ramsey_model_present)
|
||||||
|
orig_ramsey_dynamic_model.computingPass(true, true, false, paramsDerivsOrder, global_eval_context, no_tmp_terms, block, use_dll, byte_code, compute_xrefs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // No computing task requested, compute derivatives up to 2nd order by default
|
else // No computing task requested, compute derivatives up to 2nd order by default
|
||||||
dynamic_model.computingPass(true, true, false, none, global_eval_context, no_tmp_terms, block, use_dll, byte_code, compute_xrefs);
|
dynamic_model.computingPass(true, true, false, none, global_eval_context, no_tmp_terms, block, use_dll, byte_code, compute_xrefs);
|
||||||
|
|
||||||
if (linear && !dynamic_model.checkHessianZero())
|
if ((linear && !mod_file_struct.ramsey_model_present && !dynamic_model.checkHessianZero()) ||
|
||||||
|
(linear && mod_file_struct.ramsey_model_present && !orig_ramsey_dynamic_model.checkHessianZero()))
|
||||||
{
|
{
|
||||||
map<int, string> eqs;
|
map<int, string> eqs;
|
||||||
dynamic_model.getNonZeroHessianEquations(eqs);
|
if (mod_file_struct.ramsey_model_present)
|
||||||
|
orig_ramsey_dynamic_model.getNonZeroHessianEquations(eqs);
|
||||||
|
else
|
||||||
|
dynamic_model.getNonZeroHessianEquations(eqs);
|
||||||
|
|
||||||
cerr << "ERROR: If the model is declared linear the second derivatives must be equal to zero." << endl
|
cerr << "ERROR: If the model is declared linear the second derivatives must be equal to zero." << endl
|
||||||
<< " The following equations had non-zero second derivatives:" << endl;
|
<< " The following equations had non-zero second derivatives:" << endl;
|
||||||
for (map<int, string >::const_iterator it = eqs.begin(); it != eqs.end(); it++)
|
for (map<int, string >::const_iterator it = eqs.begin(); it != eqs.end(); it++)
|
||||||
|
|
|
@ -66,6 +66,8 @@ public:
|
||||||
DynamicModel trend_dynamic_model;
|
DynamicModel trend_dynamic_model;
|
||||||
//! A model in which to create the FOC for the ramsey problem
|
//! A model in which to create the FOC for the ramsey problem
|
||||||
DynamicModel ramsey_FOC_equations_dynamic_model;
|
DynamicModel ramsey_FOC_equations_dynamic_model;
|
||||||
|
//! A copy of the original model, used to test model linearity under ramsey problem
|
||||||
|
DynamicModel orig_ramsey_dynamic_model;
|
||||||
//! Static model, as derived from the "model" block when leads and lags have been removed
|
//! Static model, as derived from the "model" block when leads and lags have been removed
|
||||||
StaticModel static_model;
|
StaticModel static_model;
|
||||||
//! Static model, as declared in the "steady_state_model" block if present
|
//! Static model, as declared in the "steady_state_model" block if present
|
||||||
|
|
Loading…
Reference in New Issue