From f1d1c1e1c1512466ab2bbdfbb651ed8c14250970 Mon Sep 17 00:00:00 2001 From: Houtan Bastani <houtan@dynare.org> Date: Fri, 15 Mar 2019 12:27:32 +0100 Subject: [PATCH] trend_component_model: simplify AR --- src/DynamicModel.cc | 28 ++++------- src/DynamicModel.hh | 5 +- src/ExprNode.cc | 110 -------------------------------------------- src/ExprNode.hh | 15 +----- 4 files changed, 11 insertions(+), 147 deletions(-) diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index 219a4ae1..b336ca5f 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -4043,7 +4043,7 @@ DynamicModel::fillVarModelTable() const var_model_table.setLhsExprT(lhs_expr_tr); // Fill AR Matrix - var_model_table.setAR(fillAutoregressiveMatrixForVAR()); + var_model_table.setAR(fillAutoregressiveMatrix(true)); } void @@ -4114,37 +4114,27 @@ DynamicModel::fillVarModelTableFromOrigModel(StaticModel &static_model) const } map<string, map<tuple<int, int, int>, expr_t>> -DynamicModel::fillAutoregressiveMatrixForVAR() const +DynamicModel::fillAutoregressiveMatrix(bool is_var) const { map<string, map<tuple<int, int, int>, expr_t>> ARr; - for (const auto & it : var_model_table.getEqNums()) + auto eqnums = is_var ? + var_model_table.getEqNums() : trend_component_model_table.getNonTargetEqNums(); + for (const auto & it : eqnums) { int i = 0; map<tuple<int, int, int>, expr_t> AR; + vector<int> lhs = is_var ? + var_model_table.getLhsOrigIds(it.first) : trend_component_model_table.getNonTargetLhs(it.first); for (auto eqn : it.second) { auto *bopn = dynamic_cast<BinaryOpNode *>(equations[eqn]->arg2); - bopn->fillAutoregressiveRowForVAR(i++, var_model_table.getLhsOrigIds(it.first), AR); + bopn->fillAutoregressiveRow(i++, lhs, AR); } ARr[it.first] = AR; } return ARr; } -void -DynamicModel::fillAutoregressiveMatrix(map<string, map<tuple<int, int, int>, expr_t>> &ARr) const -{ - for (const auto & it : trend_component_model_table.getNonTargetEqNums()) - { - int i = 0; - map<tuple<int, int, int>, expr_t> AR; - vector<int> lhs = trend_component_model_table.getNonTargetLhs(it.first); - for (auto eqn : it.second) - equations[eqn]->arg2->fillAutoregressiveRow(i++, lhs, AR); - ARr[it.first] = AR; - } -} - void DynamicModel::fillTrendComponentModelTable() const { @@ -4348,7 +4338,7 @@ void DynamicModel::fillTrendComponentmodelTableAREC(ExprNode::subst_table_t &diff_subst_table) const { map<string, map<tuple<int, int, int>, expr_t>> ARr, A0r, A0starr; - fillAutoregressiveMatrix(ARr); + ARr = fillAutoregressiveMatrix(false); trend_component_model_table.setAR(ARr); fillErrorComponentMatrix(A0r, A0starr, diff_subst_table); trend_component_model_table.setA0(A0r, A0starr); diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh index ea45eb57..79fd8fa9 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -316,11 +316,8 @@ public: //! Set the equations that have non-zero second derivatives void setNonZeroHessianEquations(map<int, string> &eqs); - //! Fill Autoregressive Matrix for trend_component_model - void fillAutoregressiveMatrix(map<string, map<tuple<int, int, int>, expr_t>> &ARr) const; - //! Fill Autoregressive Matrix for var_model - map<string, map<tuple<int, int, int>, expr_t>> fillAutoregressiveMatrixForVAR() const; + map<string, map<tuple<int, int, int>, expr_t>> fillAutoregressiveMatrix(bool is_var) const; //! Fill Error Component Matrix for trend_component_model void fillErrorComponentMatrix(map<string, map<tuple<int, int, int>, expr_t>> &A0r, map<string, map<tuple<int, int, int>, expr_t>> &A0starr, ExprNode::subst_table_t &diff_subst_table) const; diff --git a/src/ExprNode.cc b/src/ExprNode.cc index 29306cac..73f68761 100644 --- a/src/ExprNode.cc +++ b/src/ExprNode.cc @@ -686,11 +686,6 @@ NumConstNode::substituteStaticAuxiliaryVariable() const return const_cast<NumConstNode *>(this); } -void -NumConstNode::fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const -{ -} - void NumConstNode::fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const { @@ -1979,11 +1974,6 @@ VariableNode::getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const model_endos_and_lags[varname] = lag; } -void -VariableNode::fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const -{ -} - void VariableNode::fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const { @@ -3794,12 +3784,6 @@ UnaryOpNode::substituteStaticAuxiliaryVariable() const return buildSimilarUnaryOpNode(argsubst, datatree); } -void -UnaryOpNode::fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const -{ - arg->fillAutoregressiveRow(eqn, lhs, AR); -} - void UnaryOpNode::fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const { @@ -5853,73 +5837,8 @@ BinaryOpNode::getPacOptimizingShareAndExprNodes(int lhs_symb_id, int lhs_orig_sy return {optim_share, optim_part, non_optim_part, additive_part}; } -void -BinaryOpNode::fillAutoregressiveRowHelper(expr_t arg1, expr_t arg2, - int eqn, - const vector<int> &lhs, - map<tuple<int, int, int>, expr_t> &AR) const -{ - if (op_code != BinaryOpcode::times) - return; - - set<pair<int, int>> endogs, tmp; - arg1->collectDynamicVariables(SymbolType::endogenous, tmp); - arg1->collectDynamicVariables(SymbolType::exogenous, tmp); - if (tmp.size() != 0) - return; - - arg1->collectDynamicVariables(SymbolType::parameter, tmp); - if (tmp.size() != 1) - return; - - auto *vn = dynamic_cast<VariableNode *>(arg2); - if (vn == nullptr) - return; - - arg2->collectDynamicVariables(SymbolType::exogenous, endogs); - if (endogs.size() != 0) - { - cerr << "BinaryOpNode::fillAutoregressiveRowHelper: do not currently support param*exog;" << endl; - exit(EXIT_FAILURE); - } - - arg2->collectDynamicVariables(SymbolType::endogenous, endogs); - if (endogs.size() != 1) - return; - - int lhs_symb_id = endogs.begin()->first; - int lag = endogs.begin()->second; - if (datatree.symbol_table.isAuxiliaryVariable(lhs_symb_id)) - { - int orig_lhs_symb_id = datatree.symbol_table.getOrigSymbIdForDiffAuxVar(lhs_symb_id); - if (find(lhs.begin(), lhs.end(), orig_lhs_symb_id) == lhs.end()) - return; - lag = -1 * datatree.symbol_table.getOrigLeadLagForDiffAuxVar(lhs_symb_id); - lhs_symb_id = orig_lhs_symb_id; - } - else - if (find(lhs.begin(), lhs.end(), lhs_symb_id) == lhs.end()) - return; - - if (AR.find({eqn, -lag, lhs_symb_id}) != AR.end()) - { - cerr << "BinaryOpNode::fillAutoregressiveRowHelper: Error filling AR matrix: lag/symb_id encountered more than once in equtaion" << endl; - exit(EXIT_FAILURE); - } - AR[{eqn, -lag, lhs_symb_id}] = arg1; -} - void BinaryOpNode::fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const -{ - fillAutoregressiveRowHelper(arg1, arg2, eqn, lhs, AR); - fillAutoregressiveRowHelper(arg2, arg1, eqn, lhs, AR); - arg1->fillAutoregressiveRow(eqn, lhs, AR); - arg2->fillAutoregressiveRow(eqn, lhs, AR); -} - -void -BinaryOpNode::fillAutoregressiveRowForVAR(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const { vector<pair<expr_t, int>> terms; decomposeAdditiveTerms(terms, 1); @@ -7100,14 +7019,6 @@ TrinaryOpNode::substituteStaticAuxiliaryVariable() const return buildSimilarTrinaryOpNode(arg1subst, arg2subst, arg3subst, datatree); } -void -TrinaryOpNode::fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const -{ - arg1->fillAutoregressiveRow(eqn, lhs, AR); - arg2->fillAutoregressiveRow(eqn, lhs, AR); - arg3->fillAutoregressiveRow(eqn, lhs, AR); -} - void TrinaryOpNode::fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const { @@ -7736,13 +7647,6 @@ AbstractExternalFunctionNode::substituteStaticAuxiliaryVariable() const return buildSimilarExternalFunctionNode(arguments_subst, datatree); } -void -AbstractExternalFunctionNode::fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const -{ - cerr << "External functions not supported in VARs or Trend Component Models" << endl; - exit(EXIT_FAILURE); -} - void AbstractExternalFunctionNode::fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const { @@ -9254,13 +9158,6 @@ VarExpectationNode::substituteStaticAuxiliaryVariable() const return const_cast<VarExpectationNode *>(this); } -void -VarExpectationNode::fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const -{ - cerr << "Var Expectation not supported in VARs or Trend Component Models" << endl; - exit(EXIT_FAILURE); -} - void VarExpectationNode::fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const { @@ -9670,13 +9567,6 @@ PacExpectationNode::substituteStaticAuxiliaryVariable() const return const_cast<PacExpectationNode *>(this); } -void -PacExpectationNode::fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const -{ - cerr << "Pac Expectation not supported in VARs" << endl; - exit(EXIT_FAILURE); -} - void PacExpectationNode::fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const { diff --git a/src/ExprNode.hh b/src/ExprNode.hh index 2d55f0e7..083f2f5a 100644 --- a/src/ExprNode.hh +++ b/src/ExprNode.hh @@ -593,9 +593,6 @@ class ExprNode //! param * (endog op endog op ...) + param * (endog op endog op ...) + ... virtual bool isParamTimesEndogExpr() const = 0; - //! Fills the AR matrix structure - virtual void fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const = 0; - //! Fills the EC matrix structure virtual void fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, @@ -718,7 +715,6 @@ public: expr_t clone(DataTree &datatree) const override; expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const override; bool isInStaticForm() const override; - void fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const override; void fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const override; void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; @@ -803,7 +799,6 @@ public: expr_t clone(DataTree &datatree) const override; expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const override; bool isInStaticForm() const override; - void fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const override; void fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const override; void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; @@ -916,7 +911,6 @@ public: expr_t clone(DataTree &datatree) const override; expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const override; bool isInStaticForm() const override; - void fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const override; void fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const override; void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; @@ -1038,10 +1032,7 @@ public: //! Returns the non-zero hand-side of an equation (that must have a hand side equal to zero) expr_t getNonZeroPartofEquation() const; bool isInStaticForm() const override; - void fillAutoregressiveRowHelper(expr_t arg1, expr_t arg2, - int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const; - void fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const override; - void fillAutoregressiveRowForVAR(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const; + void fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const; void fillErrorCorrectionRowHelper(expr_t arg1, expr_t arg2, int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const; @@ -1167,7 +1158,6 @@ public: expr_t clone(DataTree &datatree) const override; expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const override; bool isInStaticForm() const override; - void fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const override; void fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const override; void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; @@ -1289,7 +1279,6 @@ public: expr_t clone(DataTree &datatree) const override = 0; expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const override; bool isInStaticForm() const override; - void fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const override; void fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const override; void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; @@ -1499,7 +1488,6 @@ public: expr_t detrend(int symb_id, bool log_trend, expr_t trend) const override; expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const override; bool isInStaticForm() const override; - void fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const override; void fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const override; void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; @@ -1582,7 +1570,6 @@ public: expr_t detrend(int symb_id, bool log_trend, expr_t trend) const override; expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const override; bool isInStaticForm() const override; - void fillAutoregressiveRow(int eqn, const vector<int> &lhs, map<tuple<int, int, int>, expr_t> &AR) const override; void fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, const vector<int> &trend_lhs, map<tuple<int, int, int>, expr_t> &A0, map<tuple<int, int, int>, expr_t> &A0star) const override; void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; -- GitLab