preprocessor: add eqtags option to var_model

issue#70
Houtan Bastani 2018-01-12 16:54:17 +01:00
parent 3da0186774
commit 11ffe053b2
6 changed files with 114 additions and 15 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2017 Dynare Team
* Copyright (C) 2003-2018 Dynare Team
*
* This file is part of Dynare.
*
@ -50,7 +50,8 @@ class ParsingDriver;
string *string_val;
expr_t node_val;
SymbolType symbol_type_val;
vector<string *> *vector_string_val;
vector<string> *vector_string_val;
vector<string *> *vector_string_p_val;
vector<int> *vector_int_val;
pair<string *, string *> *string_pair_val;
vector<pair<string *, string *> *> *vector_string_pair_val;
@ -176,10 +177,10 @@ class ParsingDriver;
%token NUMBER_OF_POSTERIOR_DRAWS_AFTER_PERTURBATION MAX_NUMBER_OF_STAGES
%token RANDOM_FUNCTION_CONVERGENCE_CRITERION RANDOM_PARAMETER_CONVERGENCE_CRITERION
%token CENTERED_MOMENTS AUTOLAG RECURSIVE_ORDER_ESTIMATION BARTLETT_KERNEL_LAG WEIGHTING_MATRIX PENALIZED_ESTIMATOR VERBOSE
%token SIMULATION_MULTIPLE SEED BOUNDED_SHOCK_SUPPORT
%token SIMULATION_MULTIPLE SEED BOUNDED_SHOCK_SUPPORT EQTAGS
%token ANALYTICAL_GIRF IRF_IN_PERCENT EMAS_GIRF EMAS_DROP EMAS_TOLF EMAS_MAX_ITER
%token <vector_string_val> SYMBOL_VEC
%token <vector_string_p_val> SYMBOL_VEC
%type <node_val> expression expression_or_empty
%type <node_val> equation hand_side
@ -191,7 +192,8 @@ class ParsingDriver;
%type <string_pair_val> named_var_elem
%type <vector_string_pair_val> named_var named_var_1
%type <symbol_type_val> change_type_arg
%type <vector_string_val> change_type_var_list subsamples_eq_opt prior_eq_opt options_eq_opt calibration_range
%type <vector_string_val> vec_str vec_str_1
%type <vector_string_p_val> change_type_var_list subsamples_eq_opt prior_eq_opt options_eq_opt calibration_range
%type <vector_int_val> vec_int_elem vec_int_1 vec_int vec_int_number
%type <prior_distributions_val> prior_pdf prior_distribution
%%
@ -376,6 +378,7 @@ var_model_options_list : var_model_options_list COMMA var_model_options
var_model_options : o_var_name
| o_var_order
| o_var_eq_tags
;
restrictions : RESTRICTIONS '(' symbol ')' ';' { driver.begin_VAR_restrictions(); }
@ -3177,6 +3180,7 @@ o_series : SERIES EQUAL symbol { driver.option_str("series", $3); };
o_datafile : DATAFILE EQUAL filename { driver.option_str("datafile", $3); };
o_var_datafile : DATAFILE EQUAL filename { driver.option_str("var_estimation.datafile", $3); };
o_var_model_name : symbol { driver.option_str("var_estimation.model_name", $1); };
o_var_eq_tags : EQTAGS EQUAL vec_str { driver.option_vec_str("var.eqtags", $3); }
o_dirname : DIRNAME EQUAL filename { driver.option_str("dirname", $3); };
o_huge_number : HUGE_NUMBER EQUAL non_negative_number { driver.option_num("huge_number", $3); };
o_nobs : NOBS EQUAL vec_int
@ -3820,6 +3824,22 @@ vec_int : vec_int_1 ']'
{ $$ = $1; }
;
vec_str_1 : '[' QUOTED_STRING
{ $$ = new vector<string>(); $$->push_back(*$2); delete $2; }
| '[' COMMA QUOTED_STRING
{ $$ = new vector<string>(); $$->push_back(*$3); delete $3; }
| vec_str_1 QUOTED_STRING
{ $$->push_back(*$2); delete $2; }
| vec_str_1 COMMA QUOTED_STRING
{ $$->push_back(*$3); delete $3; }
;
vec_str : vec_str_1 ']'
{ $$ = $1; }
| vec_str_1 COMMA ']'
{ $$ = $1; }
;
vec_value_1 : '[' signed_number { $2->insert(0,"["); $$ = $2; }
| '[' COMMA signed_number { $3->insert(0,"["); $$ = $3; }
| vec_value_1 signed_number

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2017 Dynare Team
* Copyright (C) 2003-2018 Dynare Team
*
* This file is part of Dynare.
*
@ -481,6 +481,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
return token::ABAND;
}
<DYNARE_STATEMENT>write_equation_tags {return token::WRITE_EQUATION_TAGS;}
<DYNARE_STATEMENT>eqtags {return token::EQTAGS;}
<DYNARE_STATEMENT>indxap {return token::INDXAP;}
<DYNARE_STATEMENT>apband {return token::APBAND;}
<DYNARE_STATEMENT>indximf {return token::INDXIMF;}
@ -960,19 +961,20 @@ DATE -?[0-9]+([YyAa]|[Mm]([1-9]|1[0-2])|[Qq][1-4]|[Ww]([1-9]{1}|[1-4][0-9]|5[0-2
yytextcpy.erase(remove(yytextcpy.begin(), yytextcpy.end(), ' '), yytextcpy.end());
istringstream ss(yytextcpy);
string token;
yylval->vector_string_val = new vector<string *>;
yylval->vector_string_val = new vector<string>;
yylval->vector_string_p_val = new vector<string *>;
bool dynare_statement = true;
while(getline(ss, token, ','))
if (driver.symbol_exists_and_is_not_modfile_local_or_external_function(token.c_str()))
yylval->vector_string_val->push_back(new string(token));
yylval->vector_string_p_val->push_back(new string(token));
else
{
for (vector<string *>::iterator it=yylval->vector_string_val->begin();
it != yylval->vector_string_val->end(); it++)
for (vector<string *>::iterator it=yylval->vector_string_p_val->begin();
it != yylval->vector_string_p_val->end(); it++)
delete *it;
delete yylval->vector_string_val;
delete yylval->vector_string_p_val;
BEGIN NATIVE;
yyless(0);
dynare_statement = false;

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2017 Dynare Team
* Copyright (C) 2003-2018 Dynare Team
*
* This file is part of Dynare.
*
@ -1454,6 +1454,21 @@ ParsingDriver::option_vec_int(const string &name_option, const vector<int> *opt)
delete opt;
}
void
ParsingDriver::option_vec_str(const string &name_option, const vector<string> *opt)
{
if (options_list.vector_str_options.find(name_option)
!= options_list.vector_str_options.end())
error("option " + name_option + " declared twice");
if ((*opt).empty())
error("option " + name_option + " was passed an empty vector.");
options_list.vector_str_options[name_option] = *opt;
delete opt;
}
void
ParsingDriver::linear()
{

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2017 Dynare Team
* Copyright (C) 2003-2018 Dynare Team
*
* This file is part of Dynare.
*
@ -444,6 +444,8 @@ public:
void option_symbol_list(const string &name_option);
//! Sets an option to a vector of integers
void option_vec_int(const string &name_option, const vector<int> *opt);
//! Sets an option to a vector of strings
void option_vec_str(const string &name_option, const vector<string> *opt);
//! Indicates that the model is linear
void linear();
//! Adds a variable to temporary symbol list

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2006-2017 Dynare Team
* Copyright (C) 2006-2018 Dynare Team
*
* This file is part of Dynare.
*
@ -178,6 +178,22 @@ OptionsList::writeOutput(ostream &output) const
else
output << it->second.front() << ";" << endl;
}
for (vec_str_options_t::const_iterator it = vector_str_options.begin();
it != vector_str_options.end(); it++)
{
output << "options_." << it->first << " = ";
if (it->second.size() > 1)
{
output << "[";
for (vector<string>::const_iterator viit = it->second.begin();
viit != it->second.end(); viit++)
output << "'" << *viit << "';";
output << "];" << endl;
}
else
output << it->second.front() << ";" << endl;
}
}
void
@ -230,6 +246,22 @@ OptionsList::writeOutput(ostream &output, const string &option_group) const
else
output << it->second.front() << ";" << endl;
}
for (vec_str_options_t::const_iterator it = vector_str_options.begin();
it != vector_str_options.end(); it++)
{
output << option_group << "." << it->first << " = ";
if (it->second.size() > 1)
{
output << "[";
for (vector<string>::const_iterator viit = it->second.begin();
viit != it->second.end(); viit++)
output << "'" << *viit << "';";
output << "];" << endl;
}
else
output << it->second.front() << ";" << endl;
}
}
void
@ -323,6 +355,30 @@ OptionsList::writeJsonOutput(ostream &output) const
output << ", ";
}
for (vec_str_options_t::const_iterator it = vector_str_options.begin();
it != vector_str_options.end();)
{
output << "\""<< it->first << "\": [";
if (it->second.size() > 1)
{
for (vector<string>::const_iterator viit = it->second.begin();
viit != it->second.end();)
{
output << "\"" << *viit << "\"";
viit++;
if (viit != it->second.end())
output << ", ";
}
}
else
output << it->second.front() << endl;
output << "]";
it++;
if (it != vector_str_options.end())
output << ", ";
}
output << "}";
}
@ -335,6 +391,7 @@ OptionsList::clear()
date_options.clear();
symbol_list_options.clear();
vector_int_options.clear();
vector_str_options.clear();
}
int
@ -345,5 +402,6 @@ OptionsList::getNumberOfOptions() const
+ string_options.size()
+ date_options.size()
+ symbol_list_options.size()
+ vector_int_options.size();
+ vector_int_options.size()
+ vector_str_options.size();
}

View File

@ -179,12 +179,14 @@ public:
typedef map<string, string> date_options_t;
typedef map<string, SymbolList> symbol_list_options_t;
typedef map<string, vector<int> > vec_int_options_t;
typedef map<string, vector<string > > vec_str_options_t;
num_options_t num_options;
paired_num_options_t paired_num_options;
string_options_t string_options;
date_options_t date_options;
symbol_list_options_t symbol_list_options;
vec_int_options_t vector_int_options;
vec_str_options_t vector_str_options;
int getNumberOfOptions() const;
void writeOutput(ostream &output) const;
void writeOutput(ostream &output, const string &option_group) const;