From befd432be7d4551a200fa0e3018fc44a20cfc7bb Mon Sep 17 00:00:00 2001
From: Johannes Pfeifer <jpfeifer@gmx.de>
Date: Fri, 3 Dec 2021 13:17:34 +0100
Subject: [PATCH] evaluate_planner_objective: add options

Related to https://git.dynare.org/Dynare/dynare/-/merge_requests/1967
---
 src/ComputingTasks.cc | 15 +++++++++++++--
 src/ComputingTasks.hh |  5 ++++-
 src/DynareBison.yy    | 13 +++++++++++++
 src/ParsingDriver.cc  |  3 ++-
 4 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/src/ComputingTasks.cc b/src/ComputingTasks.cc
index 2da26b57..35cacd9c 100644
--- a/src/ComputingTasks.cc
+++ b/src/ComputingTasks.cc
@@ -711,15 +711,26 @@ RamseyPolicyStatement::writeJsonOutput(ostream &output) const
   output << "}";
 }
 
+EvaluatePlannerObjectiveStatement::EvaluatePlannerObjectiveStatement(OptionsList options_list_arg) :
+  options_list{move(options_list_arg)}
+{
+}
+
 void
-EvaluatePlannerObjective::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const
+EvaluatePlannerObjectiveStatement::writeOutput(ostream &output, const string &basename, bool minimal_workspace) const
 {
+  options_list.writeOutput(output);
   output << "oo_.planner_objective_value = evaluate_planner_objective(M_, options_, oo_);" << endl;
 }
 
 void
-EvaluatePlannerObjective::writeJsonOutput(ostream &output) const
+EvaluatePlannerObjectiveStatement::writeJsonOutput(ostream &output) const
 {
+  if (options_list.getNumberOfOptions())
+    {
+      output << ", ";
+      options_list.writeJsonOutput(output);
+    }
   output << R"({"statementName": "evaluate_planner_objective"})";
 }
 
diff --git a/src/ComputingTasks.hh b/src/ComputingTasks.hh
index 47cdb503..1a4e192f 100644
--- a/src/ComputingTasks.hh
+++ b/src/ComputingTasks.hh
@@ -199,9 +199,12 @@ public:
   void writeJsonOutput(ostream &output) const override;
 };
 
-class EvaluatePlannerObjective : public Statement
+class EvaluatePlannerObjectiveStatement : public Statement
 {
+private:
+  const OptionsList options_list;
 public:
+  EvaluatePlannerObjectiveStatement(OptionsList options_list_arg);
   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
   void writeJsonOutput(ostream &output) const override;
 };
diff --git a/src/DynareBison.yy b/src/DynareBison.yy
index 406a0ae0..5673a31e 100644
--- a/src/DynareBison.yy
+++ b/src/DynareBison.yy
@@ -2456,8 +2456,18 @@ ramsey_constraint : NAME  LESS expression ';'
 
 evaluate_planner_objective : EVALUATE_PLANNER_OBJECTIVE ';'
                              { driver.evaluate_planner_objective(); }
+                           | EVALUATE_PLANNER_OBJECTIVE '(' evaluate_planner_objective_options_list ')' ';'
+                             { driver.evaluate_planner_objective(); }
                            ;
 
+evaluate_planner_objective_options_list : evaluate_planner_objective_option COMMA evaluate_planner_objective_options_list
+                                        | evaluate_planner_objective_option
+                                        ;
+
+evaluate_planner_objective_option : o_evaluate_planner_objective_periods
+                                  | o_evaluate_planner_objective_drop
+                                  ;
+
 occbin_setup : OCCBIN_SETUP ';'
                { driver.occbin_setup(); }
              | OCCBIN_SETUP '(' occbin_setup_options_list ')' ';'
@@ -4037,6 +4047,9 @@ o_checks_via_subsets : CHECKS_VIA_SUBSETS EQUAL INT_NUMBER { driver.option_num("
 o_max_dim_subsets_groups : MAX_DIM_SUBSETS_GROUPS EQUAL INT_NUMBER { driver.option_num("max_dim_subsets_groups", $3); };
 o_zero_moments_tolerance : ZERO_MOMENTS_TOLERANCE EQUAL non_negative_number { driver.option_num("zero_moments_tolerance", $3); };
 
+// Some options to "evaluate_planner_objective"
+o_evaluate_planner_objective_periods : PERIODS EQUAL INT_NUMBER { driver.option_num("ramsey.periods", $3); };
+o_evaluate_planner_objective_drop : DROP EQUAL INT_NUMBER { driver.option_num("ramsey.drop", $3); };
 
 // Some options to "occbin_solver"
 o_occbin_simul_maxit : SIMUL_MAXIT EQUAL INT_NUMBER { driver.option_num("simul.maxit", $3); };
diff --git a/src/ParsingDriver.cc b/src/ParsingDriver.cc
index bf43e7fc..2220b8bd 100644
--- a/src/ParsingDriver.cc
+++ b/src/ParsingDriver.cc
@@ -2098,7 +2098,8 @@ ParsingDriver::ramsey_policy()
 void
 ParsingDriver::evaluate_planner_objective()
 {
-  mod_file->addStatement(make_unique<EvaluatePlannerObjective>());
+  mod_file->addStatement(make_unique<EvaluatePlannerObjectiveStatement>(options_list));
+  options_list.clear();
 }
 
 void
-- 
GitLab