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);
}
void
DynamicModel::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
pair<map<string, map<tuple<int, int, int>, expr_t>>, map<string, map<tuple<int, int, int>, expr_t>>>
DynamicModel::fillErrorComponentMatrix(const 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())
{
int i = 0;
@ -4198,6 +4198,8 @@ DynamicModel::fillErrorComponentMatrix(map<string, map<tuple<int, int, int>, exp
A0r[it.first] = A0;
A0starr[it.first] = A0star;
}
return { A0r, A0starr };
}
void
@ -4268,12 +4270,12 @@ DynamicModel::fillTrendComponentModelTableFromOrigModel(StaticModel &static_mode
}
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;
ARr = fillAutoregressiveMatrix(false);
auto ARr = fillAutoregressiveMatrix(false);
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);
}
@ -4337,7 +4339,7 @@ DynamicModel::addEquationsForVar()
vector<int>
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<int> lhs = trend_component_model_table.getLhs(aux_model_name);
@ -4404,9 +4406,11 @@ DynamicModel::getUndiffLHSForPac(const string &aux_model_name,
return lhs;
}
void
DynamicModel::walkPacParameters(const string &name, map<pair<string, string>, pair<string, int>> &eqtag_and_lag)
map<pair<string, string>, pair<string, int>>
DynamicModel::walkPacParameters(const string &name)
{
map<pair<string, string>, pair<string, int>> eqtag_and_lag;
int i = 0;
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};
}
}
return eqtag_and_lag;
}
void
@ -6212,9 +6217,10 @@ DynamicModel::substituteAdl()
equation = dynamic_cast<BinaryOpNode *>(equation->substituteAdl());
}
void
DynamicModel::getEquationNumbersFromTags(vector<int> &eqnumbers, set<string> &eqtags) const
vector<int>
DynamicModel::getEquationNumbersFromTags(const set<string> &eqtags) const
{
vector<int> eqnumbers;
for (auto & eqtag : eqtags)
for (const auto & equation_tag : equation_tags)
if (equation_tag.second.first == "name"
@ -6223,6 +6229,7 @@ DynamicModel::getEquationNumbersFromTags(vector<int> &eqnumbers, set<string> &eq
eqnumbers.push_back(equation_tag.first);
break;
}
return eqnumbers;
}
void
@ -6238,26 +6245,28 @@ DynamicModel::findPacExpectationEquationNumbers(vector<int> &eqnumbers) const
}
}
void
DynamicModel::substituteUnaryOps(StaticModel &static_model, diff_table_t &nodes, ExprNode::subst_table_t &subst_table)
pair<diff_table_t, ExprNode::subst_table_t>
DynamicModel::substituteUnaryOps(StaticModel &static_model)
{
vector<int> eqnumbers(equations.size());
iota(eqnumbers.begin(), eqnumbers.end(), 0);
substituteUnaryOps(static_model, nodes, subst_table, eqnumbers);
return substituteUnaryOps(static_model, eqnumbers);
}
void
DynamicModel::substituteUnaryOps(StaticModel &static_model, diff_table_t &nodes, ExprNode::subst_table_t &subst_table, set<string> &var_model_eqtags)
pair<diff_table_t, ExprNode::subst_table_t>
DynamicModel::substituteUnaryOps(StaticModel &static_model, const set<string> &var_model_eqtags)
{
vector<int> eqnumbers;
getEquationNumbersFromTags(eqnumbers, var_model_eqtags);
vector<int> eqnumbers = getEquationNumbersFromTags(var_model_eqtags);
findPacExpectationEquationNumbers(eqnumbers);
substituteUnaryOps(static_model, nodes, subst_table, eqnumbers);
return substituteUnaryOps(static_model, eqnumbers);
}
void
DynamicModel::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>
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)
set<int> used_local_vars;
for (int eqnumber : eqnumbers)
@ -6293,11 +6302,16 @@ DynamicModel::substituteUnaryOps(StaticModel &static_model, diff_table_t &nodes,
if (subst_table.size() > 0)
cout << "Substitution of Unary Ops: added " << neweqs.size() << " auxiliary variables and equations." << endl;
return { nodes, subst_table };
}
void
DynamicModel::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>
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;
for (const auto & equation : equations)
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)
cout << "Substitution of Diff operator: added " << neweqs.size() << " auxiliary variables and equations." << endl;
return { diff_table, diff_subst_table };
}
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
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;
@ -323,12 +323,13 @@ public:
map<string, map<tuple<int, int, int>, expr_t>> fillAutoregressiveMatrix(bool is_var) const;
//! 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
void fillTrendComponentModelTable() 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
void fillVarModelTable() const;
@ -344,7 +345,7 @@ public:
void addEquationsForVar();
//! 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
void fillPacModelInfo(const string &pac_model_name,
vector<int> lhs,
@ -442,16 +443,16 @@ public:
void substituteAdl();
//! 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
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
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
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
void substituteVarExpectation(const map<string, expr_t> &subst_table);
@ -498,7 +499,7 @@ public:
//! Table to undiff LHS variables for pac vector z
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
void removeTrendVariableFromEquations();

View File

@ -409,15 +409,15 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const
diff_table_t unary_ops_nodes;
ExprNode::subst_table_t unary_ops_subst_table;
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
// 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
diff_table_t diff_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
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;
exit(EXIT_FAILURE);
}
map<pair<string, string>, pair<string, int>> eqtag_and_lag;
dynamic_model.walkPacParameters(pms->name, eqtag_and_lag);
auto eqtag_and_lag = dynamic_model.walkPacParameters(pms->name);
original_model.getPacMaxLag(pms->name, eqtag_and_lag);
if (pms->aux_model_name == "")
dynamic_model.addPacModelConsistentExpectationEquation(pms->name, symbol_table.getID(pms->discount),