From 691af085cd12cb7baa78f38a0387d00a643d3ddf Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan@dynare.org>
Date: Wed, 13 May 2015 16:09:50 +0200
Subject: [PATCH] preprocessor: add tarb_optim option to estimation. #940

---
 DynareBison.yy   | 14 +++++++++++++-
 DynareFlex.ll    |  2 +-
 ParsingDriver.cc | 28 ++++++++++++++++++++++++++++
 ParsingDriver.hh |  5 +++++
 4 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/DynareBison.yy b/DynareBison.yy
index 5585267e..bd9300e1 100644
--- a/DynareBison.yy
+++ b/DynareBison.yy
@@ -85,7 +85,7 @@ class ParsingDriver;
 %token AIM_SOLVER ANALYTIC_DERIVATION AR AUTOCORR TARB_MODE_COMPUTE
 %token BAYESIAN_IRF BETA_PDF BLOCK USE_CALIBRATION USE_TARB TARB_NEW_BLOCK_PROBABILITY
 %token BVAR_DENSITY BVAR_FORECAST NODECOMPOSITION DR_DISPLAY_TOL HUGE_NUMBER
-%token BVAR_PRIOR_DECAY BVAR_PRIOR_FLAT BVAR_PRIOR_LAMBDA
+%token BVAR_PRIOR_DECAY BVAR_PRIOR_FLAT BVAR_PRIOR_LAMBDA TARB_OPTIM
 %token BVAR_PRIOR_MU BVAR_PRIOR_OMEGA BVAR_PRIOR_TAU BVAR_PRIOR_TRAIN
 %token BVAR_REPLIC BYTECODE ALL_VALUES_REQUIRED
 %token CALIB_SMOOTHER CHANGE_TYPE CHECK CONDITIONAL_FORECAST CONDITIONAL_FORECAST_PATHS CONF_SIG CONSTANT CONTROLLED_VAREXO CORR COVAR CUTOFF CYCLE_REDUCTION LOGARITHMIC_REDUCTION
@@ -1718,6 +1718,7 @@ estimation_options : o_datafile
                    | o_use_tarb
                    | o_tarb_mode_compute
                    | o_tarb_new_block_probability
+                   | o_tarb_optim
                    ;
 
 list_optim_option : QUOTED_STRING COMMA QUOTED_STRING
@@ -1730,6 +1731,16 @@ optim_options : list_optim_option
               | optim_options COMMA list_optim_option;
               ;
 
+list_tarb_optim_option : QUOTED_STRING COMMA QUOTED_STRING
+                         { driver.tarb_optim_options_string($1, $3); }
+                       | QUOTED_STRING COMMA signed_number
+                         { driver.tarb_optim_options_num($1, $3); }
+                       ;
+
+tarb_optim_options : list_tarb_optim_option
+                   | tarb_optim_options COMMA list_tarb_optim_option;
+                   ;
+
 varobs : VAROBS { driver.check_varobs(); } varobs_list ';';
 
 varobs_list : varobs_list symbol
@@ -2621,6 +2632,7 @@ o_posterior_max_subsample_draws : POSTERIOR_MAX_SUBSAMPLE_DRAWS EQUAL INT_NUMBER
 o_mh_drop : MH_DROP EQUAL non_negative_number { driver.option_num("mh_drop", $3); };
 o_mh_jscale : MH_JSCALE EQUAL non_negative_number { driver.option_num("mh_jscale", $3); };
 o_optim : OPTIM  EQUAL '(' optim_options ')';
+o_tarb_optim : TARB_OPTIM  EQUAL '(' tarb_optim_options ')';
 o_mh_init_scale : MH_INIT_SCALE EQUAL non_negative_number { driver.option_num("mh_init_scale", $3); };
 o_mode_file : MODE_FILE EQUAL filename { driver.option_str("mode_file", $3); };
 o_mode_compute : MODE_COMPUTE EQUAL INT_NUMBER { driver.option_num("mode_compute", $3); };
diff --git a/DynareFlex.ll b/DynareFlex.ll
index f6c67669..5466487d 100644
--- a/DynareFlex.ll
+++ b/DynareFlex.ll
@@ -572,7 +572,7 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2
 <DYNARE_STATEMENT>use_tarb {return token::USE_TARB;}
 <DYNARE_STATEMENT>tarb_mode_compute {return token::TARB_MODE_COMPUTE;}
 <DYNARE_STATEMENT>tarb_new_block_probability {return token::TARB_NEW_BLOCK_PROBABILITY;}
-
+<DYNARE_STATEMENT>tarb_optim {return token::TARB_OPTIM;}
 
 <DYNARE_STATEMENT>[\$][^$]*[\$] {
   strtok(yytext+1, "$");
diff --git a/ParsingDriver.cc b/ParsingDriver.cc
index 67c4be45..ba541ec8 100644
--- a/ParsingDriver.cc
+++ b/ParsingDriver.cc
@@ -1630,6 +1630,34 @@ ParsingDriver::optim_options_num(string *name, string *value)
   delete value;
 }
 
+void
+ParsingDriver::tarb_optim_options_helper(const string &name)
+{
+  if (options_list.string_options.find("TaRB.optim_opt") == options_list.string_options.end())
+    options_list.string_options["TaRB.optim_opt"] = "";
+  else
+    options_list.string_options["TaRB.optim_opt"] += ",";
+  options_list.string_options["TaRB.optim_opt"] += "''" + name + "'',";
+}
+
+void
+ParsingDriver::tarb_optim_options_string(string *name, string *value)
+{
+  tarb_optim_options_helper(*name);
+  options_list.string_options["TaRB.optim_opt"] += "''" + *value + "''";
+  delete name;
+  delete value;
+}
+
+void
+ParsingDriver::tarb_optim_options_num(string *name, string *value)
+{
+  tarb_optim_options_helper(*name);
+  options_list.string_options["TaRB.optim_opt"] += *value;
+  delete name;
+  delete value;
+}
+
 void
 ParsingDriver::check_varobs()
 {
diff --git a/ParsingDriver.hh b/ParsingDriver.hh
index d4ebc05d..dd93276c 100644
--- a/ParsingDriver.hh
+++ b/ParsingDriver.hh
@@ -98,6 +98,7 @@ private:
 
   //! Creates option "optim_opt" in OptionsList if it doesn't exist, else add a comma, and adds the option name
   void optim_options_helper(const string &name);
+  void tarb_optim_options_helper(const string &name);
 
   //! Stores temporary symbol table
   SymbolList symbol_list;
@@ -443,6 +444,10 @@ public:
   void optim_options_string(string *name, string *value);
   //! Adds an optimization option (numeric value)
   void optim_options_num(string *name, string *value);
+  //! Adds a TaRB optimization option (string value)
+  void tarb_optim_options_string(string *name, string *value);
+  //! Adds a TaRB optimization option (numeric value)
+  void tarb_optim_options_num(string *name, string *value);
   //! Check that no observed variable has yet be defined
   void check_varobs();
   //! Add a new observed variable
-- 
GitLab