/* * Copyright © 2018-2019 Dynare Team * * This file is part of Dynare. * * Dynare is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Dynare is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details.SS * * You should have received a copy of the GNU General Public License * along with Dynare. If not, see . */ #ifndef _SUBMODEL_HH #define _SUBMODEL_HH #include #include #include #include #include "ExprNode.hh" #include "SymbolTable.hh" #include "SymbolList.hh" using namespace std; //! A table with all Trend Component Models in the .mod file /*! The unique name of the trend component model is the identifier */ class TrendComponentModelTable { private: SymbolTable &symbol_table; set names; map> eqtags, target_eqtags; map> eqnums, target_eqnums, nontarget_eqnums, max_lags, lhs, target_lhs, nontarget_lhs, orig_diff_var; map>>> rhs; map> diff; map> lhs_expr_t; map> target_vars; map, expr_t>> AR; // AR: name -> (eqn, lag, lhs_symb_id) -> expr_t map, expr_t>> A0, A0star; // EC: name -> (eqn, lag, col) -> expr_t public: explicit TrendComponentModelTable(SymbolTable &symbol_table_arg); //! Add a trend component model void addTrendComponentModel(string name_arg, vector eqtags_arg, vector target_eqtags_arg); inline bool isExistingTrendComponentModelName(const string &name_arg) const; inline bool empty() const; map> getEqTags() const; vector getEqTags(const string &name_arg) const; map> getTargetEqTags() const; map> getEqNums() const; map> getTargetEqNums() const; vector getTargetEqNums(const string &name_arg) const; vector getEqNums(const string &name_arg) const; vector getMaxLags(const string &name_arg) const; int getMaxLag(const string &name_arg) const; vector getLhs(const string &name_arg) const; vector getLhsExprT(const string &name_arg) const; vector getDiff(const string &name_arg) const; vector getOrigDiffVar(const string &name_arg) const; map> getNonTargetEqNums() const; vector getNonTargetEqNums(const string &name_arg) const; vector getNonTargetLhs(const string &name_arg) const; vector getTargetLhs(const string &name_arg) const; void setVals(map> eqnums_arg, map> target_eqnums_arg, map> lhs_arg, map> lhs_expr_t_arg); void setRhs(map>>> rhs_arg); void setMaxLags(map> max_lags_arg); void setDiff(map> diff_arg); void setOrigDiffVar(map> orig_diff_var_arg); void setTargetVar(map> target_vars_arg); void setAR(map, expr_t>> AR_arg); void setA0(map, expr_t>> A0_arg, map, expr_t>> A0star_arg); //! Write output of this class void writeOutput(const string &basename, ostream &output) const; //! Write JSON Output void writeJsonOutput(ostream &output) const; private: void checkModelName(const string &name_arg) const; void setNonTargetEqnums(); }; inline bool TrendComponentModelTable::isExistingTrendComponentModelName(const string &name_arg) const { return names.find(name_arg) != names.end(); } inline bool TrendComponentModelTable::empty() const { return names.empty(); } class VarModelTable { private: SymbolTable &symbol_table; set names; map> symbol_list_and_order; map> eqtags; map> eqnums, max_lags, lhs, lhs_orig_symb_ids, orig_diff_var; map>>> rhs; map> diff; map> lhs_expr_t; map, expr_t>> AR; // AR: name -> (eqn, lag, lhs_symb_id) -> param_expr_t public: explicit VarModelTable(SymbolTable &symbol_table_arg); //! Add a VAR model void addVarModel(string name, vector eqtags, pair symbol_list_and_order_arg); inline bool isExistingVarModelName(const string &name_arg) const; inline bool empty() const; map> getEqTags() const; vector getEqTags(const string &name_arg) const; map> getEqNums() const; vector getDiff(const string &name_arg) const; vector getEqNums(const string &name_arg) const; vector getMaxLags(const string &name_arg) const; int getMaxLag(const string &name_arg) const; vector getLhs(const string &name_arg) const; vector getLhsOrigIds(const string &name_arg) const; map> getSymbolListAndOrder() const; vector>> getRhs(const string &name_arg) const; vector getLhsExprT(const string &name_arg) const; void setEqNums(map> eqnums_arg); void setLhs(map> lhs_arg); void setRhs(map>>> rhs_arg); void setLhsExprT(map> lhs_expr_t_arg); void setDiff(map> diff_arg); void setMaxLags(map> max_lags_arg); void setOrigDiffVar(map> orig_diff_var_arg); void setAR(map, expr_t>> AR_arg); //! Write output of this class void writeOutput(const string &basename, ostream &output) const; //! Write JSON Output void writeJsonOutput(ostream &output) const; private: void checkModelName(const string &name_arg) const; }; inline bool VarModelTable::isExistingVarModelName(const string &name_arg) const { return names.find(name_arg) != names.end(); } inline bool VarModelTable::empty() const { return names.empty(); } #endif