diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index 10b99eec3dde50592fd50d55cf721d45a44b84d4..2153a3bc8448b9679b74490078758fb2efd75c95 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -4827,21 +4827,6 @@ DynamicModel::writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputTyp } } -void -DynamicModel::updateAfterVariableChange(DynamicModel &dm) -{ - variable_node_map.clear(); - unary_op_node_map.clear(); - binary_op_node_map.clear(); - trinary_op_node_map.clear(); - external_function_node_map.clear(); - first_deriv_external_function_node_map.clear(); - second_deriv_external_function_node_map.clear(); - - cloneDynamic(dm); - dm.replaceMyEquations(*this); -} - void DynamicModel::cloneDynamic(DynamicModel &dynamic_model) const { diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh index 1b5fc23ef3c565bd1f4b0d1b6a561b9e76b95195..8ff5c21501f619b99628a676f28cc9dd34a16955 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -378,9 +378,6 @@ public: /*! It assumes that the dynamic model given in argument has just been allocated */ void cloneDynamic(DynamicModel &dynamic_model) const; - //! update equations after variable type change in model block - void updateAfterVariableChange(DynamicModel &dynamic_model); - //! Replaces model equations with derivatives of Lagrangian w.r.t. endogenous void computeRamseyPolicyFOCs(const StaticModel &static_model, const bool nopreprocessoroutput); //! Replaces the model equations in dynamic_model with those in this model diff --git a/src/ExprNode.cc b/src/ExprNode.cc index 2dcd9635969be106a35cd7af73d21a2931725eee..8a6aa8bfdf29930c010ace335edff0ebf051accb 100644 --- a/src/ExprNode.cc +++ b/src/ExprNode.cc @@ -714,12 +714,11 @@ NumConstNode::fillErrorCorrectionRow(int eqn, const vector<int> &nontrend_lhs, c VariableNode::VariableNode(DataTree &datatree_arg, int idx_arg, int symb_id_arg, int lag_arg) : ExprNode{datatree_arg, idx_arg}, symb_id{symb_id_arg}, - type{datatree.symbol_table.getType(symb_id_arg)}, lag{lag_arg} { // It makes sense to allow a lead/lag on parameters: during steady state calibration, endogenous and parameters can be swapped - assert(type != SymbolType::externalFunction - && (lag == 0 || (type != SymbolType::modelLocalVariable && type != SymbolType::modFileLocalVariable))); + assert(get_type() != SymbolType::externalFunction + && (lag == 0 || (get_type() != SymbolType::modelLocalVariable && get_type() != SymbolType::modFileLocalVariable))); } void @@ -731,7 +730,7 @@ VariableNode::prepareForDerivation() preparedForDerivation = true; // Fill in non_null_derivatives - switch (type) + switch (get_type()) { case SymbolType::endogenous: case SymbolType::exogenous: @@ -765,7 +764,7 @@ VariableNode::prepareForDerivation() expr_t VariableNode::computeDerivative(int deriv_id) { - switch (type) + switch (get_type()) { case SymbolType::endogenous: case SymbolType::exogenous: @@ -806,7 +805,7 @@ VariableNode::collectTemporary_terms(const temporary_terms_t &temporary_terms, t auto it = temporary_terms.find(const_cast<VariableNode *>(this)); if (it != temporary_terms.end()) temporary_terms_inuse.insert(idx); - if (type == SymbolType::modelLocalVariable) + if (get_type() == SymbolType::modelLocalVariable) datatree.getLocalVariable(symb_id)->collectTemporary_terms(temporary_terms, temporary_terms_inuse, Curr_Block); } @@ -821,7 +820,7 @@ VariableNode::writeJsonAST(ostream &output) const { output << "{\"node_type\" : \"VariableNode\", " << "\"name\" : \"" << datatree.symbol_table.getName(symb_id) << "\", \"type\" : \""; - switch (type) + switch (get_type()) { case SymbolType::endogenous: output << "endogenous"; @@ -896,6 +895,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_idxs_t &temporary_terms_idxs, const deriv_node_temp_terms_t &tef_terms) const { + auto type = get_type(); if (checkIfTemporaryTermThenWrite(output, output_type, temporary_terms, temporary_terms_idxs)) return; @@ -1150,7 +1150,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type, expr_t VariableNode::substituteStaticAuxiliaryVariable() const { - if (type == SymbolType::endogenous) + if (get_type() == SymbolType::endogenous) { try { @@ -1179,6 +1179,7 @@ VariableNode::compile(ostream &CompileCode, unsigned int &instruction_number, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, const deriv_node_temp_terms_t &tef_terms) const { + auto type = get_type(); if (type == SymbolType::modelLocalVariable || type == SymbolType::modFileLocalVariable) datatree.getLocalVariable(symb_id)->compile(CompileCode, instruction_number, lhs_rhs, temporary_terms, map_idx, dynamic, steady_dynamic, tef_terms); else @@ -1255,14 +1256,14 @@ VariableNode::computeTemporaryTerms(map<expr_t, int> &reference_count, vector<vector<temporary_terms_t>> &v_temporary_terms, int equation) const { - if (type == SymbolType::modelLocalVariable) + if (get_type() == SymbolType::modelLocalVariable) datatree.getLocalVariable(symb_id)->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, Curr_block, v_temporary_terms, equation); } void VariableNode::collectVARLHSVariable(set<expr_t> &result) const { - if (type == SymbolType::endogenous && lag == 0) + if (get_type() == SymbolType::endogenous && lag == 0) result.insert(const_cast<VariableNode *>(this)); else { @@ -1274,9 +1275,9 @@ VariableNode::collectVARLHSVariable(set<expr_t> &result) const void VariableNode::collectDynamicVariables(SymbolType type_arg, set<pair<int, int>> &result) const { - if (type == type_arg) + if (get_type() == type_arg) result.emplace(symb_id, lag); - if (type == SymbolType::modelLocalVariable) + if (get_type() == SymbolType::modelLocalVariable) datatree.getLocalVariable(symb_id)->collectDynamicVariables(type_arg, result); } @@ -1295,7 +1296,7 @@ VariableNode::normalizeEquation(int var_endo, vector<pair<int, pair<expr_t, expr the flag is equal to 2. - an expression equal to the RHS if flag = 0 and equal to NULL elsewhere */ - if (type == SymbolType::endogenous) + if (get_type() == SymbolType::endogenous) { if (datatree.symbol_table.getTypeSpecificID(symb_id) == var_endo && lag == 0) /* the endogenous variable */ @@ -1305,7 +1306,7 @@ VariableNode::normalizeEquation(int var_endo, vector<pair<int, pair<expr_t, expr } else { - if (type == SymbolType::parameter) + if (get_type() == SymbolType::parameter) return { 0, datatree.AddVariable(symb_id, 0) }; else return { 0, datatree.AddVariable(symb_id, lag) }; @@ -1315,7 +1316,7 @@ VariableNode::normalizeEquation(int var_endo, vector<pair<int, pair<expr_t, expr expr_t VariableNode::getChainRuleDerivative(int deriv_id, const map<int, expr_t> &recursive_variables) { - switch (type) + switch (get_type()) { case SymbolType::endogenous: case SymbolType::exogenous: @@ -1380,7 +1381,7 @@ VariableNode::toStatic(DataTree &static_datatree) const void VariableNode::computeXrefs(EquationInfo &ei) const { - switch (type) + switch (get_type()) { case SymbolType::endogenous: ei.endo.emplace(symb_id, lag); @@ -1409,6 +1410,12 @@ VariableNode::computeXrefs(EquationInfo &ei) const } } +SymbolType +VariableNode::get_type() const +{ + return datatree.symbol_table.getType(symb_id); +} + expr_t VariableNode::cloneDynamic(DataTree &dynamic_datatree) const { @@ -1418,7 +1425,7 @@ VariableNode::cloneDynamic(DataTree &dynamic_datatree) const int VariableNode::maxEndoLead() const { - switch (type) + switch (get_type()) { case SymbolType::endogenous: return max(lag, 0); @@ -1432,7 +1439,7 @@ VariableNode::maxEndoLead() const int VariableNode::maxExoLead() const { - switch (type) + switch (get_type()) { case SymbolType::exogenous: return max(lag, 0); @@ -1446,7 +1453,7 @@ VariableNode::maxExoLead() const int VariableNode::maxEndoLag() const { - switch (type) + switch (get_type()) { case SymbolType::endogenous: return max(-lag, 0); @@ -1460,7 +1467,7 @@ VariableNode::maxEndoLag() const int VariableNode::maxExoLag() const { - switch (type) + switch (get_type()) { case SymbolType::exogenous: return max(-lag, 0); @@ -1474,7 +1481,7 @@ VariableNode::maxExoLag() const int VariableNode::maxLead() const { - switch (type) + switch (get_type()) { case SymbolType::endogenous: return lag; @@ -1490,7 +1497,7 @@ VariableNode::maxLead() const int VariableNode::VarMinLag() const { - switch (type) + switch (get_type()) { case SymbolType::endogenous: return -lag; @@ -1509,7 +1516,7 @@ VariableNode::VarMinLag() const int VariableNode::maxLag() const { - switch (type) + switch (get_type()) { case SymbolType::endogenous: return -lag; @@ -1595,7 +1602,7 @@ VariableNode::substitutePacExpectation(map<const PacExpectationNode *, const Bin expr_t VariableNode::decreaseLeadsLags(int n) const { - switch (type) + switch (get_type()) { case SymbolType::endogenous: case SymbolType::exogenous: @@ -1623,7 +1630,7 @@ expr_t VariableNode::substituteEndoLeadGreaterThanTwo(subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs, bool deterministic_model) const { expr_t value; - switch (type) + switch (get_type()) { case SymbolType::endogenous: if (lag <= 1) @@ -1648,7 +1655,7 @@ VariableNode::substituteEndoLagGreaterThanTwo(subst_table_t &subst_table, vector expr_t value; subst_table_t::const_iterator it; int cur_lag; - switch (type) + switch (get_type()) { case SymbolType::endogenous: if (lag >= -1) @@ -1696,7 +1703,7 @@ expr_t VariableNode::substituteExoLead(subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs, bool deterministic_model) const { expr_t value; - switch (type) + switch (get_type()) { case SymbolType::exogenous: if (lag <= 0) @@ -1721,7 +1728,7 @@ VariableNode::substituteExoLag(subst_table_t &subst_table, vector<BinaryOpNode * expr_t value; subst_table_t::const_iterator it; int cur_lag; - switch (type) + switch (get_type()) { case SymbolType::exogenous: if (lag >= 0) @@ -1775,7 +1782,7 @@ expr_t VariableNode::differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const { expr_t value; - switch (type) + switch (get_type()) { case SymbolType::endogenous: assert(lag <= 1); @@ -1820,7 +1827,7 @@ VariableNode::isNumConstNodeEqualTo(double value) const bool VariableNode::isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const { - if (type == type_arg && datatree.symbol_table.getTypeSpecificID(symb_id) == variable_id && lag == lag_arg) + if (get_type() == type_arg && datatree.symbol_table.getTypeSpecificID(symb_id) == variable_id && lag == lag_arg) return true; else return false; @@ -1835,7 +1842,7 @@ VariableNode::containsPacExpectation(const string &pac_model_name) const bool VariableNode::containsEndogenous() const { - if (type == SymbolType::endogenous) + if (get_type() == SymbolType::endogenous) return true; else return false; @@ -1844,7 +1851,7 @@ VariableNode::containsEndogenous() const bool VariableNode::containsExogenous() const { - return (type == SymbolType::exogenous || type == SymbolType::exogenousDet); + return (get_type() == SymbolType::exogenous || get_type() == SymbolType::exogenousDet); } expr_t @@ -1947,8 +1954,8 @@ void VariableNode::getPacNonOptimizingPart(set<pair<int, pair<pair<int, int>, double>>> ¶ms_vars_and_scaling_factor) const { - if (type != SymbolType::endogenous - && type != SymbolType::exogenous) + if (get_type() != SymbolType::endogenous + && get_type() != SymbolType::exogenous) { cerr << "ERROR VariableNode::getPacNonOptimizingPart: Error in parsing PAC equation" << endl; @@ -1993,7 +2000,7 @@ void VariableNode::getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const { string varname = datatree.symbol_table.getName(symb_id); - if (type == SymbolType::endogenous) + if (get_type() == SymbolType::endogenous) if (model_endos_and_lags.find(varname) == model_endos_and_lags.end()) model_endos_and_lags[varname] = min(model_endos_and_lags[varname], lag); else diff --git a/src/ExprNode.hh b/src/ExprNode.hh index ce91ad12da70dff88e0f29edd3c5d01538d05557..ebba6bb7bf57307510bd816b312e005f28d9eaea 100644 --- a/src/ExprNode.hh +++ b/src/ExprNode.hh @@ -693,7 +693,6 @@ class VariableNode : public ExprNode private: //! Id from the symbol table const int symb_id; - const SymbolType type; //! A positive value is a lead, a negative is a lag const int lag; expr_t computeDerivative(int deriv_id) override; @@ -717,11 +716,7 @@ public: void compile(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, const deriv_node_temp_terms_t &tef_terms) const override; expr_t toStatic(DataTree &static_datatree) const override; void computeXrefs(EquationInfo &ei) const override; - SymbolType - get_type() const - { - return type; - }; + SymbolType get_type() const; int get_symb_id() const { diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc index a7428c71eb549d0dd4833dd3497a4e4ac41c5bb4..0cbf7e4ab324f60fa1b02122f28335c1b31078fe 100644 --- a/src/ParsingDriver.cc +++ b/src/ParsingDriver.cc @@ -369,14 +369,6 @@ ParsingDriver::declare_or_change_type(SymbolType new_type, const string &name) symb_id = mod_file->symbol_table.getID(name); mod_file->symbol_table.changeType(symb_id, new_type); - // change in equations in ModelTree - auto dm = make_unique<DynamicModel>(mod_file->symbol_table, - mod_file->num_constants, - mod_file->external_functions_table, - mod_file->trend_component_model_table, - mod_file->var_model_table); - mod_file->dynamic_model.updateAfterVariableChange(*dm); - // remove error messages undeclared_model_vars.erase(name); for (auto it = undeclared_model_variable_errors.begin();