diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index eeba1b8c20f39c7852529f6df8d3496ae7a55ad6..873b71510b59628b8c8d20c0556791f6e21ae61d 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -3662,7 +3662,7 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de pair<int, int> lhs_pac_var; int optim_share_index; set<pair<int, pair<int, int>>> ar_params_and_vars; - pair<int, pair<vector<int>, vector<bool>>> ec_params_and_vars; + pair<int, vector<pair<int,bool>>> ec_params_and_vars; vector<tuple<int, int, int, double>> non_optim_vars_params_and_constants, additive_vars_params_and_constants; tie(lhs_pac_var, optim_share_index, ar_params_and_vars, ec_params_and_vars, non_optim_vars_params_and_constants, additive_vars_params_and_constants) = pit.second; string substruct = pit.first.first + ".equations." + pit.first.second + "."; @@ -3677,12 +3677,30 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de output << modstruct << "pac." << substruct << "ec.params = " << symbol_table.getTypeSpecificID(ec_params_and_vars.first) + 1 << ";" << endl << modstruct << "pac." << substruct << "ec.vars = ["; - for (auto it : ec_params_and_vars.second.first) - output << symbol_table.getTypeSpecificID(it) + 1 << " "; + for (auto it : ec_params_and_vars.second) + output << symbol_table.getTypeSpecificID(it.first) + 1 << " "; + output << "];" << endl + << modstruct << "pac." << substruct << "ec.istarget = ["; + for (auto it : ec_params_and_vars.second) + if (it.second) + output << "true "; + else + output << "false "; output << "];" << endl << modstruct << "pac." << substruct << "ec.isendo = ["; - for (auto it : ec_params_and_vars.second.second) - output << (it ? "true" : "false") << " "; + for (auto it : ec_params_and_vars.second) + switch (symbol_table.getType(it.first)) + { + case SymbolType::endogenous: + output << "true "; + break; + case SymbolType::exogenous: + output << "false "; + break; + default: + cerr << "expecting endogenous or exogenous" << endl; + exit(EXIT_FAILURE); + } output << "];" << endl << modstruct << "pac." << substruct << "ar.params = ["; for (auto & it : ar_params_and_vars) @@ -4419,7 +4437,7 @@ DynamicModel::walkPacParameters(const string &name, map<pair<string, string>, pa for (auto & equation : equations) { pair<int, int> lhs (-1, -1); - pair<int, pair<vector<int>, vector<bool>>> ec_params_and_vars; + pair<int, vector<pair<int,bool>>> ec_params_and_vars; set<pair<int, pair<int, int>>> ar_params_and_vars; vector<tuple<int, int, int, double>> non_optim_vars_params_and_constants, additive_vars_params_and_constants; @@ -4451,10 +4469,24 @@ DynamicModel::walkPacParameters(const string &name, map<pair<string, string>, pa arg2->getPacOptimizingShareAndExprNodes(lhs_symb_id, lhs_orig_symb_id); if (optim_part == nullptr) - equation->arg2->getPacOptimizingPart(lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars); + { + auto bopn = dynamic_cast<BinaryOpNode *>(equation->arg2); + if (bopn == nullptr) + { + cerr << "Error in PAC equation" << endl; + exit(EXIT_FAILURE); + } + bopn->getPacAREC(lhs_symb_id, lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars, additive_vars_params_and_constants); + } else { - optim_part->getPacOptimizingPart(lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars); + auto bopn = dynamic_cast<BinaryOpNode *>(optim_part); + if (bopn == nullptr) + { + cerr << "Error in PAC equation" << endl; + exit(EXIT_FAILURE); + } + bopn->getPacAREC(lhs_symb_id, lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars, additive_vars_params_and_constants); try { non_optim_vars_params_and_constants = non_optim_part->matchLinearCombinationOfVariables(); @@ -4487,7 +4519,7 @@ DynamicModel::walkPacParameters(const string &name, map<pair<string, string>, pa cerr << "walkPacParameters: error obtaining LHS varibale." << endl; exit(EXIT_FAILURE); } - if (ec_params_and_vars.second.first.empty() || ar_params_and_vars.empty()) + if (ec_params_and_vars.second.empty() || ar_params_and_vars.empty()) { cerr << "walkPacParameters: error obtaining RHS parameters." << endl; exit(EXIT_FAILURE); diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh index 30394526351139b4a622c93af2a4e1807398b12f..868d0e9faba17fedbd0119d29f7a806138d4460b 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -487,7 +487,7 @@ public: //! (pac_model_name, standardized_eqtag) -> //! (lhs, optim_share_index, ar_params_and_vars, ec_params_and_vars, non_optim_vars_params_and_constants) map<pair<string, string>, - tuple<pair<int, int>, int, set<pair<int, pair<int, int>>>, pair<int, pair<vector<int>, vector<bool>>>, vector<tuple<int, int, int, double>>, vector<tuple<int, int, int, double>>>> pac_equation_info; + tuple<pair<int, int>, int, set<pair<int, pair<int, int>>>, pair<int, vector<pair<int,bool>>>, vector<tuple<int, int, int, double>>, vector<tuple<int, int, int, double>>>> pac_equation_info; //! Table to undiff LHS variables for pac vector z vector<int> getUndiffLHSForPac(const string &aux_model_name, diff --git a/src/ExprNode.cc b/src/ExprNode.cc index 614a8080dd329710432f3a0a9bf8757dc9f07635..f28d910e4f212d8c413d5ac1d3fa148e926e57fe 100644 --- a/src/ExprNode.cc +++ b/src/ExprNode.cc @@ -674,12 +674,6 @@ NumConstNode::isParamTimesEndogExpr() const return false; } -void -NumConstNode::getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> &ar_params_and_vars) const -{ -} - bool NumConstNode::isVarModelReferenced(const string &model_info_name) const { @@ -1968,12 +1962,6 @@ VariableNode::isParamTimesEndogExpr() const return false; } -void -VariableNode::getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> &ar_params_and_vars) const -{ -} - bool VariableNode::isVarModelReferenced(const string &model_info_name) const { @@ -3778,14 +3766,6 @@ UnaryOpNode::isParamTimesEndogExpr() const return arg->isParamTimesEndogExpr(); } - -void -UnaryOpNode::getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> &ar_params_and_vars) const -{ - arg->getPacOptimizingPart(lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars); -} - bool UnaryOpNode::isVarModelReferenced(const string &model_info_name) const { @@ -5549,7 +5529,7 @@ BinaryOpNode::findTargetVariable(int lhs_symb_id) const retval = arg2->findTargetVariable(lhs_symb_id); return retval; } - +/* void BinaryOpNode::getPacOptimizingPartHelper(const expr_t arg1, const expr_t arg2, int lhs_orig_symb_id, @@ -5563,6 +5543,7 @@ BinaryOpNode::getPacOptimizingPartHelper(const expr_t arg1, const expr_t arg2, set<pair<int, int>> endogs; arg2->collectDynamicVariables(SymbolType::endogenous, endogs); + arg2->collectDynamicVariables(SymbolType::exogenous, endogs); if (endogs.size() == 1) ar_params_and_vars.emplace(*(params.begin()), *(endogs.begin())); else if (endogs.size() >= 2) @@ -5578,6 +5559,7 @@ BinaryOpNode::getPacOptimizingPartHelper(const expr_t arg1, const expr_t arg2, vector<bool> order; endogs.clear(); test_arg1->collectDynamicVariables(SymbolType::endogenous, endogs); + test_arg1->collectDynamicVariables(SymbolType::exogenous, endogs); endog_ids.push_back(endogs.begin()->first); if (endogs.begin()->first == lhs_orig_symb_id) order.push_back(true); @@ -5586,6 +5568,7 @@ BinaryOpNode::getPacOptimizingPartHelper(const expr_t arg1, const expr_t arg2, endogs.clear(); test_arg2->collectDynamicVariables(SymbolType::endogenous, endogs); + test_arg2->collectDynamicVariables(SymbolType::exogenous, endogs); endog_ids.push_back(endogs.begin()->first); if (endogs.begin()->first == lhs_orig_symb_id) order.push_back(true); @@ -5597,21 +5580,137 @@ BinaryOpNode::getPacOptimizingPartHelper(const expr_t arg1, const expr_t arg2, } } } +*/ + +pair<int, vector<pair<int,bool>>> +BinaryOpNode::getPacEC(BinaryOpNode *bopn, int lhs_symb_id, int lhs_orig_symb_id) const +{ + pair<int, vector<pair<int,bool>>> ec_params_and_vars = {-1, vector<pair<int, bool>>()}; + int optim_param_symb_id = -1; + expr_t optim_part = nullptr; + set<pair<int, int>> endogs; + bopn->collectDynamicVariables(SymbolType::endogenous, endogs); + int target_symb_id = getPacTargetSymbIdHelper(lhs_symb_id, lhs_orig_symb_id, endogs); + if (target_symb_id >= 0 && bopn->isParamTimesEndogExpr()) + { + optim_part = bopn->arg2; + auto vn = dynamic_cast<VariableNode *>(bopn->arg1); + if (vn == nullptr || datatree.symbol_table.getType(vn->symb_id) != SymbolType::parameter) + { + optim_part = bopn->arg1; + vn = dynamic_cast<VariableNode *>(bopn->arg2); + } + if (vn == nullptr || datatree.symbol_table.getType(vn->symb_id) != SymbolType::parameter) + return ec_params_and_vars; + optim_param_symb_id = vn->symb_id; + } + if (optim_param_symb_id >= 0) + { + endogs.clear(); + optim_part->collectDynamicVariables(SymbolType::endogenous, endogs); + optim_part->collectDynamicVariables(SymbolType::exogenous, endogs); + vector<pair<int,bool>> symb_ids; + for (const auto & it : endogs) + { + int id = it.first; + bool istarget = false; + while (datatree.symbol_table.isAuxiliaryVariable(id)) + try + { + id = datatree.symbol_table.getOrigSymbIdForAuxVar(id); + } + catch (...) + { + break; + } + if (id == lhs_symb_id || id == lhs_orig_symb_id) + istarget = true; + symb_ids.push_back({it.first, istarget}); + } + ec_params_and_vars = make_pair(optim_param_symb_id, symb_ids); + } + return ec_params_and_vars; +} void -BinaryOpNode::getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> &ar_params_and_vars) const +BinaryOpNode::getPacAREC(int lhs_symb_id, int lhs_orig_symb_id, + pair<int, vector<pair<int,bool>>> &ec_params_and_vars, + set<pair<int, pair<int, int>>> &ar_params_and_vars, + vector<tuple<int, int, int, double>> &additive_vars_params_and_constants) const { - if (op_code == BinaryOpcode::times) + vector<pair<expr_t, int>> terms; + decomposeAdditiveTerms(terms, 1); + for (auto it = terms.begin(); it != terms.end(); it++) + { + auto bopn = dynamic_cast<BinaryOpNode *>(it->first); + if (bopn != nullptr) + { + ec_params_and_vars = getPacEC(bopn, lhs_symb_id, lhs_orig_symb_id); + if (ec_params_and_vars.first >= 0) + { + terms.erase(it); + break; + } + } + } + + if (ec_params_and_vars.first < 0) { - int orig_ar_params_and_vars_size = ar_params_and_vars.size(); - getPacOptimizingPartHelper(arg1, arg2, lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars); - if ((int)ar_params_and_vars.size() == orig_ar_params_and_vars_size && ec_params_and_vars.second.first.empty()) - getPacOptimizingPartHelper(arg2, arg1, lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars); + cerr << "Error finding EC part of PAC equation" << endl; + exit(EXIT_FAILURE); } - arg1->getPacOptimizingPart(lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars); - arg2->getPacOptimizingPart(lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars); + for (const auto & it : terms) + { + auto bopn = dynamic_cast<BinaryOpNode *>(it.first); + if (bopn != nullptr) + { + auto vn1 = dynamic_cast<VariableNode *>(bopn->arg1); + auto vn2 = dynamic_cast<VariableNode *>(bopn->arg2); + if (vn1 && vn2) + { + int pid, vid, lag; + pid = vid = lag = -1; + if (datatree.symbol_table.getType(vn1->symb_id) == SymbolType::parameter + && (datatree.symbol_table.getType(vn2->symb_id) == SymbolType::endogenous + || datatree.symbol_table.getType(vn2->symb_id) == SymbolType::exogenous)) + { + pid = vn1->symb_id; + vid = vn2->symb_id; + lag = vn2->lag; + } + else if (datatree.symbol_table.getType(vn2->symb_id) == SymbolType::parameter + && (datatree.symbol_table.getType(vn1->symb_id) == SymbolType::endogenous + || datatree.symbol_table.getType(vn1->symb_id) == SymbolType::exogenous)) + { + pid = vn2->symb_id; + vid = vn1->symb_id; + lag = vn1->lag; + } + if (pid > 0 && vid > 0) + { + int vidorig = vid; + while (datatree.symbol_table.isAuxiliaryVariable(vid)) + try + { + vid = datatree.symbol_table.getOrigSymbIdForAuxVar(vid); + } + catch (...) + { + break; + } + if (vid == lhs_symb_id || vid == lhs_orig_symb_id) + ar_params_and_vars.insert({pid, {vidorig, lag}}); + else + { + auto m = it.first->matchVariableTimesConstantTimesParam(); + get<3>(m) *= it.second; + additive_vars_params_and_constants.push_back(m); + } + } + } + } + } } bool @@ -6928,15 +7027,6 @@ TrinaryOpNode::isParamTimesEndogExpr() const || arg3->isParamTimesEndogExpr(); } -void -TrinaryOpNode::getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> &ar_params_and_vars) const -{ - arg1->getPacOptimizingPart(lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars); - arg2->getPacOptimizingPart(lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars); - arg3->getPacOptimizingPart(lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars); -} - bool TrinaryOpNode::isVarModelReferenced(const string &model_info_name) const { @@ -7485,14 +7575,6 @@ AbstractExternalFunctionNode::isParamTimesEndogExpr() const return false; } -void -AbstractExternalFunctionNode::getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> &ar_params_and_vars) const -{ - for (auto argument : arguments) - argument->getPacOptimizingPart(lhs_orig_symb_id, ec_params_and_vars, ar_params_and_vars); -} - bool AbstractExternalFunctionNode::isVarModelReferenced(const string &model_info_name) const { @@ -9118,12 +9200,6 @@ VarExpectationNode::isParamTimesEndogExpr() const return false; } -void -VarExpectationNode::getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> &ar_params_and_vars) const -{ -} - expr_t VarExpectationNode::substituteStaticAuxiliaryVariable() const { @@ -9596,12 +9672,6 @@ PacExpectationNode::isParamTimesEndogExpr() const return false; } -void -PacExpectationNode::getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> &ar_params_and_vars) const -{ -} - expr_t PacExpectationNode::substitutePacExpectation(const string & name, expr_t subexpr) { diff --git a/src/ExprNode.hh b/src/ExprNode.hh index fc45c1f0f5adbab026a660e388a4f9fabae4668a..762fbeea1b44aee33fbd22bef7d9dd44bd22136c 100644 --- a/src/ExprNode.hh +++ b/src/ExprNode.hh @@ -583,10 +583,6 @@ class ExprNode //! Returns true if model_info_name is referenced by a VarExpectationNode virtual bool isVarModelReferenced(const string &model_info_name) const = 0; - //! Fills parameter information rerhs_symblated to PAC equation - virtual void getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> ¶ms_and_vars) const = 0; - //! Matches a linear combination of variables, where scalars can be constant*parameter /*! Returns a list of (variable_id, lag, param_id, constant) corresponding to the terms in the expression. When there is no @@ -727,8 +723,6 @@ public: void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; bool containsPacExpectation(const string &pac_model_name = "") const override; - void getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> ¶ms_and_vars) const override; bool isParamTimesEndogExpr() const override; bool isVarModelReferenced(const string &model_info_name) const override; void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const override; @@ -814,8 +808,6 @@ public: void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; bool containsPacExpectation(const string &pac_model_name = "") const override; - void getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> ¶ms_and_vars) const override; bool isParamTimesEndogExpr() const override; bool isVarModelReferenced(const string &model_info_name) const override; void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const override; @@ -929,8 +921,6 @@ public: void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; bool containsPacExpectation(const string &pac_model_name = "") const override; - void getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> ¶ms_and_vars) const override; bool isParamTimesEndogExpr() const override; bool isVarModelReferenced(const string &model_info_name) const override; void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const override; @@ -995,10 +985,6 @@ public: double eval(const eval_context_t &eval_context) const noexcept(false) override; 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 Compute_RHS(expr_t arg1, expr_t arg2, int op, int op_type) const; - void getPacOptimizingPartHelper(const expr_t arg1, const expr_t arg2, - int lhs_orig_symb_id, - pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> &ar_params_and_vars) const; expr_t toStatic(DataTree &static_datatree) const override; void computeXrefs(EquationInfo &ei) const override; pair<int, expr_t> normalizeEquation(int symb_id_endo, vector<tuple<int, expr_t, expr_t>> &List_of_Op_RHS) const override; @@ -1062,8 +1048,11 @@ public: void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; bool containsPacExpectation(const string &pac_model_name = "") const override; - void getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> ¶ms_and_vars) const override; + pair<int, vector<pair<int,bool>>> getPacEC(BinaryOpNode *bopn, int lhs_symb_id, int lhs_orig_symb_id) const; + void getPacAREC(int lhs_symb_id, int lhs_orig_symb_id, + pair<int, vector<pair<int,bool>>> &ec_params_and_vars, + set<pair<int, pair<int, int>>> &ar_params_and_vars, + vector<tuple<int, int, int, double>> &additive_vars_params_and_constants) const; //! Finds the share of optimizing agents in the PAC equation, //! the expr node associated with it, @@ -1182,8 +1171,6 @@ public: void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; bool containsPacExpectation(const string &pac_model_name = "") const override; - void getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> ¶ms_and_vars) const override; bool isParamTimesEndogExpr() const override; bool isVarModelReferenced(const string &model_info_name) const override; void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const override; @@ -1306,8 +1293,6 @@ public: void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; bool containsPacExpectation(const string &pac_model_name = "") const override; - void getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> ¶ms_and_vars) const override; bool isParamTimesEndogExpr() const override; bool isVarModelReferenced(const string &model_info_name) const override; void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const override; @@ -1518,8 +1503,6 @@ public: void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; bool containsPacExpectation(const string &pac_model_name = "") const override; - void getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> ¶ms_and_vars) const override; bool isParamTimesEndogExpr() const override; bool isVarModelReferenced(const string &model_info_name) const override; void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const override; @@ -1603,8 +1586,6 @@ public: void findConstantEquations(map<VariableNode *, NumConstNode *> &table) const override; expr_t replaceVarsInEquation(map<VariableNode *, NumConstNode *> &table) const override; bool containsPacExpectation(const string &pac_model_name = "") const override; - void getPacOptimizingPart(int lhs_orig_symb_id, pair<int, pair<vector<int>, vector<bool>>> &ec_params_and_vars, - set<pair<int, pair<int, int>>> ¶ms_and_vars) const override; bool isParamTimesEndogExpr() const override; bool isVarModelReferenced(const string &model_info_name) const override; void getEndosAndMaxLags(map<string, int> &model_endos_and_lags) const override;