From e88c05e3b8310a47e928bbf14aaee57f6111b445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Thu, 2 Apr 2020 19:10:59 +0200 Subject: [PATCH] Change prototype of DataTree::AddEqual() This permits some simplifications. --- src/DataTree.cc | 8 +++++--- src/DataTree.hh | 4 ++-- src/DynamicModel.cc | 10 +++++----- src/ExprNode.cc | 34 +++++++++++++++++----------------- 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/DataTree.cc b/src/DataTree.cc index e2f6ed1e..cb1931b8 100644 --- a/src/DataTree.cc +++ b/src/DataTree.cc @@ -1,5 +1,5 @@ /* - * Copyright © 2003-2019 Dynare Team + * Copyright © 2003-2020 Dynare Team * * This file is part of Dynare. * @@ -687,10 +687,12 @@ DataTree::AddPacExpectation(const string &model_name) return p; } -expr_t +BinaryOpNode * DataTree::AddEqual(expr_t iArg1, expr_t iArg2) { - return AddBinaryOp(iArg1, BinaryOpcode::equal, iArg2); + /* We know that we can safely cast to BinaryOpNode because + BinaryOpCode::equal can never be reduced to a constant. */ + return dynamic_cast(AddBinaryOp(iArg1, BinaryOpcode::equal, iArg2)); } void diff --git a/src/DataTree.hh b/src/DataTree.hh index a99be8ab..d0dde846 100644 --- a/src/DataTree.hh +++ b/src/DataTree.hh @@ -1,5 +1,5 @@ /* - * Copyright © 2003-2019 Dynare Team + * Copyright © 2003-2020 Dynare Team * * This file is part of Dynare. * @@ -244,7 +244,7 @@ public: //! Add 2nd derivative of steady state w.r.t. parameter to model tree expr_t AddSteadyStateParam2ndDeriv(expr_t iArg1, int param1_symb_id, int param2_symb_id); //! Adds "arg1=arg2" to model tree - expr_t AddEqual(expr_t iArg1, expr_t iArg2); + BinaryOpNode *AddEqual(expr_t iArg1, expr_t iArg2); //! Adds "var_expectation(model_name)" to model tree expr_t AddVarExpectation(const string &model_name); //! Adds pac_expectation command to model tree diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index 2092b5db..453aa9c5 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -4621,9 +4621,9 @@ DynamicModel::addPacModelConsistentExpectationEquation(const string &name, int d { int symb_id = symbol_table.addDiffAuxiliaryVar(diff_node_to_search->idx, diff_node_to_search); target_base_diff_node = AddVariable(symb_id); - addEquation(dynamic_cast(AddEqual(const_cast(target_base_diff_node), - AddMinus(AddVariable(pac_target_symb_id), - AddVariable(pac_target_symb_id, -1)))), -1); + addEquation(AddEqual(const_cast(target_base_diff_node), + AddMinus(AddVariable(pac_target_symb_id), + AddVariable(pac_target_symb_id, -1))), -1); neqs++; } @@ -4635,8 +4635,8 @@ DynamicModel::addPacModelConsistentExpectationEquation(const string &name, int d int symb_id = symbol_table.addDiffLeadAuxiliaryVar(this_diff_node->idx, this_diff_node, last_aux_var->symb_id, last_aux_var->lag); VariableNode *current_aux_var = AddVariable(symb_id); - addEquation(dynamic_cast(AddEqual(current_aux_var, - AddVariable(last_aux_var->symb_id, 1))), -1); + addEquation(AddEqual(current_aux_var, + AddVariable(last_aux_var->symb_id, 1)), -1); last_aux_var = current_aux_var; target_aux_var_to_add[i] = current_aux_var; } diff --git a/src/ExprNode.cc b/src/ExprNode.cc index 2aa50544..66e111a1 100644 --- a/src/ExprNode.cc +++ b/src/ExprNode.cc @@ -252,7 +252,7 @@ ExprNode::createEndoLeadAuxiliaryVarForMyself(subst_table_t &subst_table, vector if (auto it = subst_table.find(orig_expr); it == subst_table.end()) { int symb_id = datatree.symbol_table.addEndoLeadAuxiliaryVar(orig_expr->idx, substexpr); - neweqs.push_back(dynamic_cast(datatree.AddEqual(datatree.AddVariable(symb_id, 0), substexpr))); + neweqs.push_back(datatree.AddEqual(datatree.AddVariable(symb_id, 0), substexpr)); substexpr = datatree.AddVariable(symb_id, +1); assert(dynamic_cast(substexpr)); subst_table[orig_expr] = dynamic_cast(substexpr); @@ -287,7 +287,7 @@ ExprNode::createExoLeadAuxiliaryVarForMyself(subst_table_t &subst_table, vector< if (auto it = subst_table.find(orig_expr); it == subst_table.end()) { int symb_id = datatree.symbol_table.addExoLeadAuxiliaryVar(orig_expr->idx, substexpr); - neweqs.push_back(dynamic_cast(datatree.AddEqual(datatree.AddVariable(symb_id, 0), substexpr))); + neweqs.push_back(datatree.AddEqual(datatree.AddVariable(symb_id, 0), substexpr)); substexpr = datatree.AddVariable(symb_id, +1); assert(dynamic_cast(substexpr)); subst_table[orig_expr] = dynamic_cast(substexpr); @@ -1771,7 +1771,7 @@ VariableNode::substituteEndoLagGreaterThanTwo(subst_table_t &subst_table, vector if (auto it = subst_table.find(orig_expr); it == subst_table.end()) { int aux_symb_id = datatree.symbol_table.addEndoLagAuxiliaryVar(symb_id, cur_lag+1, substexpr); - neweqs.push_back(dynamic_cast(datatree.AddEqual(datatree.AddVariable(aux_symb_id, 0), substexpr))); + neweqs.push_back(datatree.AddEqual(datatree.AddVariable(aux_symb_id, 0), substexpr)); substexpr = datatree.AddVariable(aux_symb_id, -1); subst_table[orig_expr] = substexpr; } @@ -1837,7 +1837,7 @@ VariableNode::substituteExoLag(subst_table_t &subst_table, vector(datatree.AddEqual(datatree.AddVariable(aux_symb_id, 0), substexpr))); + neweqs.push_back(datatree.AddEqual(datatree.AddVariable(aux_symb_id, 0), substexpr)); substexpr = datatree.AddVariable(aux_symb_id, -1); subst_table[orig_expr] = substexpr; } @@ -1884,8 +1884,8 @@ VariableNode::differentiateForwardVars(const vector &subset, subst_table { int aux_symb_id = datatree.symbol_table.addDiffForwardAuxiliaryVar(symb_id, datatree.AddMinus(datatree.AddVariable(symb_id, 0), datatree.AddVariable(symb_id, -1))); - neweqs.push_back(dynamic_cast(datatree.AddEqual(datatree.AddVariable(aux_symb_id, 0), datatree.AddMinus(datatree.AddVariable(symb_id, 0), - datatree.AddVariable(symb_id, -1))))); + neweqs.push_back(datatree.AddEqual(datatree.AddVariable(aux_symb_id, 0), datatree.AddMinus(datatree.AddVariable(symb_id, 0), + datatree.AddVariable(symb_id, -1)))); diffvar = datatree.AddVariable(aux_symb_id, 1); subst_table[this] = diffvar; } @@ -3518,9 +3518,9 @@ UnaryOpNode::substituteDiff(const lag_equivalence_table_t &nodes, subst_table_t this part, folding into the next loop. */ int symb_id = datatree.symbol_table.addDiffAuxiliaryVar(argsubst->idx, const_cast(this)); VariableNode *aux_var = datatree.AddVariable(symb_id, 0); - neweqs.push_back(dynamic_cast(datatree.AddEqual(aux_var, - datatree.AddMinus(argsubst, - argsubst->decreaseLeadsLags(1))))); + neweqs.push_back(datatree.AddEqual(aux_var, + datatree.AddMinus(argsubst, + argsubst->decreaseLeadsLags(1)))); subst_table[this] = dynamic_cast(aux_var); return const_cast(subst_table[this]); } @@ -3548,9 +3548,9 @@ UnaryOpNode::substituteDiff(const lag_equivalence_table_t &nodes, subst_table_t last_index = rit->first; last_aux_var = datatree.AddVariable(symb_id, 0); //ORIG_AUX_DIFF = argsubst - argsubst(-1) - neweqs.push_back(dynamic_cast(datatree.AddEqual(last_aux_var, - datatree.AddMinus(argsubst, - argsubst->decreaseLeadsLags(1))))); + neweqs.push_back(datatree.AddEqual(last_aux_var, + datatree.AddMinus(argsubst, + argsubst->decreaseLeadsLags(1)))); subst_table[rit->second] = dynamic_cast(last_aux_var); } else @@ -3567,8 +3567,8 @@ UnaryOpNode::substituteDiff(const lag_equivalence_table_t &nodes, subst_table_t last_aux_var->symb_id, last_aux_var->lag); new_aux_var = datatree.AddVariable(symb_id, 0); - neweqs.push_back(dynamic_cast(datatree.AddEqual(new_aux_var, - last_aux_var->decreaseLeadsLags(1)))); + neweqs.push_back(datatree.AddEqual(new_aux_var, + last_aux_var->decreaseLeadsLags(1))); last_aux_var = new_aux_var; } subst_table[rit->second] = dynamic_cast(new_aux_var); @@ -3688,8 +3688,8 @@ UnaryOpNode::substituteUnaryOpNodes(const lag_equivalence_table_t &nodes, subst_ symb_id = datatree.symbol_table.addUnaryOpAuxiliaryVar(this->idx, dynamic_cast(rit->second), unary_op, vn->symb_id, vn->lag); aux_var = datatree.AddVariable(symb_id, 0); - neweqs.push_back(dynamic_cast(datatree.AddEqual(aux_var, - dynamic_cast(rit->second)))); + neweqs.push_back(datatree.AddEqual(aux_var, + dynamic_cast(rit->second))); subst_table[rit->second] = dynamic_cast(aux_var); base_index = rit->first; } @@ -3794,7 +3794,7 @@ UnaryOpNode::substituteExpectation(subst_table_t &subst_table, vectorsubstituteExpectation(subst_table, neweqs, partial_information_model))->decreaseLeadsLags(expectation_information_set); assert(substexpr); - neweqs.push_back(dynamic_cast(datatree.AddEqual(newAuxE, substexpr))); //AUXE_period_arg.idx = arg(lag-period) + neweqs.push_back(datatree.AddEqual(newAuxE, substexpr)); //AUXE_period_arg.idx = arg(lag-period) newAuxE = datatree.AddVariable(symb_id, expectation_information_set); assert(dynamic_cast(newAuxE));