diff --git a/src/StaticModel.cc b/src/StaticModel.cc index 1d485ac41dfc204f6db5e4c94c7f777059400ab1..a79a1aa9409a950d94ad50f4d1f4f3e9c23f1414 100644 --- a/src/StaticModel.cc +++ b/src/StaticModel.cc @@ -252,237 +252,6 @@ StaticModel::computingPass(int derivsOrder, int paramsDerivsOrder, } } -void -StaticModel::writeStaticMFile(const string& basename) const -{ - auto [d_output, tt_output] = writeModelFileHelper<ExprNodeOutputType::matlabStaticModel>(); - - ostringstream init_output, end_output; - init_output << "residual = zeros(" << equations.size() << ", 1);"; - writeStaticMFileHelper(basename, "static_resid", "residual", "static_resid_tt", - temporary_terms_derivatives[0].size(), "", init_output, end_output, - d_output[0], tt_output[0]); - - init_output.str(""); - end_output.str(""); - init_output << "g1 = zeros(" << equations.size() << ", " << symbol_table.endo_nbr() << ");"; - writeStaticMFileHelper(basename, "static_g1", "g1", "static_g1_tt", - temporary_terms_derivatives[0].size() - + temporary_terms_derivatives[1].size(), - "static_resid_tt", init_output, end_output, d_output[1], tt_output[1]); - writeStaticMWrapperFunction(basename, "g1"); - - // For order ≥ 2 - int ncols {symbol_table.endo_nbr()}; - int ntt {static_cast<int>(temporary_terms_derivatives[0].size() - + temporary_terms_derivatives[1].size())}; - for (size_t i {2}; i < derivatives.size(); i++) - { - ncols *= symbol_table.endo_nbr(); - ntt += temporary_terms_derivatives[i].size(); - string gname {"g" + to_string(i)}; - string gprevname {"g" + to_string(i - 1)}; - - init_output.str(""); - end_output.str(""); - if (derivatives[i].size()) - { - init_output << gname << "_i = zeros(" << NNZDerivatives[i] << ",1);" << endl - << gname << "_j = zeros(" << NNZDerivatives[i] << ",1);" << endl - << gname << "_v = zeros(" << NNZDerivatives[i] << ",1);" << endl; - end_output << gname << " = sparse(" << gname << "_i," << gname << "_j," << gname << "_v," - << equations.size() << "," << ncols << ");"; - } - else - init_output << gname << " = sparse([],[],[]," << equations.size() << "," << ncols << ");"; - writeStaticMFileHelper(basename, "static_" + gname, gname, "static_" + gname + "_tt", ntt, - "static_" + gprevname + "_tt", init_output, end_output, d_output[i], - tt_output[i]); - if (i <= 3) - writeStaticMWrapperFunction(basename, gname); - } - - writeStaticMCompatFile(basename); -} - -void -StaticModel::writeStaticMWrapperFunction(const string& basename, const string& ending) const -{ - string name; - if (ending == "g1") - name = "static_resid_g1"; - else if (ending == "g2") - name = "static_resid_g1_g2"; - else if (ending == "g3") - name = "static_resid_g1_g2_g3"; - - filesystem::path filename {packageDir(basename) / (name + ".m")}; - ofstream output {filename, ios::out | ios::binary}; - if (!output.is_open()) - { - cerr << "ERROR: Can't open file " << filename.string() << " for writing" << endl; - exit(EXIT_FAILURE); - } - - if (ending == "g1") - output << "function [residual, g1] = " << name << "(T, y, x, params, T_flag)" << endl - << "% function [residual, g1] = " << name << "(T, y, x, params, T_flag)" << endl; - else if (ending == "g2") - output << "function [residual, g1, g2] = " << name << "(T, y, x, params, T_flag)" << endl - << "% function [residual, g1, g2] = " << name << "(T, y, x, params, T_flag)" << endl; - else if (ending == "g3") - output << "function [residual, g1, g2, g3] = " << name << "(T, y, x, params, T_flag)" << endl - << "% function [residual, g1, g2, g3] = " << name << "(T, y, x, params, T_flag)" << endl; - - output << "%" << endl - << "% Wrapper function automatically created by Dynare" << endl - << "%" << endl - << endl - << " if T_flag" << endl - << " T = " << basename << ".static_" << ending << "_tt(T, y, x, params);" << endl - << " end" << endl; - - if (ending == "g1") - output << " residual = " << basename << ".static_resid(T, y, x, params, false);" << endl - << " g1 = " << basename << ".static_g1(T, y, x, params, false);" << endl; - else if (ending == "g2") - output << " [residual, g1] = " << basename << ".static_resid_g1(T, y, x, params, false);" - << endl - << " g2 = " << basename << ".static_g2(T, y, x, params, false);" << endl; - else if (ending == "g3") - output << " [residual, g1, g2] = " << basename - << ".static_resid_g1_g2(T, y, x, params, false);" << endl - << " g3 = " << basename << ".static_g3(T, y, x, params, false);" << endl; - - output << endl << "end" << endl; - output.close(); -} - -void -StaticModel::writeStaticMFileHelper(const string& basename, const string& name, - const string& retvalname, const string& name_tt, size_t ttlen, - const string& previous_tt_name, const ostringstream& init_s, - const ostringstream& end_s, const ostringstream& s, - const ostringstream& s_tt) const -{ - filesystem::path filename {packageDir(basename) / (name_tt + ".m")}; - ofstream output {filename, ios::out | ios::binary}; - if (!output.is_open()) - { - cerr << "ERROR: Can't open file " << filename.string() << " for writing" << endl; - exit(EXIT_FAILURE); - } - - output << "function T = " << name_tt << "(T, y, x, params)" << endl - << "% function T = " << name_tt << "(T, y, x, params)" << endl - << "%" << endl - << "% File created by Dynare Preprocessor from .mod file" << endl - << "%" << endl - << "% Inputs:" << endl - << "% T [#temp variables by 1] double vector of temporary terms to be filled " - "by function" - << endl - << "% y [M_.endo_nbr by 1] double vector of endogenous variables in " - "declaration order" - << endl - << "% x [M_.exo_nbr by 1] double vector of exogenous variables in " - "declaration order" - << endl - << "% params [M_.param_nbr by 1] double vector of parameter values in " - "declaration order" - << endl - << "%" << endl - << "% Output:" << endl - << "% T [#temp variables by 1] double vector of temporary terms" << endl - << "%" << endl - << endl - << "assert(length(T) >= " << ttlen << ");" << endl - << endl; - - if (!previous_tt_name.empty()) - output << "T = " << basename << "." << previous_tt_name << "(T, y, x, params);" << endl << endl; - - output << s_tt.str() << endl << "end" << endl; - output.close(); - - filename = packageDir(basename) / (name + ".m"); - output.open(filename, ios::out | ios::binary); - if (!output.is_open()) - { - cerr << "ERROR: Can't open file " << filename.string() << " for writing" << endl; - exit(EXIT_FAILURE); - } - - output << "function " << retvalname << " = " << name << "(T, y, x, params, T_flag)" << endl - << "% function " << retvalname << " = " << name << "(T, y, x, params, T_flag)" << endl - << "%" << endl - << "% File created by Dynare Preprocessor from .mod file" << endl - << "%" << endl - << "% Inputs:" << endl - << "% T [#temp variables by 1] double vector of temporary terms to be filled " - "by function" - << endl - << "% y [M_.endo_nbr by 1] double vector of endogenous variables in " - "declaration order" - << endl - << "% x [M_.exo_nbr by 1] double vector of exogenous variables in " - "declaration order" - << endl - << "% params [M_.param_nbr by 1] double vector of parameter values in " - "declaration order" - << endl - << "% to evaluate the model" << endl - << "% T_flag boolean boolean flag saying whether or not to " - "calculate temporary terms" - << endl - << "%" << endl - << "% Output:" << endl - << "% " << retvalname << endl - << "%" << endl - << endl; - - if (!name_tt.empty()) - output << "if T_flag" << endl - << " T = " << basename << "." << name_tt << "(T, y, x, params);" << endl - << "end" << endl; - - output << init_s.str() << endl << s.str() << end_s.str() << endl << "end" << endl; - output.close(); -} - -void -StaticModel::writeStaticMCompatFile(const string& basename) const -{ - filesystem::path filename {packageDir(basename) / "static.m"}; - ofstream output {filename, ios::out | ios::binary}; - if (!output.is_open()) - { - cerr << "ERROR: Can't open file " << filename.string() << " for writing" << endl; - exit(EXIT_FAILURE); - } - int ntt {static_cast<int>( - temporary_terms_derivatives[0].size() + temporary_terms_derivatives[1].size() - + temporary_terms_derivatives[2].size() + temporary_terms_derivatives[3].size())}; - - output << "function [residual, g1, g2, g3] = static(y, x, params)" << endl - << " T = NaN(" << ntt << ", 1);" << endl - << " if nargout <= 1" << endl - << " residual = " << basename << ".static_resid(T, y, x, params, true);" << endl - << " elseif nargout == 2" << endl - << " [residual, g1] = " << basename << ".static_resid_g1(T, y, x, params, true);" - << endl - << " elseif nargout == 3" << endl - << " [residual, g1, g2] = " << basename - << ".static_resid_g1_g2(T, y, x, params, true);" << endl - << " else" << endl - << " [residual, g1, g2, g3] = " << basename - << ".static_resid_g1_g2_g3(T, y, x, params, true);" << endl - << " end" << endl - << "end" << endl; - - output.close(); -} - void StaticModel::writeStaticFile(const string& basename, bool use_dll, const string& mexext, const filesystem::path& matlabroot, bool julia) const @@ -517,9 +286,6 @@ StaticModel::writeStaticFile(const string& basename, bool use_dll, const string& // Legacy representation if (use_dll) writeModelCFile<false>(basename, mexext, matlabroot); - else if (!julia) // M-files - writeStaticMFile(basename); - // The legacy representation is no longer produced for Julia /* PlannerObjective subclass or discretionary optimal policy models don’t have as many variables as equations; bytecode does not support that diff --git a/src/StaticModel.hh b/src/StaticModel.hh index 288c6e4725f9485cece581d2d7d081bf0390b547..acadbb56b362daef521cc258bf8bc13e9f8c83ab 100644 --- a/src/StaticModel.hh +++ b/src/StaticModel.hh @@ -1,5 +1,5 @@ /* - * Copyright © 2003-2023 Dynare Team + * Copyright © 2003-2024 Dynare Team * * This file is part of Dynare. * @@ -60,9 +60,6 @@ private: block. See the DynamicModel class for the default value in that case. */ int static_mfs {0}; - // Writes static model file (MATLAB/Octave version, legacy representation) - void writeStaticMFile(const string& basename) const; - //! Writes the code of the block-decomposed model in virtual machine bytecode void writeStaticBlockBytecode(const string& basename) const; @@ -95,20 +92,6 @@ private: void computeChainRuleJacobian() override; - /* Helper for writing MATLAB/Octave functions for residuals/derivatives and - their temporary terms (legacy representation) */ - void writeStaticMFileHelper(const string& basename, const string& name, const string& retvalname, - const string& name_tt, size_t ttlen, const string& previous_tt_name, - const ostringstream& init_s, const ostringstream& end_s, - const ostringstream& s, const ostringstream& s_tt) const; - /* Writes MATLAB/Octave wrapper function for computing residuals and - derivatives at the same time (legacy representation) */ - void writeStaticMWrapperFunction(const string& basename, const string& ending) const; - - /* Create the compatibility static.m file for MATLAB/Octave not yet using the - temporary terms array interface (legacy representation) */ - void writeStaticMCompatFile(const string& name) const; - int getBlockJacobianEndoCol([[maybe_unused]] int blk, int var, [[maybe_unused]] int lag) const override