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