From ce1cbb3e528eb97b92ec32d7972219ef33408f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org> Date: Fri, 20 Mar 2020 18:00:56 +0100 Subject: [PATCH] Block decomposition: turn EquationType into an enum class --- src/CodeInterpreter.hh | 10 +++++----- src/DynamicModel.cc | 16 +++++++++------- src/DynamicModel.hh | 2 +- src/ModelTree.cc | 15 ++++++++------- src/ModelTree.hh | 25 ++++++++++++++----------- src/StaticModel.cc | 22 ++++++++++++---------- src/StaticModel.hh | 4 ++-- 7 files changed, 51 insertions(+), 43 deletions(-) diff --git a/src/CodeInterpreter.hh b/src/CodeInterpreter.hh index ee4ad6a2..e8ad71ff 100644 --- a/src/CodeInterpreter.hh +++ b/src/CodeInterpreter.hh @@ -113,12 +113,12 @@ enum class BlockType simultan //!< Simultaneous time unseparable block }; -enum EquationType +enum class EquationType { - E_UNKNOWN, //!< Unknown equation type - E_EVALUATE, //!< Simple evaluation, normalized variable on left-hand side - E_EVALUATE_S, //!< Simple evaluation, normalize using the first order derivative - E_SOLVE //!< No simple evaluation of the equation, it has to be solved + unknown, //!< Unknown equation type + evaluate, //!< Simple evaluation, normalized variable on left-hand side + evaluate_s, //!< Simple evaluation, normalize using the first order derivative + solve //!< No simple evaluation of the equation, it has to be solved }; enum class BlockSimulationType diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index c60320ef..638b278e 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -587,13 +587,13 @@ DynamicModel::writeModelEquationsOrdered_M(const string &basename) const output << " % equation " << getBlockEquationID(block, i)+1 << " variable : " << sModel << " (" << variable_ID+1 << ") " << c_Equation_Type(equ_type) << endl; output << " "; - if (equ_type == E_EVALUATE) + if (equ_type == EquationType::evaluate) { output << tmp_output.str(); output << " = "; rhs->writeOutput(output, local_output_type, local_temporary_terms, {}); } - else if (equ_type == E_EVALUATE_S) + else if (equ_type == EquationType::evaluate_s) { output << "%" << tmp_output.str(); output << " = "; @@ -1343,7 +1343,7 @@ DynamicModel::writeModelEquationsCode_Block(const string &basename, const map_id FNUMEXPR_ fnumexpr(ModelEquation, getBlockEquationID(block, i)); fnumexpr.write(code_file, instruction_number); } - if (equ_type == E_EVALUATE) + if (equ_type == EquationType::evaluate) { eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i)); lhs = eq_node->arg1; @@ -1351,7 +1351,7 @@ DynamicModel::writeModelEquationsCode_Block(const string &basename, const map_id rhs->compile(code_file, instruction_number, false, temporary_terms, map_idx, true, false); lhs->compile(code_file, instruction_number, true, temporary_terms, map_idx, true, false); } - else if (equ_type == E_EVALUATE_S) + else if (equ_type == EquationType::evaluate_s) { eq_node = static_cast<BinaryOpNode *>(getBlockEquationRenormalizedExpr(block, i)); lhs = eq_node->arg1; @@ -5077,7 +5077,8 @@ DynamicModel::get_Derivatives(int block) if (OK) { - if (getBlockEquationType(block, eq) == E_EVALUATE_S && eq < block_nb_recursive) + if (getBlockEquationType(block, eq) == EquationType::evaluate_s + && eq < block_nb_recursive) //It's a normalized equation, we have to recompute the derivative using chain rule derivative function Derivatives[{ lag, eq, var, eqr, varr }] = 1; else @@ -5117,7 +5118,7 @@ DynamicModel::computeChainRuleJacobian() int block_nb_recursives = block_size - block_nb_mfs; for (int i = 0; i < block_nb_recursives; i++) { - if (getBlockEquationType(block, i) == E_EVALUATE_S) + if (getBlockEquationType(block, i) == EquationType::evaluate_s) recursive_variables[getDerivID(symbol_table.getID(SymbolType::endogenous, getBlockVariableID(block, i)), 0)] = getBlockEquationRenormalizedExpr(block, i); else recursive_variables[getDerivID(symbol_table.getID(SymbolType::endogenous, getBlockVariableID(block, i)), 0)] = getBlockEquationExpr(block, i); @@ -5133,7 +5134,8 @@ DynamicModel::computeChainRuleJacobian() first_chain_rule_derivatives[{ eqr, varr, lag }] = (equation_type_and_normalized_equation[eqr].second)->getChainRuleDerivative(getDerivID(symbol_table.getID(SymbolType::endogenous, varr), lag), recursive_variables); else if (Deriv_type == 2) { - if (getBlockEquationType(block, eq) == E_EVALUATE_S && eq < block_nb_recursives) + if (getBlockEquationType(block, eq) == EquationType::evaluate_s + && eq < block_nb_recursives) first_chain_rule_derivatives[{ eqr, varr, lag }] = (equation_type_and_normalized_equation[eqr].second)->getChainRuleDerivative(getDerivID(symbol_table.getID(SymbolType::endogenous, varr), lag), recursive_variables); else first_chain_rule_derivatives[{ eqr, varr, lag }] = equations[eqr]->getChainRuleDerivative(getDerivID(symbol_table.getID(SymbolType::endogenous, varr), lag), recursive_variables); diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh index 6033ab78..ad346853 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -619,7 +619,7 @@ public: bool isBlockEquationRenormalized(int block_number, int equation_number) const override { - return equation_type_and_normalized_equation[equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first == E_EVALUATE_S; + return equation_type_and_normalized_equation[equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first == EquationType::evaluate_s; }; //! Return the expr_t of the equation equation_number belonging to the block block_number expr_t diff --git a/src/ModelTree.cc b/src/ModelTree.cc index 43624697..ffb54ebe 100644 --- a/src/ModelTree.cc +++ b/src/ModelTree.cc @@ -742,7 +742,7 @@ ModelTree::equationTypeDetermination(const map<tuple<int, int, int>, expr_t> &fi int var = variable_reordered[i]; eq_node = equations[eq]; lhs = eq_node->arg1; - Equation_Simulation_Type = E_SOLVE; + Equation_Simulation_Type = EquationType::solve; pair<bool, expr_t> res; if (auto derivative = first_order_endo_derivatives.find({ eq, var, 0 }); derivative != first_order_endo_derivatives.end()) @@ -752,7 +752,7 @@ ModelTree::equationTypeDetermination(const map<tuple<int, int, int>, expr_t> &fi auto d_endo_variable = result.find({ var, 0 }); //Determine whether the equation could be evaluated rather than to be solved if (lhs->isVariableNodeEqualTo(SymbolType::endogenous, variable_reordered[i], 0) && derivative->second->isNumConstNodeEqualTo(1)) - Equation_Simulation_Type = E_EVALUATE; + Equation_Simulation_Type = EquationType::evaluate; else { vector<tuple<int, expr_t, expr_t>> List_of_Op_RHS; @@ -760,12 +760,12 @@ ModelTree::equationTypeDetermination(const map<tuple<int, int, int>, expr_t> &fi if (mfs == 2) { if (d_endo_variable == result.end() && res.second) - Equation_Simulation_Type = E_EVALUATE_S; + Equation_Simulation_Type = EquationType::evaluate_s; } else if (mfs == 3) { if (res.second) // The equation could be solved analytically - Equation_Simulation_Type = E_EVALUATE_S; + Equation_Simulation_Type = EquationType::evaluate_s; } } } @@ -912,7 +912,7 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob if (select_feedback_variable) { for (int i = 0; i < n; i++) - if (Equation_Type[equation_reordered[i+prologue]].first == E_SOLVE + if (Equation_Type[equation_reordered[i+prologue]].first == EquationType::solve || variable_lag_lead[variable_reordered[i+prologue]].second > 0 || variable_lag_lead[variable_reordered[i+prologue]].first > 0 || equation_lag_lead[equation_reordered[i+prologue]].second > 0 @@ -922,7 +922,7 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob } else for (int i = 0; i < n; i++) - if (Equation_Type[equation_reordered[i+prologue]].first == E_SOLVE || mfs == 0) + if (Equation_Type[equation_reordered[i+prologue]].first == EquationType::solve || mfs == 0) add_edge(vertex(i, G2), vertex(i, G2), G2); //Determines the dynamic structure of each equation @@ -1166,7 +1166,8 @@ ModelTree::reduceBlocksAndTypeDetermination(const vector<pair<int, int>> &blocks l_n_mixed = n_mixed[i]; if (Blck_Size == 1) { - if (Equation_Type[equation_reordered[eq]].first == E_EVALUATE || Equation_Type[equation_reordered[eq]].first == E_EVALUATE_S) + if (Equation_Type[equation_reordered[eq]].first == EquationType::evaluate + || Equation_Type[equation_reordered[eq]].first == EquationType::evaluate_s) { if (Simulation_Type == BlockSimulationType::solveBackwardSimple) Simulation_Type = BlockSimulationType::evaluateBackward; diff --git a/src/ModelTree.hh b/src/ModelTree.hh index cf9a1fe8..f31b1e18 100644 --- a/src/ModelTree.hh +++ b/src/ModelTree.hh @@ -437,17 +437,20 @@ public: } inline static string - c_Equation_Type(int type) + c_Equation_Type(EquationType type) { - vector<string> c_Equation_Type = + switch (type) { - "E_UNKNOWN ", - "E_EVALUATE ", - "E_EVALUATE_S", - "E_SOLVE " - }; - return c_Equation_Type[type]; - }; + case EquationType::evaluate: + return "EVALUATE "; + case EquationType::evaluate_s: + return "EVALUATE_S"; + case EquationType::solve: + return "SOLVE "; + default: + return "UNKNOWN "; + } + } inline static string BlockType0(BlockType type) @@ -465,7 +468,7 @@ public: default: return "UNKNOWN "; } - }; + } inline static string BlockSim(BlockSimulationType type) @@ -491,7 +494,7 @@ public: default: return "UNKNOWN "; } - }; + } }; #endif diff --git a/src/StaticModel.cc b/src/StaticModel.cc index 38693849..c0d7cd9e 100644 --- a/src/StaticModel.cc +++ b/src/StaticModel.cc @@ -395,13 +395,13 @@ StaticModel::writeModelEquationsOrdered_M(const string &basename) const output << " % equation " << getBlockEquationID(block, i)+1 << " variable : " << sModel << " (" << variable_ID+1 << ") " << c_Equation_Type(equ_type) << endl; output << " "; - if (equ_type == E_EVALUATE) + if (equ_type == EquationType::evaluate) { output << tmp_output.str(); output << " = "; rhs->writeOutput(output, local_output_type, local_temporary_terms, {}); } - else if (equ_type == E_EVALUATE_S) + else if (equ_type == EquationType::evaluate_s) { output << "%" << tmp_output.str(); output << " = "; @@ -755,7 +755,7 @@ StaticModel::writeModelEquationsCode_Block(const string &basename, map_idx_t map FNUMEXPR_ fnumexpr(ModelEquation, getBlockEquationID(block, i)); fnumexpr.write(code_file, instruction_number); } - if (equ_type == E_EVALUATE) + if (equ_type == EquationType::evaluate) { eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i)); lhs = eq_node->arg1; @@ -763,7 +763,7 @@ StaticModel::writeModelEquationsCode_Block(const string &basename, map_idx_t map rhs->compile(code_file, instruction_number, false, temporary_terms, map_idx, false, false); lhs->compile(code_file, instruction_number, true, temporary_terms, map_idx, false, false); } - else if (equ_type == E_EVALUATE_S) + else if (equ_type == EquationType::evaluate_s) { eq_node = static_cast<BinaryOpNode *>(getBlockEquationRenormalizedExpr(block, i)); lhs = eq_node->arg1; @@ -947,7 +947,7 @@ StaticModel::writeModelEquationsCode_Block(const string &basename, map_idx_t map FNUMEXPR_ fnumexpr(ModelEquation, getBlockEquationID(block, i)); fnumexpr.write(code_file, instruction_number); } - if (equ_type == E_EVALUATE) + if (equ_type == EquationType::evaluate) { eq_node = static_cast<BinaryOpNode *>(getBlockEquationExpr(block, i)); lhs = eq_node->arg1; @@ -955,7 +955,7 @@ StaticModel::writeModelEquationsCode_Block(const string &basename, map_idx_t map rhs->compile(code_file, instruction_number, false, tt2, map_idx2[block], false, false); lhs->compile(code_file, instruction_number, true, tt2, map_idx2[block], false, false); } - else if (equ_type == E_EVALUATE_S) + else if (equ_type == EquationType::evaluate_s) { eq_node = static_cast<BinaryOpNode *>(getBlockEquationRenormalizedExpr(block, i)); lhs = eq_node->arg1; @@ -2155,7 +2155,8 @@ StaticModel::get_Derivatives(int block) if (OK) { - if (getBlockEquationType(block, eq) == E_EVALUATE_S && eq < block_nb_recursive) + if (getBlockEquationType(block, eq) == EquationType::evaluate_s + && eq < block_nb_recursive) //It's a normalized equation, we have to recompute the derivative using chain rule derivative function Derivatives[{ lag, eq, var, eqr, varr }] = 1; else @@ -2199,7 +2200,7 @@ StaticModel::computeChainRuleJacobian() { for (int i = 0; i < block_nb_recursives; i++) { - if (getBlockEquationType(block, i) == E_EVALUATE_S) + if (getBlockEquationType(block, i) == EquationType::evaluate_s) recursive_variables[getDerivID(symbol_table.getID(SymbolType::endogenous, getBlockVariableID(block, i)), 0)] = getBlockEquationRenormalizedExpr(block, i); else recursive_variables[getDerivID(symbol_table.getID(SymbolType::endogenous, getBlockVariableID(block, i)), 0)] = getBlockEquationExpr(block, i); @@ -2215,7 +2216,8 @@ StaticModel::computeChainRuleJacobian() first_chain_rule_derivatives[{ eqr, varr, lag }] = (equation_type_and_normalized_equation[eqr].second)->getChainRuleDerivative(getDerivID(symbol_table.getID(SymbolType::endogenous, varr), lag), recursive_variables); else if (Deriv_type == 2) { - if (getBlockEquationType(block, eq) == E_EVALUATE_S && eq < block_nb_recursives) + if (getBlockEquationType(block, eq) == EquationType::evaluate_s + && eq < block_nb_recursives) first_chain_rule_derivatives[{ eqr, varr, lag }] = (equation_type_and_normalized_equation[eqr].second)->getChainRuleDerivative(getDerivID(symbol_table.getID(SymbolType::endogenous, varr), lag), recursive_variables); else first_chain_rule_derivatives[{ eqr, varr, lag }] = equations[eqr]->getChainRuleDerivative(getDerivID(symbol_table.getID(SymbolType::endogenous, varr), lag), recursive_variables); @@ -2227,7 +2229,7 @@ StaticModel::computeChainRuleJacobian() { for (int i = 0; i < block_nb_recursives; i++) { - if (getBlockEquationType(block, i) == E_EVALUATE_S) + if (getBlockEquationType(block, i) == EquationType::evaluate_s) recursive_variables[getDerivID(symbol_table.getID(SymbolType::endogenous, getBlockVariableID(block, i)), 0)] = getBlockEquationRenormalizedExpr(block, i); else recursive_variables[getDerivID(symbol_table.getID(SymbolType::endogenous, getBlockVariableID(block, i)), 0)] = getBlockEquationExpr(block, i); diff --git a/src/StaticModel.hh b/src/StaticModel.hh index ed3c6227..3c85d9a7 100644 --- a/src/StaticModel.hh +++ b/src/StaticModel.hh @@ -1,5 +1,5 @@ /* - * Copyright © 2003-2019 Dynare Team + * Copyright © 2003-2020 Dynare Team * * This file is part of Dynare. * @@ -256,7 +256,7 @@ public: bool isBlockEquationRenormalized(int block_number, int equation_number) const override { - return (equation_type_and_normalized_equation[equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first == E_EVALUATE_S); + return (equation_type_and_normalized_equation[equation_reordered[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first == EquationType::evaluate_s); }; //! Return the expr_t of the equation equation_number belonging to the block block_number expr_t -- GitLab