From 98a8f54d381211a1fce79da026cabf6782325f03 Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan.bastani@ens.fr>
Date: Thu, 3 Mar 2011 16:30:53 +0100
Subject: [PATCH] bug fix: check that osr, osr_params and optim_weights appear
 together

---
 preprocessor/ComputingTasks.cc | 12 ++++++++++++
 preprocessor/ComputingTasks.hh |  2 ++
 preprocessor/ModFile.cc        |  8 ++++++++
 preprocessor/Statement.cc      |  2 ++
 preprocessor/Statement.hh      |  4 ++++
 5 files changed, 28 insertions(+)

diff --git a/preprocessor/ComputingTasks.cc b/preprocessor/ComputingTasks.cc
index 38b0e8ba0a..e5fbb474ba 100644
--- a/preprocessor/ComputingTasks.cc
+++ b/preprocessor/ComputingTasks.cc
@@ -629,6 +629,12 @@ OsrParamsStatement::OsrParamsStatement(const SymbolList &symbol_list_arg) :
 {
 }
 
+void
+OsrParamsStatement::checkPass(ModFileStructure &mod_file_struct)
+{
+  mod_file_struct.osr_params_present = true;
+}
+
 void
 OsrParamsStatement::writeOutput(ostream &output, const string &basename) const
 {
@@ -681,6 +687,12 @@ OptimWeightsStatement::OptimWeightsStatement(const var_weights_t &var_weights_ar
 {
 }
 
+void
+OptimWeightsStatement::checkPass(ModFileStructure &mod_file_struct)
+{
+  mod_file_struct.optim_weights_present = true;
+}
+
 void
 OptimWeightsStatement::writeOutput(ostream &output, const string &basename) const
 {
diff --git a/preprocessor/ComputingTasks.hh b/preprocessor/ComputingTasks.hh
index fd23cdd517..e265e95810 100644
--- a/preprocessor/ComputingTasks.hh
+++ b/preprocessor/ComputingTasks.hh
@@ -185,6 +185,7 @@ private:
   const SymbolList symbol_list;
 public:
   OsrParamsStatement(const SymbolList &symbol_list_arg);
+  virtual void checkPass(ModFileStructure &mod_file_struct);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
@@ -308,6 +309,7 @@ public:
   OptimWeightsStatement(const var_weights_t &var_weights_arg,
                         const covar_weights_t &covar_weights_arg,
                         const SymbolTable &symbol_table_arg);
+  virtual void checkPass(ModFileStructure &mod_file_struct);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
 
diff --git a/preprocessor/ModFile.cc b/preprocessor/ModFile.cc
index 1499e8dc8b..2138c7e2a2 100644
--- a/preprocessor/ModFile.cc
+++ b/preprocessor/ModFile.cc
@@ -130,6 +130,14 @@ ModFile::checkPass()
       exit(EXIT_FAILURE);
     }
 
+  if ((mod_file_struct.osr_present && (!mod_file_struct.osr_params_present || !mod_file_struct.optim_weights_present))
+      || ((!mod_file_struct.osr_present || !mod_file_struct.osr_params_present) && mod_file_struct.optim_weights_present)
+      || ((!mod_file_struct.osr_present || !mod_file_struct.optim_weights_present) && mod_file_struct.osr_params_present))
+    {
+      cerr << "ERROR: The osr statement must be used with osr_params and optim_weights." << endl;
+      exit(EXIT_FAILURE);
+    }
+
   if (mod_file_struct.simul_present && stochastic_statement_present)
     {
       cerr << "ERROR: A .mod file cannot contain both a simul command and one of {stoch_simul, estimation, osr, ramsey_policy}" << endl;
diff --git a/preprocessor/Statement.cc b/preprocessor/Statement.cc
index c9b2945221..f8b4936bca 100644
--- a/preprocessor/Statement.cc
+++ b/preprocessor/Statement.cc
@@ -26,6 +26,8 @@ ModFileStructure::ModFileStructure() :
   stoch_simul_present(false),
   estimation_present(false),
   osr_present(false),
+  osr_params_present(false),
+  optim_weights_present(false),
   ramsey_policy_present(false),
   planner_objective_present(false),
   order_option(0),
diff --git a/preprocessor/Statement.hh b/preprocessor/Statement.hh
index 2778771bb2..a16f1646a0 100644
--- a/preprocessor/Statement.hh
+++ b/preprocessor/Statement.hh
@@ -44,6 +44,10 @@ public:
   bool estimation_present;
   //! Whether an osr statement is present
   bool osr_present;
+  //! Whether an osr params statement is present
+  bool osr_params_present;
+  //! Whether an optim weight statement is present
+  bool optim_weights_present;
   //! Whether a ramsey_policy statement is present
   bool ramsey_policy_present;
   //! Whether a planner_objective statement is present
-- 
GitLab