Improve some function prototypes for better distinction between input and output arguments

issue#70
Sébastien Villemot 2019-08-19 14:51:21 +02:00
parent cd99bb3af9
commit 8e9f6e4c57
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
3 changed files with 55 additions and 39 deletions

View File

@ -4170,11 +4170,11 @@ DynamicModel::fillTrendComponentModelTable() const
trend_component_model_table.setVals(eqnums, trend_eqnums, lhsr, lhs_expr_tr); trend_component_model_table.setVals(eqnums, trend_eqnums, lhsr, lhs_expr_tr);
} }
void pair<map<string, map<tuple<int, int, int>, expr_t>>, map<string, map<tuple<int, int, int>, expr_t>>>
DynamicModel::fillErrorComponentMatrix(map<string, map<tuple<int, int, int>, expr_t>> &A0r, DynamicModel::fillErrorComponentMatrix(const ExprNode::subst_table_t &diff_subst_table) const
map<string, map<tuple<int, int, int>, expr_t>> &A0starr,
ExprNode::subst_table_t &diff_subst_table) const
{ {
map<string, map<tuple<int, int, int>, expr_t>> A0r, A0starr;
for (const auto & it : trend_component_model_table.getEqNums()) for (const auto & it : trend_component_model_table.getEqNums())
{ {
int i = 0; int i = 0;
@ -4198,6 +4198,8 @@ DynamicModel::fillErrorComponentMatrix(map<string, map<tuple<int, int, int>, exp
A0r[it.first] = A0; A0r[it.first] = A0;
A0starr[it.first] = A0star; A0starr[it.first] = A0star;
} }
return { A0r, A0starr };
} }
void void
@ -4268,12 +4270,12 @@ DynamicModel::fillTrendComponentModelTableFromOrigModel(StaticModel &static_mode
} }
void void
DynamicModel::fillTrendComponentmodelTableAREC(ExprNode::subst_table_t &diff_subst_table) const DynamicModel::fillTrendComponentmodelTableAREC(const ExprNode::subst_table_t &diff_subst_table) const
{ {
map<string, map<tuple<int, int, int>, expr_t>> ARr, A0r, A0starr; auto ARr = fillAutoregressiveMatrix(false);
ARr = fillAutoregressiveMatrix(false);
trend_component_model_table.setAR(ARr); trend_component_model_table.setAR(ARr);
fillErrorComponentMatrix(A0r, A0starr, diff_subst_table); map<string, map<tuple<int, int, int>, expr_t>> A0r, A0starr;
tie(A0r, A0starr) = fillErrorComponentMatrix(diff_subst_table);
trend_component_model_table.setA0(A0r, A0starr); trend_component_model_table.setA0(A0r, A0starr);
} }
@ -4337,7 +4339,7 @@ DynamicModel::addEquationsForVar()
vector<int> vector<int>
DynamicModel::getUndiffLHSForPac(const string &aux_model_name, DynamicModel::getUndiffLHSForPac(const string &aux_model_name,
ExprNode::subst_table_t &diff_subst_table) const const ExprNode::subst_table_t &diff_subst_table) const
{ {
vector<expr_t> lhs_expr_t = trend_component_model_table.getLhsExprT(aux_model_name); vector<expr_t> lhs_expr_t = trend_component_model_table.getLhsExprT(aux_model_name);
vector<int> lhs = trend_component_model_table.getLhs(aux_model_name); vector<int> lhs = trend_component_model_table.getLhs(aux_model_name);
@ -4404,9 +4406,11 @@ DynamicModel::getUndiffLHSForPac(const string &aux_model_name,
return lhs; return lhs;
} }
void map<pair<string, string>, pair<string, int>>
DynamicModel::walkPacParameters(const string &name, map<pair<string, string>, pair<string, int>> &eqtag_and_lag) DynamicModel::walkPacParameters(const string &name)
{ {
map<pair<string, string>, pair<string, int>> eqtag_and_lag;
int i = 0; int i = 0;
for (auto & equation : equations) for (auto & equation : equations)
{ {
@ -4507,6 +4511,7 @@ DynamicModel::walkPacParameters(const string &name, map<pair<string, string>, pa
eqtag_and_lag[{name, eqtag}] = {eq, 0}; eqtag_and_lag[{name, eqtag}] = {eq, 0};
} }
} }
return eqtag_and_lag;
} }
void void
@ -6212,9 +6217,10 @@ DynamicModel::substituteAdl()
equation = dynamic_cast<BinaryOpNode *>(equation->substituteAdl()); equation = dynamic_cast<BinaryOpNode *>(equation->substituteAdl());
} }
void vector<int>
DynamicModel::getEquationNumbersFromTags(vector<int> &eqnumbers, set<string> &eqtags) const DynamicModel::getEquationNumbersFromTags(const set<string> &eqtags) const
{ {
vector<int> eqnumbers;
for (auto & eqtag : eqtags) for (auto & eqtag : eqtags)
for (const auto & equation_tag : equation_tags) for (const auto & equation_tag : equation_tags)
if (equation_tag.second.first == "name" if (equation_tag.second.first == "name"
@ -6223,6 +6229,7 @@ DynamicModel::getEquationNumbersFromTags(vector<int> &eqnumbers, set<string> &eq
eqnumbers.push_back(equation_tag.first); eqnumbers.push_back(equation_tag.first);
break; break;
} }
return eqnumbers;
} }
void void
@ -6238,26 +6245,28 @@ DynamicModel::findPacExpectationEquationNumbers(vector<int> &eqnumbers) const
} }
} }
void pair<diff_table_t, ExprNode::subst_table_t>
DynamicModel::substituteUnaryOps(StaticModel &static_model, diff_table_t &nodes, ExprNode::subst_table_t &subst_table) DynamicModel::substituteUnaryOps(StaticModel &static_model)
{ {
vector<int> eqnumbers(equations.size()); vector<int> eqnumbers(equations.size());
iota(eqnumbers.begin(), eqnumbers.end(), 0); iota(eqnumbers.begin(), eqnumbers.end(), 0);
substituteUnaryOps(static_model, nodes, subst_table, eqnumbers); return substituteUnaryOps(static_model, eqnumbers);
} }
void pair<diff_table_t, ExprNode::subst_table_t>
DynamicModel::substituteUnaryOps(StaticModel &static_model, diff_table_t &nodes, ExprNode::subst_table_t &subst_table, set<string> &var_model_eqtags) DynamicModel::substituteUnaryOps(StaticModel &static_model, const set<string> &var_model_eqtags)
{ {
vector<int> eqnumbers; vector<int> eqnumbers = getEquationNumbersFromTags(var_model_eqtags);
getEquationNumbersFromTags(eqnumbers, var_model_eqtags);
findPacExpectationEquationNumbers(eqnumbers); findPacExpectationEquationNumbers(eqnumbers);
substituteUnaryOps(static_model, nodes, subst_table, eqnumbers); return substituteUnaryOps(static_model, eqnumbers);
} }
void pair<diff_table_t, ExprNode::subst_table_t>
DynamicModel::substituteUnaryOps(StaticModel &static_model, diff_table_t &nodes, ExprNode::subst_table_t &subst_table, vector<int> &eqnumbers) DynamicModel::substituteUnaryOps(StaticModel &static_model, const vector<int> &eqnumbers)
{ {
diff_table_t nodes;
ExprNode::subst_table_t subst_table;
// Find matching unary ops that may be outside of diffs (i.e., those with different lags) // Find matching unary ops that may be outside of diffs (i.e., those with different lags)
set<int> used_local_vars; set<int> used_local_vars;
for (int eqnumber : eqnumbers) for (int eqnumber : eqnumbers)
@ -6293,11 +6302,16 @@ DynamicModel::substituteUnaryOps(StaticModel &static_model, diff_table_t &nodes,
if (subst_table.size() > 0) if (subst_table.size() > 0)
cout << "Substitution of Unary Ops: added " << neweqs.size() << " auxiliary variables and equations." << endl; cout << "Substitution of Unary Ops: added " << neweqs.size() << " auxiliary variables and equations." << endl;
return { nodes, subst_table };
} }
void pair<diff_table_t, ExprNode::subst_table_t>
DynamicModel::substituteDiff(StaticModel &static_model, diff_table_t &diff_table, ExprNode::subst_table_t &diff_subst_table, vector<expr_t> &pac_growth) DynamicModel::substituteDiff(StaticModel &static_model, vector<expr_t> &pac_growth)
{ {
diff_table_t diff_table;
ExprNode::subst_table_t diff_subst_table;
set<int> used_local_vars; set<int> used_local_vars;
for (const auto & equation : equations) for (const auto & equation : equations)
equation->collectVariables(SymbolType::modelLocalVariable, used_local_vars); equation->collectVariables(SymbolType::modelLocalVariable, used_local_vars);
@ -6359,6 +6373,8 @@ DynamicModel::substituteDiff(StaticModel &static_model, diff_table_t &diff_table
if (diff_subst_table.size() > 0) if (diff_subst_table.size() > 0)
cout << "Substitution of Diff operator: added " << neweqs.size() << " auxiliary variables and equations." << endl; cout << "Substitution of Diff operator: added " << neweqs.size() << " auxiliary variables and equations." << endl;
return { diff_table, diff_subst_table };
} }
void void

View File

@ -251,7 +251,7 @@ private:
//! Create a legacy *_dynamic.m file for Matlab/Octave not yet using the temporary terms array interface //! Create a legacy *_dynamic.m file for Matlab/Octave not yet using the temporary terms array interface
void writeDynamicMatlabCompatLayer(const string &basename) const; void writeDynamicMatlabCompatLayer(const string &basename) const;
void getEquationNumbersFromTags(vector<int> &eqnumber, set<string> &eqtags) const; vector<int> getEquationNumbersFromTags(const set<string> &eqtags) const;
void findPacExpectationEquationNumbers(vector<int> &eqnumber) const; void findPacExpectationEquationNumbers(vector<int> &eqnumber) const;
@ -323,12 +323,13 @@ public:
map<string, map<tuple<int, int, int>, expr_t>> fillAutoregressiveMatrix(bool is_var) const; map<string, map<tuple<int, int, int>, expr_t>> fillAutoregressiveMatrix(bool is_var) const;
//! Fill Error Component Matrix for trend_component_model //! 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; /*! Returns a pair (A0r, A0starr) */
pair<map<string, map<tuple<int, int, int>, expr_t>>, map<string, map<tuple<int, int, int>, expr_t>>> fillErrorComponentMatrix(const ExprNode::subst_table_t &diff_subst_table) const;
//! Fill the Trend Component Model Table //! Fill the Trend Component Model Table
void fillTrendComponentModelTable() const; void fillTrendComponentModelTable() const;
void fillTrendComponentModelTableFromOrigModel(StaticModel &static_model) const; void fillTrendComponentModelTableFromOrigModel(StaticModel &static_model) const;
void fillTrendComponentmodelTableAREC(ExprNode::subst_table_t &diff_subst_table) const; void fillTrendComponentmodelTableAREC(const ExprNode::subst_table_t &diff_subst_table) const;
//! Fill the Var Model Table //! Fill the Var Model Table
void fillVarModelTable() const; void fillVarModelTable() const;
@ -344,7 +345,7 @@ public:
void addEquationsForVar(); void addEquationsForVar();
//! Get Pac equation parameter info //! Get Pac equation parameter info
void walkPacParameters(const string &name, map<pair<string, string>, pair<string, int>> &eqtag_and_lag); map<pair<string, string>, pair<string, int>> walkPacParameters(const string &name);
//! Add var_model info to pac_expectation nodes //! Add var_model info to pac_expectation nodes
void fillPacModelInfo(const string &pac_model_name, void fillPacModelInfo(const string &pac_model_name,
vector<int> lhs, vector<int> lhs,
@ -442,16 +443,16 @@ public:
void substituteAdl(); void substituteAdl();
//! Creates aux vars for all unary operators //! Creates aux vars for all unary operators
void substituteUnaryOps(StaticModel &static_model, diff_table_t &nodes, ExprNode::subst_table_t &subst_table); pair<diff_table_t, ExprNode::subst_table_t> substituteUnaryOps(StaticModel &static_model);
//! Creates aux vars for certain unary operators: originally implemented for support of VARs //! Creates aux vars for certain unary operators: originally implemented for support of VARs
void substituteUnaryOps(StaticModel &static_model, diff_table_t &nodes, ExprNode::subst_table_t &subst_table, set<string> &eq_tags); pair<diff_table_t, ExprNode::subst_table_t> substituteUnaryOps(StaticModel &static_model, const set<string> &eq_tags);
//! Creates aux vars for certain unary operators: originally implemented for support of VARs //! Creates aux vars for certain unary operators: originally implemented for support of VARs
void substituteUnaryOps(StaticModel &static_model, diff_table_t &nodes, ExprNode::subst_table_t &subst_table, vector<int> &eqnumbers); pair<diff_table_t, ExprNode::subst_table_t> substituteUnaryOps(StaticModel &static_model, const vector<int> &eqnumbers);
//! Substitutes diff operator //! Substitutes diff operator
void substituteDiff(StaticModel &static_model, diff_table_t &diff_table, ExprNode::subst_table_t &diff_subst_table, vector<expr_t> &pac_growth); pair<diff_table_t, ExprNode::subst_table_t> substituteDiff(StaticModel &static_model, vector<expr_t> &pac_growth);
//! Substitute VarExpectation operators //! Substitute VarExpectation operators
void substituteVarExpectation(const map<string, expr_t> &subst_table); void substituteVarExpectation(const map<string, expr_t> &subst_table);
@ -498,7 +499,7 @@ public:
//! Table to undiff LHS variables for pac vector z //! Table to undiff LHS variables for pac vector z
vector<int> getUndiffLHSForPac(const string &aux_model_name, vector<int> getUndiffLHSForPac(const string &aux_model_name,
ExprNode::subst_table_t &diff_subst_table) const; const ExprNode::subst_table_t &diff_subst_table) const;
//! Transforms the model by replacing trend variables with a 1 //! Transforms the model by replacing trend variables with a 1
void removeTrendVariableFromEquations(); void removeTrendVariableFromEquations();

View File

@ -409,15 +409,15 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const
diff_table_t unary_ops_nodes; diff_table_t unary_ops_nodes;
ExprNode::subst_table_t unary_ops_subst_table; ExprNode::subst_table_t unary_ops_subst_table;
if (transform_unary_ops) if (transform_unary_ops)
dynamic_model.substituteUnaryOps(diff_static_model, unary_ops_nodes, unary_ops_subst_table); tie(unary_ops_nodes, unary_ops_subst_table) = dynamic_model.substituteUnaryOps(diff_static_model);
else else
// substitute only those unary ops that appear in auxiliary model equations // substitute only those unary ops that appear in auxiliary model equations
dynamic_model.substituteUnaryOps(diff_static_model, unary_ops_nodes, unary_ops_subst_table, eqtags); tie(unary_ops_nodes, unary_ops_subst_table) = dynamic_model.substituteUnaryOps(diff_static_model, eqtags);
// Create auxiliary variable and equations for Diff operators // Create auxiliary variable and equations for Diff operators
diff_table_t diff_table; diff_table_t diff_table;
ExprNode::subst_table_t diff_subst_table; ExprNode::subst_table_t diff_subst_table;
dynamic_model.substituteDiff(diff_static_model, diff_table, diff_subst_table, pac_growth); tie(diff_table, diff_subst_table) = dynamic_model.substituteDiff(diff_static_model, pac_growth);
// Fill Trend Component Model Table // Fill Trend Component Model Table
dynamic_model.fillTrendComponentModelTable(); dynamic_model.fillTrendComponentModelTable();
@ -463,8 +463,7 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const
cerr << "Error: aux_model_name not recognized as VAR model or Trend Component model" << endl; cerr << "Error: aux_model_name not recognized as VAR model or Trend Component model" << endl;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
map<pair<string, string>, pair<string, int>> eqtag_and_lag; auto eqtag_and_lag = dynamic_model.walkPacParameters(pms->name);
dynamic_model.walkPacParameters(pms->name, eqtag_and_lag);
original_model.getPacMaxLag(pms->name, eqtag_and_lag); original_model.getPacMaxLag(pms->name, eqtag_and_lag);
if (pms->aux_model_name == "") if (pms->aux_model_name == "")
dynamic_model.addPacModelConsistentExpectationEquation(pms->name, symbol_table.getID(pms->discount), dynamic_model.addPacModelConsistentExpectationEquation(pms->name, symbol_table.getID(pms->discount),