From 2c6fa34a1fe56697372c276fa55bd089d79f5196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org> Date: Wed, 11 Sep 2019 15:59:23 +0200 Subject: [PATCH] C++17: use structured bindings instead of std::tie whenever possible --- src/ComputingTasks.cc | 5 +-- src/DynamicModel.cc | 56 +++++++++++----------------------- src/ExprNode.cc | 11 ++----- src/ModFile.cc | 4 +-- src/ModelTree.cc | 3 +- src/NumericalInitialization.cc | 10 ++---- src/StaticModel.cc | 44 ++++++++------------------ src/SubModel.cc | 12 +++----- 8 files changed, 42 insertions(+), 103 deletions(-) diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc index 6238649c..5653b493 100644 --- a/src/ComputingTasks.cc +++ b/src/ComputingTasks.cc @@ -333,12 +333,9 @@ PacModelStatement::writeOutput(ostream &output, const string &basename, bool min << "M_.pac." << name << ".growth_type = repmat({''}, " << nlc << ", 1);" << endl << "M_.pac." << name << ".growth_part_str = repmat({''}, " << nlc << ", 1);" << endl; int i = 0; - for (auto & it : growth_info) + for (auto [growth_symb_id, growth_lag, param_id, constant] : growth_info) { i++; - int growth_symb_id, growth_lag, param_id = -1; - double constant = 0; - tie(growth_symb_id, growth_lag, param_id, constant) = it; string growth_type; switch (symbol_table.getType(growth_symb_id)) { diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index 902bf482..c84750bf 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -2502,8 +2502,7 @@ DynamicModel::writeDynamicModel(const string &basename, ostream &DynamicOutput, for (const auto & first_derivative : derivatives[1]) { - int eq, var; - tie(eq, var) = vectorToTuple<2>(first_derivative.first); + auto [eq, var] = vectorToTuple<2>(first_derivative.first); expr_t d1 = first_derivative.second; jacobianHelper(d_output[1], eq, getDynJacobianCol(var), output_type); @@ -3614,12 +3613,7 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de for (auto & pit : pac_equation_info) { - pair<int, int> lhs_pac_var; - int optim_share_index; - set<pair<int, pair<int, int>>> ar_params_and_vars; - pair<int, vector<tuple<int, bool, int>>> ec_params_and_vars; - vector<tuple<int, int, int, double>> non_optim_vars_params_and_constants, additive_vars_params_and_constants, optim_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, optim_additive_vars_params_and_constants) = pit.second; + auto [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, optim_additive_vars_params_and_constants] = pit.second; string substruct = pit.first.first + ".equations." + pit.first.second + "."; output << modstruct << "pac." << substruct << "lhs_var = " @@ -4296,8 +4290,7 @@ DynamicModel::fillTrendComponentmodelTableAREC(const ExprNode::subst_table_t &di { auto ARr = fillAutoregressiveMatrix(false); trend_component_model_table.setAR(ARr); - map<string, map<tuple<int, int, int>, expr_t>> A0r, A0starr; - tie(A0r, A0starr) = fillErrorComponentMatrix(diff_subst_table); + auto [A0r, A0starr] = fillErrorComponentMatrix(diff_subst_table); trend_component_model_table.setA0(A0r, A0starr); } @@ -4443,8 +4436,6 @@ DynamicModel::walkPacParameters(const string &name) if (equation->containsPacExpectation()) { - int optim_share_index; - expr_t optim_part, non_optim_part, additive_part; set<pair<int, int>> lhss; equation->arg1->collectDynamicVariables(SymbolType::endogenous, lhss); lhs = *(lhss.begin()); @@ -4465,7 +4456,7 @@ DynamicModel::walkPacParameters(const string &name) cerr << "Pac equation in incorrect format" << endl; exit(EXIT_FAILURE); } - tie(optim_share_index, optim_part, non_optim_part, additive_part) = + auto [optim_share_index, optim_part, non_optim_part, additive_part] = arg2->getPacOptimizingShareAndExprNodes(lhs_symb_id, lhs_orig_symb_id); if (optim_part == nullptr) @@ -5149,8 +5140,7 @@ DynamicModel::computeChainRuleJacobian(blocks_derivatives_t &blocks_endo_derivat for (const auto &it : Derivatives) { int Deriv_type = it.second; - int lag, eq, var, eqr, varr; - tie(lag, eq, var, eqr, varr) = it.first; + auto [lag, eq, var, eqr, varr] = it.first; if (Deriv_type == 0) first_chain_rule_derivatives[{ eqr, varr, lag }] = derivatives[1][{ eqr, getDerivID(symbol_table.getID(SymbolType::endogenous, varr), lag) }]; else if (Deriv_type == 1) @@ -5833,8 +5823,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con for (const auto & residuals_params_derivative : params_derivatives.find({ 0, 1 })->second) { - int eq, param; - tie(eq, param) = vectorToTuple<2>(residuals_params_derivative.first); + auto [eq, param] = vectorToTuple<2>(residuals_params_derivative.first); expr_t d1 = residuals_params_derivative.second; int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1; @@ -5847,8 +5836,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con for (const auto & jacobian_params_derivative : params_derivatives.find({ 1, 1 })->second) { - int eq, var, param; - tie(eq, var, param) = vectorToTuple<3>(jacobian_params_derivative.first); + auto [eq, var, param] = vectorToTuple<3>(jacobian_params_derivative.first); expr_t d2 = jacobian_params_derivative.second; int var_col = getDynJacobianCol(var) + 1; @@ -5863,8 +5851,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con int i = 1; for (const auto &it : params_derivatives.find({ 0, 2 })->second) { - int eq, param1, param2; - tie(eq, param1, param2) = vectorToTuple<3>(it.first); + auto [eq, param1, param2] = vectorToTuple<3>(it.first); expr_t d2 = it.second; int param1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param1)) + 1; @@ -5903,8 +5890,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con i = 1; for (const auto &it : params_derivatives.find({ 1, 2 })->second) { - int eq, var, param1, param2; - tie(eq, var, param1, param2) = vectorToTuple<4>(it.first); + auto [eq, var, param1, param2] = vectorToTuple<4>(it.first); expr_t d2 = it.second; int var_col = getDynJacobianCol(var) + 1; @@ -5948,8 +5934,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con i = 1; for (const auto &it : params_derivatives.find({ 2, 1 })->second) { - int eq, var1, var2, param; - tie(eq, var1, var2, param) = vectorToTuple<4>(it.first); + auto [eq, var1, var2, param] = vectorToTuple<4>(it.first); expr_t d2 = it.second; int var1_col = getDynJacobianCol(var1) + 1; @@ -5993,8 +5978,7 @@ DynamicModel::writeParamsDerivativesFile(const string &basename, bool julia) con i = 1; for (const auto &it : params_derivatives.find({ 3, 1 })->second) { - int eq, var1, var2, var3, param; - tie(eq, var1, var2, var3, param) = vectorToTuple<5>(it.first); + auto [eq, var1, var2, var3, param] = vectorToTuple<5>(it.first); expr_t d2 = it.second; int var1_col = getDynJacobianCol(var1) + 1; @@ -7015,8 +6999,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails) if (it != rp.begin()) rp_output << ", "; - int eq, param; - tie(eq, param) = vectorToTuple<2>(it->first); + auto [eq, param] = vectorToTuple<2>(it->first); expr_t d1 = it->second; int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1; @@ -7048,8 +7031,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails) if (it != gp.begin()) gp_output << ", "; - int eq, var, param; - tie(eq, var, param) = vectorToTuple<3>(it->first); + auto [eq, var, param] = vectorToTuple<3>(it->first); expr_t d2 = it->second; int var_col = getDynJacobianCol(var) + 1; @@ -7085,8 +7067,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails) if (it != rpp.begin()) rpp_output << ", "; - int eq, param1, param2; - tie(eq, param1, param2) = vectorToTuple<3>(it->first); + auto [eq, param1, param2] = vectorToTuple<3>(it->first); expr_t d2 = it->second; int param1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param1)) + 1; @@ -7121,8 +7102,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails) if (it != gpp.begin()) gpp_output << ", "; - int eq, var, param1, param2; - tie(eq, var, param1, param2) = vectorToTuple<4>(it->first); + auto [eq, var, param1, param2] = vectorToTuple<4>(it->first); expr_t d2 = it->second; int var_col = getDynJacobianCol(var) + 1; @@ -7162,8 +7142,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails) if (it != hp.begin()) hp_output << ", "; - int eq, var1, var2, param; - tie(eq, var1, var2, param) = vectorToTuple<4>(it->first); + auto [eq, var1, var2, param] = vectorToTuple<4>(it->first); expr_t d2 = it->second; int var1_col = getDynJacobianCol(var1) + 1; @@ -7205,8 +7184,7 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails) if (it != g3p.begin()) g3p_output << ", "; - int eq, var1, var2, var3, param; - tie(eq, var1, var2, var3, param) = vectorToTuple<5>(it->first); + auto [eq, var1, var2, var3, param] = vectorToTuple<5>(it->first); expr_t d2 = it->second; int var1_col = getDynJacobianCol(var1) + 1; diff --git a/src/ExprNode.cc b/src/ExprNode.cc index 7ce12364..b35a109e 100644 --- a/src/ExprNode.cc +++ b/src/ExprNode.cc @@ -356,11 +356,8 @@ ExprNode::fillErrorCorrectionRow(int eqn, continue; // Now fill the matrices - for (const auto &t : m.second) + for (auto [var_id, lag, param_id, constant] : m.second) { - int var_id, lag, param_id; - double constant; - tie(var_id, lag, param_id, constant) = t; /* if (lag != -1) { @@ -5746,11 +5743,9 @@ BinaryOpNode::getPacAREC(int lhs_symb_id, int lhs_orig_symb_id, for (auto &t : m.second) get<3>(t) *= it.second; // Update sign of constants - int vid, lag, pidtmp, pid = get<0>(m); - double constant; - for (auto &t : m.second) + int pid = get<0>(m); + for (auto [vid, lag, pidtmp, constant] : m.second) { - tie(vid, lag, pidtmp, constant) = t; if (pid == -1) pid = pidtmp; else diff --git a/src/ModFile.cc b/src/ModFile.cc index f73291ce..e11d5e15 100644 --- a/src/ModFile.cc +++ b/src/ModFile.cc @@ -446,9 +446,7 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs, const 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; - tie(diff_table, diff_subst_table) = dynamic_model.substituteDiff(diff_static_model, pac_growth); + auto [diff_table, diff_subst_table] = dynamic_model.substituteDiff(diff_static_model, pac_growth); // Fill Trend Component Model Table dynamic_model.fillTrendComponentModelTable(); diff --git a/src/ModelTree.cc b/src/ModelTree.cc index 33e5133b..28e8df72 100644 --- a/src/ModelTree.cc +++ b/src/ModelTree.cc @@ -735,8 +735,7 @@ ModelTree::getVariableLeadLagByBlock(const dynamic_jacob_map_t &dynamic_jacobian } for (const auto & it : dynamic_jacobian) { - int lag, j_1, i_1; - tie(lag, j_1, i_1) = it.first; + auto [lag, j_1, i_1] = it.first; if (variable_blck[i_1] == equation_blck[j_1]) { if (lag > variable_lead_lag[i_1].second) diff --git a/src/NumericalInitialization.cc b/src/NumericalInitialization.cc index f9b496a6..02cd90ac 100644 --- a/src/NumericalInitialization.cc +++ b/src/NumericalInitialization.cc @@ -466,12 +466,8 @@ HomotopyStatement::writeOutput(ostream &output, const string &basename, bool min << "%" << endl << "options_.homotopy_values = [];" << endl; - for (const auto & homotopy_value : homotopy_values) + for (auto [symb_id, expression1, expression2] : homotopy_values) { - int symb_id; - expr_t expression1, expression2; - tie(symb_id, expression1, expression2) = homotopy_value; - const SymbolType type = symbol_table.getType(symb_id); const int tsid = symbol_table.getTypeSpecificID(symb_id) + 1; @@ -497,9 +493,7 @@ HomotopyStatement::writeJsonOutput(ostream &output) const if (it != homotopy_values.begin()) output << ", "; - int symb_id; - expr_t expression1, expression2; - tie(symb_id, expression1, expression2) = *it; + auto [symb_id, expression1, expression2] = *it; output << R"({"name": ")" << symbol_table.getName(symb_id) << R"(")" << R"(, "initial_value": ")"; diff --git a/src/StaticModel.cc b/src/StaticModel.cc index db72b53e..2c82876f 100644 --- a/src/StaticModel.cc +++ b/src/StaticModel.cc @@ -177,13 +177,7 @@ StaticModel::StaticModel(const DynamicModel &m) : // If yes, replace it by an equation marked [static] if (is_dynamic_only) { - auto tuple = m.getStaticOnlyEquationsInfo(); - auto static_only_equations = get<0>(tuple); - auto static_only_equations_lineno = get<1>(tuple); - auto static_only_equations_equation_tags = get<2>(tuple); - - // With C++17, rather use structured bindings, as: - //auto [ static_only_equations, static_only_equations_lineno, static_only_equations_equation_tags ] = m.getStaticOnlyEquationsInfo(); + auto [static_only_equations, static_only_equations_lineno, static_only_equations_equation_tags] = m.getStaticOnlyEquationsInfo(); addEquation(static_only_equations[static_only_index]->toStatic(*this), static_only_equations_lineno[static_only_index], static_only_equations_equation_tags[static_only_index]); static_only_index++; @@ -1492,8 +1486,7 @@ StaticModel::writeStaticModel(const string &basename, for (const auto & first_derivative : derivatives[1]) { - int eq, var; - tie(eq, var) = vectorToTuple<2>(first_derivative.first); + auto [eq, var] = vectorToTuple<2>(first_derivative.first); expr_t d1 = first_derivative.second; jacobianHelper(d_output[1], eq, getJacobCol(var), output_type); @@ -2293,8 +2286,7 @@ StaticModel::computeChainRuleJacobian(blocks_derivatives_t &blocks_derivatives) for (const auto &it : Derivatives) { int Deriv_type = it.second; - int lag, eq, var, eqr, varr; - tie(lag, eq, var, eqr, varr) = it.first; + auto [lag, eq, var, eqr, varr] = it.first; if (Deriv_type == 0) first_chain_rule_derivatives[{ eqr, varr, lag }] = derivatives[1][{ eqr, getDerivID(symbol_table.getID(SymbolType::endogenous, varr), lag) }]; else if (Deriv_type == 1) @@ -2513,8 +2505,7 @@ StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) cons for (const auto & residuals_params_derivative : params_derivatives.find({ 0, 1 })->second) { - int eq, param; - tie(eq, param) = vectorToTuple<2>(residuals_params_derivative.first); + auto [eq, param] = vectorToTuple<2>(residuals_params_derivative.first); expr_t d1 = residuals_params_derivative.second; int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1; @@ -2528,8 +2519,7 @@ StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) cons for (const auto & jacobian_params_derivative : params_derivatives.find({ 1, 1 })->second) { - int eq, var, param; - tie(eq, var, param) = vectorToTuple<3>(jacobian_params_derivative.first); + auto [eq, var, param] = vectorToTuple<3>(jacobian_params_derivative.first); expr_t d2 = jacobian_params_derivative.second; int var_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(var)) + 1; @@ -2545,8 +2535,7 @@ StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) cons int i = 1; for (const auto &it : params_derivatives.find({ 0, 2 })->second) { - int eq, param1, param2; - tie(eq, param1, param2) = vectorToTuple<3>(it.first); + auto [eq, param1, param2] = vectorToTuple<3>(it.first); expr_t d2 = it.second; int param1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param1)) + 1; @@ -2585,8 +2574,7 @@ StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) cons i = 1; for (const auto &it : params_derivatives.find({ 1, 2 })->second) { - int eq, var, param1, param2; - tie(eq, var, param1, param2) = vectorToTuple<4>(it.first); + auto [eq, var, param1, param2] = vectorToTuple<4>(it.first); expr_t d2 = it.second; int var_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(var)) + 1; @@ -2630,8 +2618,7 @@ StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) cons i = 1; for (const auto &it : params_derivatives.find({ 2, 1 })->second) { - int eq, var1, var2, param; - tie(eq, var1, var2, param) = vectorToTuple<4>(it.first); + auto [eq, var1, var2, param] = vectorToTuple<4>(it.first); expr_t d2 = it.second; int var1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(var1)) + 1; @@ -2891,8 +2878,7 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails) if (it != rp.begin()) jacobian_output << ", "; - int eq, param; - tie(eq, param) = vectorToTuple<2>(it->first); + auto [eq, param] = vectorToTuple<2>(it->first); expr_t d1 = it->second; int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1; @@ -2924,8 +2910,7 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails) if (it != gp.begin()) hessian_output << ", "; - int eq, var, param; - tie(eq, var, param) = vectorToTuple<3>(it->first); + auto [eq, var, param] = vectorToTuple<3>(it->first); expr_t d2 = it->second; int var_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(var)) + 1; @@ -2959,8 +2944,7 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails) if (it != rpp.begin()) hessian1_output << ", "; - int eq, param1, param2; - tie(eq, param1, param2) = vectorToTuple<3>(it->first); + auto [eq, param1, param2] = vectorToTuple<3>(it->first); expr_t d2 = it->second; int param1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param1)) + 1; @@ -2996,8 +2980,7 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails) if (it != gpp.begin()) third_derivs_output << ", "; - int eq, var, param1, param2; - tie(eq, var, param1, param2) = vectorToTuple<4>(it->first); + auto [eq, var, param1, param2] = vectorToTuple<4>(it->first); expr_t d2 = it->second; int var_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(var)) + 1; @@ -3035,8 +3018,7 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails) if (it != hp.begin()) third_derivs1_output << ", "; - int eq, var1, var2, param; - tie(eq, var1, var2, param) = vectorToTuple<4>(it->first); + auto [eq, var1, var2, param] = vectorToTuple<4>(it->first); expr_t d2 = it->second; int var1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(var1)) + 1; diff --git a/src/SubModel.cc b/src/SubModel.cc index a8e64d1b..b3c79ecb 100644 --- a/src/SubModel.cc +++ b/src/SubModel.cc @@ -352,8 +352,7 @@ TrendComponentModelTable::writeOutput(const string &basename, ostream &output) c << " AR = zeros(" << nontarget_lhs_vec.size() << ", " << nontarget_lhs_vec.size() << ", " << getMaxLag(name) << ");" << endl; for (const auto & it : AR.at(name)) { - int eqn, lag, lhs_symb_id; - tie (eqn, lag, lhs_symb_id) = it.first; + auto [eqn, lag, lhs_symb_id] = it.first; int colidx = static_cast<int>(distance(nontarget_lhs_vec.begin(), find(nontarget_lhs_vec.begin(), nontarget_lhs_vec.end(), lhs_symb_id))); ar_ec_output << " AR(" << eqn + 1 << ", " << colidx + 1 << ", " << lag << ") = "; it.second->writeOutput(ar_ec_output, ExprNodeOutputType::matlabDynamicModel); @@ -369,8 +368,7 @@ TrendComponentModelTable::writeOutput(const string &basename, ostream &output) c << " A0 = zeros(" << nontarget_lhs_vec.size() << ", " << nontarget_lhs_vec.size() << ", " << a0_lag << ");" << endl; for (const auto & it : A0.at(name)) { - int eqn, lag, colidx; - tie (eqn, lag, colidx) = it.first; + auto [eqn, lag, colidx] = it.first; ar_ec_output << " A0(" << eqn + 1 << ", " << colidx + 1 << ", " << lag << ") = "; it.second->writeOutput(ar_ec_output, ExprNodeOutputType::matlabDynamicModel); ar_ec_output << ";" << endl; @@ -385,8 +383,7 @@ TrendComponentModelTable::writeOutput(const string &basename, ostream &output) c << " A0star = zeros(" << nontarget_lhs_vec.size() << ", " << target_lhs_vec.size() << ", " << a0star_lag << ");" << endl; for (const auto & it : A0star.at(name)) { - int eqn, lag, colidx; - tie (eqn, lag, colidx) = it.first; + auto [eqn, lag, colidx] = it.first; ar_ec_output << " A0star(" << eqn + 1 << ", " << colidx + 1 << ", " << lag << ") = "; it.second->writeOutput(ar_ec_output, ExprNodeOutputType::matlabDynamicModel); ar_ec_output << ";" << endl; @@ -525,8 +522,7 @@ VarModelTable::writeOutput(const string &basename, ostream &output) const << " ar = zeros(" << lhs.size() << ", " << lhs.size() << ", " << getMaxLag(name) << ");" << endl; for (const auto & it : AR.at(name)) { - int eqn, lag, lhs_symb_id; - tie (eqn, lag, lhs_symb_id) = it.first; + auto [eqn, lag, lhs_symb_id] = it.first; int colidx = static_cast<int>(distance(lhs.begin(), find(lhs.begin(), lhs.end(), lhs_symb_id))); ar_output << " ar(" << eqn + 1 << ", " << colidx + 1 << ", " << lag << ") = "; it.second->writeOutput(ar_output, ExprNodeOutputType::matlabDynamicModel); -- GitLab