diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index cc5d7987fbc9368c00b453e3c0ad6aebf1f2a89b..4f884b8b852c04a958f3be7bc82e80469198b928 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -1123,7 +1123,7 @@ DynamicModel::writeDriverOutput(ostream& output, bool compute_xrefs) const output << (i > computed_derivs_order ? -1 : NNZDerivatives[i]) << "; "; output << "];" << endl; - writeDriverSparseIndicesHelper<true>(output); + writeDriverSparseIndicesHelper<true, false>(output); // Write LHS of each equation in text form output << "M_.lhs = {" << endl; diff --git a/src/ModelEquationBlock.cc b/src/ModelEquationBlock.cc index 6667992b4300e13479ca666351b81cb8a16980f4..d25e9221a95439b12407d10a072c965707e30b79 100644 --- a/src/ModelEquationBlock.cc +++ b/src/ModelEquationBlock.cc @@ -41,6 +41,7 @@ PlannerObjective::writeDriverOutput(ostream& output) const for (const auto& it : temporary_terms_derivatives) output << it.size() << "; "; output << "];" << endl; + writeDriverSparseIndicesHelper<false, true>(output); } void diff --git a/src/ModelTree.hh b/src/ModelTree.hh index d3f87199f069b79f191833803b9d0e35d4640ed1..4a5566860d39e6716b7c0c468a9d6e4e44a81e30 100644 --- a/src/ModelTree.hh +++ b/src/ModelTree.hh @@ -351,8 +351,9 @@ protected: void writeBlockBytecodeHelper(Bytecode::Writer& code_file, int block, temporary_terms_t& temporary_terms_union) const; - // Helper for writing sparse derivatives indices in MATLAB/Octave driver file - template<bool dynamic> + /* Helper for writing sparse derivatives indices in MATLAB/Octave driver file. + Also supports the planner objective through the corresponding boolean. */ + template<bool dynamic, bool objective> void writeDriverSparseIndicesHelper(ostream& output) const; // Helper for writing sparse derivatives indices in JSON @@ -2246,12 +2247,13 @@ ModelTree::writeJsonParamsDerivativesHelper(bool writeDetails) const move(rpp_output), move(gpp_output), move(hp_output), move(g3p_output)}; } -template<bool dynamic> +template<bool dynamic, bool objective> void ModelTree::writeDriverSparseIndicesHelper(ostream& output) const { + static_assert(!(objective && dynamic), "There is no such thing as a dynamic planner objective"); // TODO: when C++20 support is complete, mark this constexpr - const string model_name {dynamic ? "dynamic" : "static"}; + const string model_name {objective ? "objective" : (dynamic ? "dynamic" : "static")}; // Write indices for the sparse Jacobian (both naive and CSC storage) output << "M_." << model_name << "_g1_sparse_rowval = int32(["; diff --git a/src/StaticModel.cc b/src/StaticModel.cc index d4eb9814dd71036ec1b3e70dacd5ee0b8cc3007f..1d485ac41dfc204f6db5e4c94c7f777059400ab1 100644 --- a/src/StaticModel.cc +++ b/src/StaticModel.cc @@ -1,5 +1,5 @@ /* - * Copyright © 2003-2023 Dynare Team + * Copyright © 2003-2024 Dynare Team * * This file is part of Dynare. * @@ -564,7 +564,7 @@ StaticModel::writeDriverOutput(ostream& output) const if (block_decomposed) writeBlockDriverOutput(output); - writeDriverSparseIndicesHelper<false>(output); + writeDriverSparseIndicesHelper<false, false>(output); } void