diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index 6f98950228dd7da8baab509b886dcdf1964996f5..5bb97344db584bb0920c41065f2ae4ca347da548 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -3474,11 +3474,9 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de output << "];" << endl; // Write PacExpectationInfo - deriv_node_temp_terms_t tef_terms; - temporary_terms_t temp_terms_empty; for (set<const PacExpectationNode *>::const_iterator it = pac_expectation_info.begin(); it != pac_expectation_info.end(); it++) - (*it)->ExprNode::writeOutput(output, oMatlabDynamicModel, temp_terms_empty, tef_terms); + (*it)->ExprNode::writeOutput(output, oMatlabDynamicModel); } map<pair<int, pair<int, int > >, expr_t> @@ -5967,7 +5965,7 @@ DynamicModel::writeFirstDerivativesC(const string &basename, bool cuda) const mDynamicModelFile << "="; // oCStaticModel makes reference to the static variables // oCDynamicModel makes reference to the dynamic variables - d1->writeOutput(mDynamicModelFile, oCDynamicModel, temporary_terms, tef_terms); + d1->writeOutput(mDynamicModelFile, oCDynamicModel, temporary_terms, {}, tef_terms); mDynamicModelFile << ";" << endl; } @@ -6062,7 +6060,7 @@ DynamicModel::writeFirstDerivativesC_csr(const string &basename, bool cuda) cons << "=" << it->col_nbr << ";" << endl; mDynamicModelFile << "value[" << k << "] = "; // oCstaticModel makes reference to the static variables - it->value->writeOutput(mDynamicModelFile, oCDynamic2Model, temporary_terms, tef_terms); + it->value->writeOutput(mDynamicModelFile, oCDynamic2Model, temporary_terms, {}, tef_terms); mDynamicModelFile << ";" << endl; k++; } @@ -6161,7 +6159,7 @@ DynamicModel::writeSecondDerivativesC_csr(const string &basename, bool cuda) con << "=" << it->col_nbr << ";" << endl; mDynamicModelFile << "value[" << k << "] = "; // oCstaticModel makes reference to the static variables - it->value->writeOutput(mDynamicModelFile, oCStaticModel, temporary_terms, tef_terms); + it->value->writeOutput(mDynamicModelFile, oCStaticModel, temporary_terms, {}, tef_terms); mDynamicModelFile << ";" << endl; k++; } @@ -6293,7 +6291,7 @@ DynamicModel::writeThirdDerivativesC_csr(const string &basename, bool cuda) cons << "=" << it->col_nbr << ";" << endl; mDynamicModelFile << "value[" << k << "] = "; // oCstaticModel makes reference to the static variables - it->value->writeOutput(mDynamicModelFile, oCStaticModel, temporary_terms, tef_terms); + it->value->writeOutput(mDynamicModelFile, oCStaticModel, temporary_terms, {}, tef_terms); mDynamicModelFile << ";" << endl; k++; } diff --git a/src/ExprNode.cc b/src/ExprNode.cc index cc3587a29fbaba46bd7aafcb3b982754692b034b..730297c95100277011e07ece88b36f46d8c59353 100644 --- a/src/ExprNode.cc +++ b/src/ExprNode.cc @@ -185,29 +185,13 @@ ExprNode::normalizeEquation(int var_endo, vector<pair<int, pair<expr_t, expr_t> void ExprNode::writeOutput(ostream &output) const { - writeOutput(output, oMatlabOutsideModel, temporary_terms_t()); + writeOutput(output, oMatlabOutsideModel, {}, {}); } void ExprNode::writeOutput(ostream &output, ExprNodeOutputType output_type) const { - writeOutput(output, output_type, temporary_terms_t()); -} - -void -ExprNode::writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms) const -{ - temporary_terms_idxs_t temporary_terms_idxs; - deriv_node_temp_terms_t tef_terms; - writeOutput(output, output_type, temporary_terms, temporary_terms_idxs, tef_terms); -} - -void -ExprNode::writeOutput(ostream &output, ExprNodeOutputType output_type, - const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const -{ - writeOutput(output, output_type, temporary_terms, {}, tef_terms); + writeOutput(output, output_type, {}, {}); } void @@ -6425,6 +6409,7 @@ AbstractExternalFunctionNode::writeJsonExternalFunctionArguments(ostream &output void AbstractExternalFunctionNode::writePrhs(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, + const temporary_terms_idxs_t &temporary_terms_idxs, deriv_node_temp_terms_t &tef_terms, const string &ending) const { output << "mxArray *prhs"<< ending << "[nrhs"<< ending << "];" << endl; @@ -6433,7 +6418,7 @@ AbstractExternalFunctionNode::writePrhs(ostream &output, ExprNodeOutputType outp it != arguments.end(); it++) { output << "prhs" << ending << "[" << i++ << "] = mxCreateDoubleScalar("; // All external_function arguments are scalars - (*it)->writeOutput(output, output_type, temporary_terms, tef_terms); + (*it)->writeOutput(output, output_type, temporary_terms, temporary_terms_idxs, tef_terms); output << ");" << endl; } } @@ -6669,7 +6654,7 @@ ExternalFunctionNode::writeExternalFunctionOutput(ostream &output, ExprNodeOutpu output << "mxArray *plhs" << ending.str()<< "[nlhs"<< ending.str() << "];" << endl; output << "int nrhs" << ending.str()<< " = " << arguments.size() << ";" << endl; - writePrhs(output, output_type, temporary_terms, tef_terms, ending.str()); + writePrhs(output, output_type, temporary_terms, temporary_terms_idxs, tef_terms, ending.str()); output << "mexCallMATLAB(" << "nlhs" << ending.str() << ", " @@ -7004,7 +6989,7 @@ FirstDerivExternalFunctionNode::writeExternalFunctionOutput(ostream &output, Exp << "double *TEFD_def_" << indx << ";" << endl << "mxArray *plhs" << ending.str() << "[nlhs"<< ending.str() << "];" << endl << "int nrhs" << ending.str() << " = " << arguments.size() << ";" << endl; - writePrhs(output, output_type, temporary_terms, tef_terms, ending.str()); + writePrhs(output, output_type, temporary_terms, temporary_terms_idxs, tef_terms, ending.str()); output << "mexCallMATLAB(" << "nlhs" << ending.str() << ", " @@ -7358,7 +7343,7 @@ SecondDerivExternalFunctionNode::writeExternalFunctionOutput(ostream &output, Ex << "double *TEFDD_def_" << indx << ";" << endl << "mxArray *plhs" << ending.str() << "[nlhs"<< ending.str() << "];" << endl << "int nrhs" << ending.str() << " = " << arguments.size() << ";" << endl; - writePrhs(output, output_type, temporary_terms, tef_terms, ending.str()); + writePrhs(output, output_type, temporary_terms, temporary_terms_idxs, tef_terms, ending.str()); output << "mexCallMATLAB(" << "nlhs" << ending.str() << ", " diff --git a/src/ExprNode.hh b/src/ExprNode.hh index dbd7c72e86cd5a30f2916be69fdbcdfb60a6bf7d..7ec178ebb2231c6469369076a883b8cfde508bb9 100644 --- a/src/ExprNode.hh +++ b/src/ExprNode.hh @@ -226,6 +226,9 @@ class ExprNode \param[in] output the output stream \param[in] output_type the type of output (MATLAB, C, LaTeX...) \param[in] temporary_terms the nodes that are marked as temporary terms + \param[in] a map from temporary_terms to integers indexes (in the + MATLAB or Julia vector of temporary terms); can be empty + when writing C or MATLAB with block decomposition) \param[in,out] tef_terms the set of already written external function nodes */ virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, const temporary_terms_idxs_t &temporary_terms_idxs, deriv_node_temp_terms_t &tef_terms) const = 0; @@ -240,9 +243,7 @@ class ExprNode void writeOutput(ostream &output, ExprNodeOutputType output_type) const; //! Writes output of node, using a Txxx notation for nodes in temporary_terms - void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms) const; void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, const temporary_terms_idxs_t &temporary_terms_idxs) const; - void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; //! Writes output of node in JSON syntax virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const bool isdynamic = true) const = 0; @@ -1145,7 +1146,7 @@ public: virtual bool containsExogenous() const; virtual bool isDiffPresent(void) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; - virtual void writePrhs(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const string &ending) const; + virtual void writePrhs(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, const temporary_terms_idxs_t &temporary_terms_idxs, deriv_node_temp_terms_t &tef_terms, const string &ending) const; virtual expr_t replaceTrendVar() const; virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const; virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const = 0; diff --git a/src/ModelTree.cc b/src/ModelTree.cc index cb52be73656310063e96da7c00d943d7289ec2ef..a0e40e56bcb093617465bde6b8761af6aacc2b5f 100644 --- a/src/ModelTree.cc +++ b/src/ModelTree.cc @@ -1027,7 +1027,7 @@ ModelTree::writeDerivative(ostream &output, int eq, int symb_id, int lag, { first_derivatives_t::const_iterator it = first_derivatives.find(make_pair(eq, getDerivID(symb_id, lag))); if (it != first_derivatives.end()) - (it->second)->writeOutput(output, output_type, temporary_terms); + (it->second)->writeOutput(output, output_type, temporary_terms, {}); else output << 0; } diff --git a/src/StaticModel.cc b/src/StaticModel.cc index 151f0d8a178582665675fee1b91584b116113362..46fb73e8d7ccfefac61c8d9bf1b685b3bc3d6c19 100644 --- a/src/StaticModel.cc +++ b/src/StaticModel.cc @@ -2435,15 +2435,12 @@ void StaticModel::writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputType output_type) const { deriv_node_temp_terms_t tef_terms; - temporary_terms_t temporary_terms; - temporary_terms_idxs_t temporary_terms_idxs; for (int i = 0; i < (int) aux_equations.size(); i++) if (dynamic_cast<ExprNode *>(aux_equations[i])->containsExternalFunction()) - dynamic_cast<ExprNode *>(aux_equations[i])->writeExternalFunctionOutput(output, oMatlabStaticModel, - temporary_terms, temporary_terms_idxs, tef_terms); + dynamic_cast<ExprNode *>(aux_equations[i])->writeExternalFunctionOutput(output, oMatlabStaticModel, {}, {}, tef_terms); for (int i = 0; i < (int) aux_equations.size(); i++) { - dynamic_cast<ExprNode *>(aux_equations[i]->substituteStaticAuxiliaryDefinition())->writeOutput(output, output_type, temporary_terms, tef_terms); + dynamic_cast<ExprNode *>(aux_equations[i]->substituteStaticAuxiliaryDefinition())->writeOutput(output, output_type); output << ";" << endl; } }