From d587a5133f871a661696d36fa078f2fb7660052f Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan@dynare.org>
Date: Wed, 14 Oct 2015 11:02:35 +0200
Subject: [PATCH] preprocessor: change prior_posterior_function into two
 arguments. closes #1076

---
 ComputingTasks.cc | 19 ++++++-------------
 ComputingTasks.hh |  3 ++-
 DynareBison.yy    | 21 +++++++++++----------
 DynareFlex.ll     |  7 ++-----
 ParsingDriver.cc  |  4 ++--
 ParsingDriver.hh  |  2 +-
 6 files changed, 24 insertions(+), 32 deletions(-)

diff --git a/ComputingTasks.cc b/ComputingTasks.cc
index 52b8ffa0..bd62e036 100644
--- a/ComputingTasks.cc
+++ b/ComputingTasks.cc
@@ -138,7 +138,9 @@ PerfectForesightSolverStatement::writeOutput(ostream &output, const string &base
   output << "perfect_foresight_solver;" << endl;
 }
 
-PriorPosteriorFunctionStatement::PriorPosteriorFunctionStatement(const OptionsList &options_list_arg) :
+PriorPosteriorFunctionStatement::PriorPosteriorFunctionStatement(const bool prior_func_arg,
+                                                                 const OptionsList &options_list_arg) :
+  prior_func(prior_func_arg),
   options_list(options_list_arg)
 {
 }
