changed preprocessor internals to support vector<int> type. changed svar_identification to store symbols by symbol ids. Added missing Doxygen comments.

git-svn-id: https://www.dynare.org/svn/dynare/trunk@3240 ac1d8469-bf42-47a9-8791-bf33cf982152
issue#70
houtanb 2009-12-14 15:54:00 +00:00
parent 07d536d020
commit 04aa1dbdb3
6 changed files with 61 additions and 74 deletions

View File

@ -1126,7 +1126,7 @@ SvarIdentificationStatement::writeOutput(ostream &output, const string &basename
{
for (unsigned int h = 0; h < it->second.size(); h++)
{
int j = symbol_table.getTypeSpecificID(it->second.at(h)) + 1;
int j = it->second.at(h) + 1;
int i = it->first.second;
if (j < 1 || j > n || (int)h+1 > n || i < 1)
{
@ -1252,7 +1252,6 @@ SvarStatement::writeOutput(ostream &output, const string &basename) const
for (vector<int>::const_iterator viit=itv->second.begin();
viit!=itv->second.end(); viit++)
output << *viit << ";";
output.seekp((long)output.tellp()-1);
output << "];" << endl;
}
else if (itv->second.size() == 1)

View File

@ -492,7 +492,7 @@ public:
class SvarIdentificationStatement : public Statement
{
public:
typedef map<pair<int, int>, vector<string> > svar_identification_exclusion_type;
typedef map<pair<int, int>, vector<int> > svar_identification_exclusion_type;
private:
const svar_identification_exclusion_type exclusion;
const bool upper_cholesky_present;

View File

@ -163,12 +163,12 @@ class ParsingDriver;
%type <node_val> equation hand_side model_var
%type <string_val> signed_float signed_integer prior
%type <string_val> filename symbol
%type <string_val> value value1 vec_int_elem vec_int_1 vec_int
%type <string_val> value value1
%type <string_val> vec_value_1 vec_value
%type <string_val> calib_arg2 range number
%type <symbol_type_val> change_type_arg
%type <vector_string_val> change_type_var_list
%type <vector_int_val> vector_int_body vector_int
%type <vector_int_val> vec_int_elem vec_int_1 vec_int vec_int_number
%%
@ -1667,15 +1667,15 @@ o_simul_seed : SIMUL_SEED EQUAL INT_NUMBER { driver.option_num("simul_seed", $3)
o_qz_criterium : QZ_CRITERIUM EQUAL number { driver.option_num("qz_criterium", $3); };
o_datafile : DATAFILE EQUAL filename { driver.option_str("datafile", $3); };
o_nobs : NOBS EQUAL vec_int
{ driver.option_num("nobs", $3); }
| NOBS EQUAL INT_NUMBER
{ driver.option_num("nobs", $3); }
{ driver.option_vec_int("nobs", $3); }
| NOBS EQUAL vec_int_number
{ driver.option_vec_int("nobs", $3); }
;
o_conditional_variance_decomposition : CONDITIONAL_VARIANCE_DECOMPOSITION EQUAL vec_int
{ driver.option_num("conditional_variance_decomposition", $3); }
| CONDITIONAL_VARIANCE_DECOMPOSITION EQUAL INT_NUMBER
{ driver.option_num("conditional_variance_decomposition", $3); }
;
{ driver.option_vec_int("conditional_variance_decomposition", $3); }
| CONDITIONAL_VARIANCE_DECOMPOSITION EQUAL vec_int_number
{ driver.option_vec_int("conditional_variance_decomposition", $3); }
;
o_first_obs : FIRST_OBS EQUAL INT_NUMBER { driver.option_num("first_obs", $3); };
o_prefilter : PREFILTER EQUAL INT_NUMBER { driver.option_num("prefilter", $3); };
o_presample : PRESAMPLE EQUAL INT_NUMBER { driver.option_num("presample", $3); };
@ -1720,7 +1720,7 @@ o_print : PRINT { driver.option_num("noprint", "0"); };
o_noprint : NOPRINT { driver.option_num("noprint", "1"); };
o_xls_sheet : XLS_SHEET EQUAL symbol { driver.option_str("xls_sheet", $3); };
o_xls_range : XLS_RANGE EQUAL range { driver.option_str("xls_range", $3); };
o_filter_step_ahead : FILTER_STEP_AHEAD EQUAL vec_int { driver.option_num("filter_step_ahead", $3); };
o_filter_step_ahead : FILTER_STEP_AHEAD EQUAL vec_int { driver.option_vec_int("filter_step_ahead", $3); };
o_constant : CONSTANT { driver.option_num("noconstant", "0"); };
o_noconstant : NOCONSTANT { driver.option_num("noconstant", "1"); };
o_mh_recover : MH_RECOVER { driver.option_num("mh_recover", "1"); };
@ -1873,41 +1873,12 @@ o_number_of_states : NUMBER_OF_STATES EQUAL INT_NUMBER { driver.option_num("ms.n
o_coefficients : COEFFICIENTS { driver.option_str("ms.coefficients","svar_coefficients"); };
o_variances : VARIANCES { driver.option_str("ms.variances","svar_variances"); };
o_constants : CONSTANTS { driver.option_str("ms.constants","svar_constants"); };
o_equations : EQUATIONS EQUAL vector_int
o_equations : EQUATIONS EQUAL vec_int
{ driver.option_vec_int("ms.equations",$3); }
| EQUATIONS EQUAL vec_int_number
{ driver.option_vec_int("ms.equations",$3); }
| EQUATIONS EQUAL INT_NUMBER
{
vector<int> *oneInt = new vector<int>();
oneInt->push_back(atoi((*$3).c_str()));
driver.option_vec_int("ms.equations",oneInt);
delete oneInt;
}
;
vector_int_body : INT_NUMBER
{ $$ = new vector<int>(); $$->push_back(atoi((*$1).c_str())); }
| vector_int_body INT_NUMBER
{ $$ = $1; $1->push_back(atoi((*$2).c_str())); }
| vector_int_body COMMA INT_NUMBER
{ $$ = $1; $1->push_back(atoi((*$3).c_str())); }
;
vector_int : '[' vector_int_body ']'
{ $$ = $2; }
| '[' vector_int_body COMMA ']'
{ $$ = $2; }
| '[' COMMA vector_int_body ']'
{ $$ = $3; }
| '[' COMMA vector_int_body COMMA ']'
{ $$ = $3; }
| '[' INT_NUMBER ':' INT_NUMBER ']'
{
$$ = new vector<int>();
for(int i=atoi((*$2).c_str()); i<=atoi((*$4).c_str()); i++)
$$->push_back(i);
}
;
o_instruments : INSTRUMENTS EQUAL '(' symbol_list ')' {driver.option_symbol_list("instruments"); };
range : symbol ':' symbol
@ -1918,38 +1889,45 @@ range : symbol ':' symbol
$$ = $1;
};
vec_int_elem : INT_NUMBER
vec_int_number : INT_NUMBER { $$ = new vector<int>(); $$->push_back(atoi((*$1).c_str())); delete $1; };
vec_int_elem : vec_int_number
| INT_NUMBER ':' INT_NUMBER
{
$1->append(":");
$1->append(*$3);
$$ = new vector<int>();
for(int i=atoi((*$1).c_str()); i<=atoi((*$3).c_str()); i++)
$$->push_back(i);
delete $1;
delete $3;
$$ = $1;
}
;
vec_int_1 : '[' vec_int_elem
{ $2->insert(0, "["); $$ = $2;}
{ $$ = $2;}
| '[' COMMA vec_int_elem
{ $$ = $3;}
| vec_int_1 vec_int_elem
{
$1->append(" ");
$1->append(*$2);
delete $2;
$$ = $1;
for (vector<int>::const_iterator it=$2->begin();
it!=$2->end(); it++)
$1->push_back(*it);
delete $2;
}
| vec_int_1 COMMA vec_int_elem
{
$1->append(",");
$1->append(*$3);
delete $3;
$$ = $1;
for (vector<int>::const_iterator it=$3->begin();
it!=$3->end(); it++)
$1->push_back(*it);
delete $3;
}
;
vec_int : vec_int_1 ']'
{ $1->append("]"); $$ = $1; }
{ $$ = $1; }
| vec_int_1 COMMA ']'
{ $1->append(",]"); $$ = $1; }
{ $$ = $1; }
;
vec_value_1 : '[' value1

View File

@ -608,7 +608,7 @@ ParsingDriver::combine_lag_and_restriction(string *lag)
if (it->first.first == current_lag)
error("lag " + *lag + " used more than once.");
for(map<int, vector<string> >::const_iterator it = svar_equation_restrictions.begin();
for(map<int, vector<int> >::const_iterator it = svar_equation_restrictions.begin();
it != svar_equation_restrictions.end(); it++ )
svar_ident_exclusion_values[make_pair(current_lag, it->first)] = it->second;
@ -638,14 +638,18 @@ void
ParsingDriver::add_in_svar_restriction_symbols(string *tmp_var)
{
check_symbol_existence(*tmp_var);
for (unsigned int i=0; i<svar_restriction_symbols.size(); i++)
if (*tmp_var==svar_restriction_symbols.at(i))
int symb_id = mod_file->symbol_table.getID(*tmp_var);
for (vector<int>::const_iterator viit=svar_restriction_symbols.begin();
viit!=svar_restriction_symbols.end(); viit++)
if (symb_id==*viit)
error(*tmp_var + " restriction added twice.");
svar_restriction_symbols.push_back(*tmp_var);
svar_restriction_symbols.push_back(symb_id);
delete tmp_var;
}
void
ParsingDriver::add_upper_cholesky()
{
@ -768,7 +772,11 @@ ParsingDriver::option_vec_int(const string &name_option, const vector<int> *opt)
!= options_list.vector_int_options.end())
error("option " + name_option + " declared twice");
if ((*opt).empty())
error("option " + name_option + " was passed an empty vector.");
options_list.vector_int_options[name_option] = *opt;
delete opt;
}
void
@ -1234,14 +1242,9 @@ ParsingDriver::svar()
itv = options_list.vector_int_options.find("ms.equations");
if (itv != options_list.vector_int_options.end())
{
if (itv->second.empty())
error("There was an error in the integers passed to the equation option.");
for (vector<int>::const_iterator viit=itv->second.begin(); viit != itv->second.end(); viit++)
if (*viit <= 0)
error("The value(s) passed to the equation option must be greater than zero.");
}
for (vector<int>::const_iterator viit=itv->second.begin(); viit != itv->second.end(); viit++)
if (*viit <= 0)
error("The value(s) passed to the equation option must be greater than zero.");
mod_file->addStatement(new SvarStatement(options_list));
options_list.clear();

View File

@ -145,9 +145,13 @@ private:
HomotopyStatement::homotopy_values_type homotopy_values;
//! Temporary storage for svar_identification blocks
SvarIdentificationStatement::svar_identification_exclusion_type svar_ident_exclusion_values;
map<int, vector<string> > svar_equation_restrictions;
vector<string> svar_restriction_symbols;
//! Temporary storage for mapping the equation number to the restrictions within an svar_identification bock
map<int, vector<int> > svar_equation_restrictions;
//! Temporary storage for restrictions in an equation within an svar_identification bock
vector<int> svar_restriction_symbols;
//! Temporary storage for upper cholesky within an svar_identification bock
bool svar_upper_cholesky;
//! Temporary storage for lower cholesky within an svar_identification bock
bool svar_lower_cholesky;
//! Temporary storage for argument list of unknown function
@ -328,10 +332,15 @@ public:
void set_varobs();
//! Svar_Identification Statement
void end_svar_identification();
//! Svar_Identification Statement: match list of restrictions and equation number with lag
void combine_lag_and_restriction(string *lag);
//! Svar_Identification Statement: match list of restrictions with equation number
void add_restriction_in_equation(string *equation);
//! Svar_Identification Statement: add list of restriction symbol ids
void add_in_svar_restriction_symbols(string *name);
//! Svar_Identification Statement: restriction of form upper cholesky
void add_upper_cholesky();
//! Svar_Identification Statement: restriction of form lower cholesky
void add_lower_cholesky();
//! Forecast Statement
void forecast();

View File

@ -91,7 +91,6 @@ OptionsList::writeOutput(ostream &output) const
for (vector<int>::const_iterator viit=it->second.begin();
viit!=it->second.end(); viit++)
output << *viit << ";";
output.seekp((long)output.tellp()-1);
output << "];" << endl;
}
else
@ -131,7 +130,6 @@ OptionsList::writeOutput(ostream &output, const string &option_group) const
for (vector<int>::const_iterator viit=it->second.begin();
viit!=it->second.end(); viit++)
output << *viit << ";";
output.seekp((long)output.tellp()-1);
output << "];" << endl;
}
else