From d3c36f239d1c8ab04800aa3bc1f5a1a90a4c7eff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org> Date: Wed, 31 Jan 2024 16:50:23 +0100 Subject: [PATCH] Write sparse indices for planner objective derivatives --- src/DynamicModel.cc | 2 +- src/ModelEquationBlock.cc | 1 + src/ModelTree.hh | 10 ++++++---- src/StaticModel.cc | 4 ++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index cc5d7987..4f884b8b 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 6667992b..d25e9221 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 d3f87199..4a556686 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 d4eb9814..1d485ac4 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 -- GitLab