@@ -146,20 +148,11 @@ PriorPosteriorFunctionStatement::PriorPosteriorFunctionStatement(const OptionsLi
 void
 PriorPosteriorFunctionStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
 {
-  // Fill in option_occbin of mod_file_struct
-  OptionsList::num_options_t::const_iterator it = options_list.num_options.find("prior");
-  OptionsList::num_options_t::const_iterator it1 = options_list.num_options.find("posterior");
-  if ((it == options_list.num_options.end() && it1 == options_list.num_options.end())
-      || (it != options_list.num_options.end() && it1 != options_list.num_options.end()))
-      {
-          cerr << "ERROR: prior_posterior_function requires one of 'prior' or 'posterior'" << endl;
-          exit(EXIT_FAILURE);
-      }
-
   OptionsList::string_options_t::const_iterator it2 = options_list.string_options.find("function");
   if (it2 == options_list.string_options.end() || it2->second.empty())
       {
-          cerr << "ERROR: prior_posterior_function requires the 'function' argument" << endl;
+          cerr << "ERROR: both the prior_function and posterior_function commands require the 'function' argument"
+               << endl;
           exit(EXIT_FAILURE);
       }
 }
@@ -169,7 +162,7 @@ PriorPosteriorFunctionStatement::writeOutput(ostream &output, const string &base
 {
   options_list.writeOutput(output);
   string type = "posterior";
-  if (options_list.num_options.find("prior") != options_list.num_options.end())
+  if (prior_func)
       type = "prior";
 
   output << "oo_ = execute_prior_posterior_function("
diff --git a/ComputingTasks.hh b/ComputingTasks.hh
index a963be8c..a0fd1202 100644
--- a/ComputingTasks.hh
+++ b/ComputingTasks.hh
@@ -80,9 +80,10 @@ public:
 class PriorPosteriorFunctionStatement : public Statement
 {
 private:
+  const bool prior_func;
   const OptionsList options_list;
 public:
-  PriorPosteriorFunctionStatement(const OptionsList &options_list_arg);
+  PriorPosteriorFunctionStatement(const bool prior_func_arg, const OptionsList &options_list_arg);
   virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
   virtual void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const;
 };
diff --git a/DynareBison.yy b/DynareBison.yy
index fee3fdb3..71407992 100644
--- a/DynareBison.yy
+++ b/DynareBison.yy
@@ -147,7 +147,7 @@ class ParsingDriver;
 %token VLISTLOG VLISTPER SPECTRAL_DENSITY
 %token RESTRICTION RESTRICTION_FNAME CROSS_RESTRICTIONS NLAGS CONTEMP_REDUCED_FORM REAL_PSEUDO_FORECAST
 %token DUMMY_OBS NSTATES INDXSCALESSTATES NO_BAYESIAN_PRIOR SPECIFICATION SIMS_ZHA
-%token <string_val> ALPHA BETA ABAND NINV CMS NCMS CNUM GAMMA INV_GAMMA INV_GAMMA1 INV_GAMMA2 NORMAL UNIFORM EPS PDF FIG DR NONE PRIOR POSTERIOR PRIOR_VARIANCE HESSIAN IDENTITY_MATRIX DIRICHLET
+%token <string_val> ALPHA BETA ABAND NINV CMS NCMS CNUM GAMMA INV_GAMMA INV_GAMMA1 INV_GAMMA2 NORMAL UNIFORM EPS PDF FIG DR NONE PRIOR PRIOR_VARIANCE HESSIAN IDENTITY_MATRIX DIRICHLET
 %token GSIG2_LMDM Q_DIAG FLAT_PRIOR NCSK NSTD WEIBULL WEIBULL_PDF
 %token INDXPARR INDXOVR INDXAP APBAND INDXIMF IMFBAND INDXFORE FOREBAND INDXGFOREHAT INDXGIMFHAT
 %token INDXESTIMA INDXGDLS EQ_MS FILTER_COVARIANCE FILTER_DECOMPOSITION
@@ -162,7 +162,7 @@ class ParsingDriver;
 %token SELECTED_VARIABLES_ONLY COVA_COMPUTE SIMULATION_FILE_TAG FILE_TAG
 %token NO_ERROR_BANDS ERROR_BAND_PERCENTILES SHOCKS_PER_PARAMETER NO_CREATE_INIT
 %token SHOCK_DRAWS FREE_PARAMETERS MEDIAN DATA_OBS_NBR NEIGHBORHOOD_WIDTH PVALUE_KS PVALUE_CORR
-%token FILTERED_PROBABILITIES REAL_TIME_SMOOTHED PRIOR_POSTERIOR_FUNCTION SAMPLING_DRAWS
+%token FILTERED_PROBABILITIES REAL_TIME_SMOOTHED PRIOR_FUNCTION POSTERIOR_FUNCTION SAMPLING_DRAWS
 %token PROPOSAL_TYPE PROPOSAL_UPPER_BOUND PROPOSAL_LOWER_BOUND PROPOSAL_DRAWS USE_MEAN_CENTER
 %token ADAPTIVE_MH_DRAWS THINNING_FACTOR COEFFICIENTS_PRIOR_HYPERPARAMETERS
 %token CONVERGENCE_STARTING_VALUE CONVERGENCE_ENDING_VALUE CONVERGENCE_INCREMENT_VALUE
@@ -281,7 +281,8 @@ statement : parameters
           | histval_file
           | perfect_foresight_setup
           | perfect_foresight_solver
-          | prior_posterior_function
+          | prior_function
+          | posterior_function
           ;
 
 dsample : DSAMPLE INT_NUMBER ';'
@@ -1023,17 +1024,19 @@ perfect_foresight_solver_options : o_stack_solve_algo
 				 | o_occbin
                                  ;
 
-prior_posterior_function : PRIOR_POSTERIOR_FUNCTION '(' prior_posterior_function_options_list ')' ';'
-                          { driver.prior_posterior_function(); }
-                         ;
+prior_function : PRIOR_FUNCTION '(' prior_posterior_function_options_list ')' ';'
+                { driver.prior_posterior_function(true); }
+               ;
+
+posterior_function : POSTERIOR_FUNCTION '(' prior_posterior_function_options_list ')' ';'
+                    { driver.prior_posterior_function(false); }
+                   ;
 
 prior_posterior_function_options_list : prior_posterior_function_options_list COMMA prior_posterior_function_options
                                       | prior_posterior_function_options
                                       ;
 
 prior_posterior_function_options : o_function
-                                 | o_prior
-                                 | o_posterior
                                  | o_sampling_draws
                                  ;
 
@@ -3083,7 +3086,6 @@ o_lmmcp : LMMCP {driver.option_num("lmmcp", "1"); };
 o_occbin : OCCBIN {driver.option_num("occbin", "1"); };
 o_function : FUNCTION EQUAL filename { driver.option_str("function", $3); };
 o_prior : PRIOR { driver.option_num("prior", "1"); };
-o_posterior : POSTERIOR { driver.option_num("posterior", "1"); };
 o_sampling_draws : SAMPLING_DRAWS EQUAL INT_NUMBER { driver.option_num("sampling_draws",$3); };
 
 range : symbol ':' symbol
@@ -3229,7 +3231,6 @@ symbol : NAME
        | NONE
        | DR
        | PRIOR
-       | POSTERIOR
        ;
 %%
 
diff --git a/DynareFlex.ll b/DynareFlex.ll
index d64e2fe8..0686500d 100644
--- a/DynareFlex.ll
+++ b/DynareFlex.ll
@@ -214,15 +214,12 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2
   yylval->string_val = new string(yytext);
   return token::PRIOR;
 }
-<DYNARE_STATEMENT>posterior {
-  yylval->string_val = new string(yytext);
-  return token::POSTERIOR;
-}
 <INITIAL>std {BEGIN DYNARE_STATEMENT; return token::STD;}
 <INITIAL>corr {BEGIN DYNARE_STATEMENT; return token::CORR;}
 <DYNARE_STATEMENT>function {return token::FUNCTION;}
 <DYNARE_STATEMENT>sampling_draws {return token::SAMPLING_DRAWS;}
-<INITIAL>prior_posterior_function {BEGIN DYNARE_STATEMENT; return token::PRIOR_POSTERIOR_FUNCTION;}
+<INITIAL>prior_function {BEGIN DYNARE_STATEMENT; return token::PRIOR_FUNCTION;}
+<INITIAL>posterior_function {BEGIN DYNARE_STATEMENT; return token::POSTERIOR_FUNCTION;}
 
  /* Inside  of a Dynare statement */
 <DYNARE_STATEMENT>{DATE} {
diff --git a/ParsingDriver.cc b/ParsingDriver.cc
index 298d774a..ab9ff200 100644
--- a/ParsingDriver.cc
+++ b/ParsingDriver.cc
@@ -2798,9 +2798,9 @@ ParsingDriver::perfect_foresight_solver()
 }
 
 void
-ParsingDriver::prior_posterior_function()
+ParsingDriver::prior_posterior_function(bool prior_func)
 {
-  mod_file->addStatement(new PriorPosteriorFunctionStatement(options_list));
+  mod_file->addStatement(new PriorPosteriorFunctionStatement((bool)prior_func, options_list));
   options_list.clear();
 }
 
diff --git a/ParsingDriver.hh b/ParsingDriver.hh
index f9dd4912..4da740fe 100644
--- a/ParsingDriver.hh
+++ b/ParsingDriver.hh
@@ -703,7 +703,7 @@ public:
   void histval_file(string *filename);
   void perfect_foresight_setup();
   void perfect_foresight_solver();
-  void prior_posterior_function();
+  void prior_posterior_function(bool prior_func);
 };
 
 #endif // ! PARSING_DRIVER_HH
-- 
GitLab