diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index 4178c44738eefd91a9a85f44aac45e58e4bc0b3a..fe4d40893e6c5dd422852b36bd5d6c0131d696cc 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -2460,75 +2460,13 @@ DynamicModel::writeDynamicFile(const string &basename, bool use_dll, const strin else // MATLAB/Octave writeSparseModelMFiles<true>(basename); - writeSetAuxiliaryVariables(basename, julia); + writeSetAuxiliaryVariablesFile<true>(basename, julia); // Support for model debugging if (!julia) writeDebugModelMFiles<true>(basename); } -void -DynamicModel::writeSetAuxiliaryVariables(const string &basename, bool julia) const -{ - ostringstream output_func_body; - writeAuxVarRecursiveDefinitions(output_func_body, julia ? ExprNodeOutputType::juliaTimeDataFrame - : ExprNodeOutputType::matlabDseries); - - if (output_func_body.str().empty()) - return; - - string func_name = julia ? "dynamic_set_auxiliary_series!" : "dynamic_set_auxiliary_series"; - string comment = julia ? "#" : "%"; - - stringstream output; - output << "function "; - if (!julia) - output << "ds = "; - output << func_name + "(ds, params)" << endl - << comment << endl - << comment << " Status : Computes Auxiliary variables of the " << modelClassName() << " and returns a dseries" << endl - << comment << endl - << comment << " Warning : this file is generated automatically by Dynare" << endl - << comment << " from model file (.mod)" << endl << endl; - if (julia) - output << "@inbounds begin" << endl; - output << output_func_body.str() - << "end" << endl; - if (julia) - output << "end" << endl; - - if (julia) - writeToFileIfModified(output, filesystem::path{basename} / "model" / "julia" / "DynamicSetAuxiliarySeries.jl"); - else - { - /* Calling writeToFileIfModified() is useless here since we write inside - a subdirectory deleted at each preprocessor run. */ - filesystem::path filename {packageDir(basename) / (func_name + ".m")}; - ofstream output_file{filename, ios::out | ios::binary}; - if (!output_file.is_open()) - { - cerr << "ERROR: Can't open file " << filename.string() << " for writing" << endl; - exit(EXIT_FAILURE); - } - output_file << output.str(); - output_file.close(); - } -} - -void -DynamicModel::writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputType output_type) const -{ - deriv_node_temp_terms_t tef_terms; - for (auto aux_eq : aux_equations) - if (aux_eq->containsExternalFunction()) - aux_eq->writeExternalFunctionOutput(output, output_type, {}, {}, tef_terms); - for (auto aux_eq : aux_equations) - { - aux_eq->writeOutput(output, output_type, {}, {}, tef_terms); - output << ";" << endl; - } -} - void DynamicModel::clearEquations() { diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh index 4bce7c3d63d3a06f940274ffe48c960829c9a62c..7e53abb52b222bf41dfacacbebd55f26eaf57940 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -116,9 +116,6 @@ private: //! Writes the code of the model in virtual machine bytecode void writeDynamicBytecode(const string &basename) const; - void writeSetAuxiliaryVariables(const string &basename, bool julia) const; - void writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputType output_type) const; - // Write the block structure of the model in the driver file void writeBlockDriverOutput(ostream &output) const; diff --git a/src/ModelTree.cc b/src/ModelTree.cc index 27efe7006ecdd41b04688ad35c82aa7c741f0cd1..408952eb8c53fcd950d1ad1e8d6dd897b2689a98 100644 --- a/src/ModelTree.cc +++ b/src/ModelTree.cc @@ -1978,3 +1978,17 @@ ModelTree::computeCSCColPtr(const SparseColumnMajorOrderMatrix &matrix, int ncol } return colptr; } + +void +ModelTree::writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputType output_type) const +{ + deriv_node_temp_terms_t tef_terms; + for (auto aux_equation : aux_equations) + if (aux_equation->containsExternalFunction()) + aux_equation->writeExternalFunctionOutput(output, output_type, {}, {}, tef_terms); + for (auto aux_equation : aux_equations) + { + aux_equation->writeOutput(output, output_type, {}, {}, tef_terms); + output << ";" << endl; + } +} diff --git a/src/ModelTree.hh b/src/ModelTree.hh index 5682cf08ade2fd9fb6c813f5142878963417df72..7098c0d6f1ab6293a95bc390ad9ccd17ba09d390 100644 --- a/src/ModelTree.hh +++ b/src/ModelTree.hh @@ -396,6 +396,10 @@ protected: template<bool dynamic> void writeDebugModelMFiles(const string &basename) const; + // Write the file that sets auxiliary variables given the original variables + template<bool dynamic> + void writeSetAuxiliaryVariablesFile(const string &basename, bool julia) const; + private: //! Sparse matrix of double to store the values of the static Jacobian /*! First index is equation number, second index is endogenous type specific ID */ @@ -633,6 +637,9 @@ public: // Waits until the MEX compilation queue is empty static void waitForMEXCompilationWorkers(); + // Write the definitions of the auxiliary variables (assumed to be in recursive order) + void writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputType output_type) const; + //! Returns the vector of non-zero derivative counts const vector<int> & getNNZDerivatives() const @@ -2975,3 +2982,64 @@ ModelTree::writeDebugModelMFiles(const string &basename) const output.close(); } + +template<bool dynamic> +void +ModelTree::writeSetAuxiliaryVariablesFile(const string &basename, bool julia) const +{ + const auto output_type { julia ? (dynamic ? ExprNodeOutputType::juliaTimeDataFrame : ExprNodeOutputType::juliaStaticModel) + : (dynamic ? ExprNodeOutputType::matlabDseries : ExprNodeOutputType::matlabStaticModel) }; + + ostringstream output_func_body; + writeAuxVarRecursiveDefinitions(output_func_body, output_type); + + if (output_func_body.str().empty()) + return; + + string func_name { dynamic ? "dynamic_set_auxiliary_series" : "set_auxiliary_variables" }; + if (julia) + func_name.push_back('!'); + const char comment {julia ? '#' : '%'}; + + stringstream output; + output << "function "; + if (!julia) + { + if constexpr(dynamic) + output << "ds = "; + else + output << "y = "; + } + output << func_name + "("; + if constexpr(dynamic) + output << "ds"; + else + output << "y, x"; + output << ", params)" << endl + << comment << endl + << comment << " Computes auxiliary variables of the " << modelClassName() << endl + << comment << endl; + if (julia) + output << "@inbounds begin" << endl; + output << output_func_body.str() + << "end" << endl; + if (julia) + output << "end" << endl; + + if (julia) + writeToFileIfModified(output, filesystem::path{basename} / "model" / "julia" / (dynamic ? "DynamicSetAuxiliarySeries.jl" : "SetAuxiliaryVariables.jl")); + else + { + /* Calling writeToFileIfModified() is useless here since we write inside + a subdirectory deleted at each preprocessor run. */ + filesystem::path filename {packageDir(basename) / (func_name + ".m")}; + ofstream output_file{filename, ios::out | ios::binary}; + if (!output_file.is_open()) + { + cerr << "ERROR: Can't open file " << filename.string() << " for writing" << endl; + exit(EXIT_FAILURE); + } + output_file << output.str(); + output_file.close(); + } +} diff --git a/src/StaticModel.cc b/src/StaticModel.cc index affe3c51bccb26bd0cad3124fada20cdf39a91fe..e42c4df1b34b256aa132ab707d1b8876f164ae7a 100644 --- a/src/StaticModel.cc +++ b/src/StaticModel.cc @@ -488,7 +488,7 @@ StaticModel::writeStaticFile(const string &basename, bool use_dll, const string else // MATLAB/Octave writeSparseModelMFiles<false>(basename); - writeSetAuxiliaryVariables(basename, julia); + writeSetAuxiliaryVariablesFile<false>(basename, julia); // Support for model debugging if (!julia) @@ -696,68 +696,6 @@ StaticModel::writeAuxVarInitval(ostream &output, ExprNodeOutputType output_type) } } -void -StaticModel::writeSetAuxiliaryVariables(const string &basename, bool julia) const -{ - ostringstream output_func_body; - ExprNodeOutputType output_type = julia ? ExprNodeOutputType::juliaStaticModel : ExprNodeOutputType::matlabStaticModel; - writeAuxVarRecursiveDefinitions(output_func_body, output_type); - - if (output_func_body.str().empty()) - return; - - string func_name = julia ? "set_auxiliary_variables!" : "set_auxiliary_variables"; - string comment = julia ? "#" : "%"; - - stringstream output; - output << "function "; - if (!julia) - output << "y = "; - output << func_name << "(y, x, params)" << endl - << comment << endl - << comment << " Status : Computes Auxiliary variables of the " << modelClassName() << endl - << comment << endl - << comment << " Warning : this file is generated automatically by Dynare" << endl - << comment << " from model file (.mod)" << endl << endl; - if (julia) - output << "@inbounds begin" << endl; - output << output_func_body.str() - << "end" << endl; - if (julia) - output << "end" << endl; - - if (julia) - writeToFileIfModified(output, filesystem::path{basename} / "model" / "julia" / "SetAuxiliaryVariables.jl"); - else - { - /* Calling writeToFileIfModified() is useless here since we write inside - a subdirectory deleted at each preprocessor run. */ - filesystem::path filename {packageDir(basename) / (func_name + ".m")}; - ofstream output_file{filename, ios::out | ios::binary}; - if (!output_file.is_open()) - { - cerr << "ERROR: Can't open file " << filename.string() << " for writing" << endl; - exit(EXIT_FAILURE); - } - output_file << output.str(); - output_file.close(); - } -} - -void -StaticModel::writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputType output_type) const -{ - deriv_node_temp_terms_t tef_terms; - for (auto aux_equation : aux_equations) - if (dynamic_cast<ExprNode *>(aux_equation)->containsExternalFunction()) - dynamic_cast<ExprNode *>(aux_equation)->writeExternalFunctionOutput(output, output_type, {}, {}, tef_terms); - for (auto aux_equation : aux_equations) - { - aux_equation->writeOutput(output, output_type, {}, {}, tef_terms); - output << ";" << endl; - } -} - void StaticModel::writeLatexAuxVarRecursiveDefinitions(ostream &output) const { diff --git a/src/StaticModel.hh b/src/StaticModel.hh index 96f10d3a6562944f30b2232b2ed3a2526c66ea92..5e98f28f0db2b67e6b901ef19dd62df7d142e049 100644 --- a/src/StaticModel.hh +++ b/src/StaticModel.hh @@ -169,9 +169,6 @@ public: //! Writes initializations in oo_.steady_state or steady state file for the auxiliary variables void writeAuxVarInitval(ostream &output, ExprNodeOutputType output_type) const; - //! Writes definition of the auxiliary variables in a .m or .jl file - void writeSetAuxiliaryVariables(const string &basename, bool julia) const; - void writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputType output_type) const; void writeLatexAuxVarRecursiveDefinitions(ostream &output) const; void writeJsonAuxVarRecursiveDefinitions(ostream &output) const;