v4 parser: corrected bug for normcdf in DynareBison.yy

begin implementation of homotopy (not finished)


git-svn-id: https://www.dynare.org/svn/dynare/dynare_v4@1461 ac1d8469-bf42-47a9-8791-bf33cf982152
time-shift
michel 2007-11-26 16:31:48 +00:00
parent d90393f9df
commit f60bb42588
9 changed files with 2301 additions and 2156 deletions

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -71,6 +71,7 @@ class ParsingDriver;
%token VALUES VAR VAREXO VAREXO_DET VAROBS
%token XLS_SHEET XLS_RANGE
%token NORMCDF
%token HOMOTOPY_SETUP HOMOTOPY_MODE HOMOTOPY_STEPS
%left LESS GREATER LESS_EQUAL GREATER_EQUAL EQUAL_EQUAL EXCLAMATION EXCLAMATION_EQUAL
%left COMMA
%left PLUS MINUS
@ -139,6 +140,7 @@ statement : declaration
| bvar_density
| bvar_forecast
| dynare_sensitivity
| homotopy_setup
;
declaration : parameters
@ -446,7 +448,7 @@ hand_side : '(' hand_side ')'
{ $$ = driver.add_max($3 , $5); }
| MIN '(' hand_side COMMA hand_side ')'
{ $$ = driver.add_min($3 , $5); }
| NORMCDF '(' expression COMMA expression COMMA expression ')'
| NORMCDF '(' hand_side COMMA hand_side COMMA hand_side ')'
{ $$ = driver.add_normcdf($3,$5,$7);}
;
@ -541,7 +543,10 @@ steady_options_list : steady_options_list COMMA steady_options
| steady_options
;
steady_options : o_solve_algo;
steady_options : o_solve_algo
| o_homotopy_mode
| o_homotopy_steps
;
check : CHECK ';'
{ driver.check(); }
@ -1187,6 +1192,16 @@ dynare_sensitivity_option : o_gsa_identification
| o_gsa_threshold_redform
;
homotopy_setup: HOMOTOPY_SETUP ';' homotopy_list END
{ driver.end_homotopy();};
homotopy_list : homotopy_item
| homotopy_list homotopy_item
;
homotopy_item : NAME COMMA expression COMMA expression ';'
{ driver.homotopy_val($1,$3,$5);};
number : INT_NUMBER
| FLOAT_NUMBER
;
@ -1318,6 +1333,8 @@ o_gsa_istart_rmse : ISTART_RMSE EQUAL INT_NUMBER { driver.option_num("istart_rms
o_gsa_alpha_rmse : ALPHA_RMSE EQUAL number { driver.option_num("alpha_rmse", $3); };
o_gsa_alpha2_rmse : ALPHA2_RMSE EQUAL number { driver.option_num("alpha2_rmse", $3); };
o_homotopy_mode : HOMOTOPY_MODE EQUAL INT_NUMBER {driver.option_num("homotopy_mode",$3); };
o_homotopy_steps : HOMOTOPY_STEPS EQUAL INT_NUMBER {driver.option_num("homotopy_steps",$3); };
range : NAME ':' NAME
{

View File

@ -107,6 +107,7 @@ int sigma_e = 0;
<INITIAL>observation_trends {BEGIN DYNARE_BLOCK; return token::OBSERVATION_TRENDS;}
<INITIAL>optim_weights {BEGIN DYNARE_BLOCK; return token::OPTIM_WEIGHTS;}
<INITIAL>calib_var {BEGIN DYNARE_BLOCK; return token::CALIB_VAR;}
<INITIAL>homotopy_setup {BEGIN DYNARE_BLOCK; return token::HOMOTOPY_SETUP;}
/* End of a Dynare block */
<DYNARE_BLOCK>end[ \t\n]*; {BEGIN INITIAL; return token::END;}
@ -171,6 +172,9 @@ int sigma_e = 0;
<DYNARE_STATEMENT>bvar_prior_train { return token::BVAR_PRIOR_TRAIN; }
<DYNARE_STATEMENT>bvar_replic { return token::BVAR_REPLIC; }
<DYNARE_STATEMENT>homotopy_mode {return token::HOMOTOPY_MODE; }
<DYNARE_STATEMENT>homotopy_steps {return token::HOMOTOPY_STEPS; }
<DYNARE_STATEMENT>[\$][^$]*[\$] {
strtok(yytext+1, "$");
yylval->string_val = new string(yytext + 1);

View File

@ -133,3 +133,48 @@ HistValStatement::writeOutput(ostream &output, const string &basename) const
output << ";" << endl;
}
}
HomotopyStatement::HomotopyStatement(const homotopy_values_type &homotopy_values_arg,
const SymbolTable &symbol_table_arg) :
homotopy_values(homotopy_values_arg),
symbol_table(symbol_table_arg)
{
}
void
HomotopyStatement::writeOutput(ostream &output, const string &basename) const
{
output << interfaces::comment() << "\n" << interfaces::comment() << "HOMOTOPY_SETUP instructions\n"
<< interfaces::comment() << "\n";
output << "homotopy_param = {};" << endl;
output << "homotopy_exo = {};" << endl;
output << "homotopy_exodet = {};" << endl;
for(homotopy_values_type::const_iterator it = homotopy_values.begin();
it != homotopy_values.end(); it++)
{
const string &name = it->first;
const NodeID expression1 = it->second.first;
const NodeID expression2 = it->second.second;
Type type = symbol_table.getType(name);
if (type == eParameter)
output << "homotopy_param = vertcat(homotopy_param,{ '" << name << "', ";
else if (type == eExogenous)
output << "homotopy_exo = vertcat(homotopy_exo,{ '" << name << "', ";
else if (type != eExogenousDet)
output << "homotopy_exodet = vertcat(homotopy_exodet,{ '" << name << "', ";
expression1->writeOutput(output);
output << ", ";
expression2->writeOutput(output);
output << "});" << endl;
}
output << "options_.homotopy_param = homotopy_param;" << endl;
output << "options_.homotopy_exo = homotopy_exo;" << endl;
output << "options_.homotopy_exodet = homotopy_exodet;" << endl;
}

View File

@ -308,6 +308,26 @@ ParsingDriver::hist_val(string *name, string *lag, NodeID rhs)
delete lag;
}
void
ParsingDriver::homotopy_val(string *name, NodeID val1, NodeID val2)
{
check_symbol_existence(*name);
Type type = mod_file->symbol_table.getType(*name);
if (type != eParameter
&& type != eExogenous
&& type != eExogenousDet)
error("homotopy_val: " + *name + " should be a parameter or exogenous variable");
if (homotopy_values.find(*name) != homotopy_values.end())
error("homotopy_val: " + *name +" declared twice");
pair<NodeID, NodeID> expressions(val1, val2);
homotopy_values[*name] = expressions;
delete name;
}
void
ParsingDriver::use_dll()
{
@ -349,6 +369,13 @@ ParsingDriver::end_histval()
hist_values.clear();
}
void
ParsingDriver::end_homotopy()
{
mod_file->addStatement(new HomotopyStatement(homotopy_values, mod_file->symbol_table));
homotopy_values.clear();
}
void
ParsingDriver::begin_model()
{

View File

@ -262,68 +262,71 @@ namespace yy
XLS_SHEET = 390,
XLS_RANGE = 391,
NORMCDF = 392,
EXCLAMATION_EQUAL = 393,
EXCLAMATION = 394,
EQUAL_EQUAL = 395,
GREATER_EQUAL = 396,
LESS_EQUAL = 397,
GREATER = 398,
LESS = 399,
COMMA = 400,
MINUS = 401,
PLUS = 402,
DIVIDE = 403,
TIMES = 404,
UMINUS = 405,
POWER = 406,
EXP = 407,
LOG = 408,
LOG10 = 409,
SIN = 410,
COS = 411,
TAN = 412,
ASIN = 413,
ACOS = 414,
ATAN = 415,
SINH = 416,
COSH = 417,
TANH = 418,
ASINH = 419,
ACOSH = 420,
ATANH = 421,
SQRT = 422,
DYNARE_SENSITIVITY = 423,
IDENTIFICATION = 424,
MORRIS = 425,
STAB = 426,
REDFORM = 427,
PPRIOR = 428,
PRIOR_RANGE = 429,
PPOST = 430,
ILPTAU = 431,
GLUE = 432,
MORRIS_NLIV = 433,
MORRIS_NTRA = 434,
NSAM = 435,
LOAD_REDFORM = 436,
LOAD_RMSE = 437,
LOAD_STAB = 438,
ALPHA2_STAB = 439,
KSSTAT = 440,
LOGTRANS_REDFORM = 441,
THRESHOLD_REDFORM = 442,
KSSTAT_REDFORM = 443,
ALPHA2_REDFORM = 444,
NAMENDO = 445,
NAMLAGENDO = 446,
NAMEXO = 447,
RMSE = 448,
LIK_ONLY = 449,
VAR_RMSE = 450,
PFILT_RMSE = 451,
ISTART_RMSE = 452,
ALPHA_RMSE = 453,
ALPHA2_RMSE = 454
HOMOTOPY_SETUP = 393,
HOMOTOPY_MODE = 394,
HOMOTOPY_STEPS = 395,
EXCLAMATION_EQUAL = 396,
EXCLAMATION = 397,
EQUAL_EQUAL = 398,
GREATER_EQUAL = 399,
LESS_EQUAL = 400,
GREATER = 401,
LESS = 402,
COMMA = 403,
MINUS = 404,
PLUS = 405,
DIVIDE = 406,
TIMES = 407,
UMINUS = 408,
POWER = 409,
EXP = 410,
LOG = 411,
LOG10 = 412,
SIN = 413,
COS = 414,
TAN = 415,
ASIN = 416,
ACOS = 417,
ATAN = 418,
SINH = 419,
COSH = 420,
TANH = 421,
ASINH = 422,
ACOSH = 423,
ATANH = 424,
SQRT = 425,
DYNARE_SENSITIVITY = 426,
IDENTIFICATION = 427,
MORRIS = 428,
STAB = 429,
REDFORM = 430,
PPRIOR = 431,
PRIOR_RANGE = 432,
PPOST = 433,
ILPTAU = 434,
GLUE = 435,
MORRIS_NLIV = 436,
MORRIS_NTRA = 437,
NSAM = 438,
LOAD_REDFORM = 439,
LOAD_RMSE = 440,
LOAD_STAB = 441,
ALPHA2_STAB = 442,
KSSTAT = 443,
LOGTRANS_REDFORM = 444,
THRESHOLD_REDFORM = 445,
KSSTAT_REDFORM = 446,
ALPHA2_REDFORM = 447,
NAMENDO = 448,
NAMLAGENDO = 449,
NAMEXO = 450,
RMSE = 451,
LIK_ONLY = 452,
VAR_RMSE = 453,
PFILT_RMSE = 454,
ISTART_RMSE = 455,
ALPHA_RMSE = 456,
ALPHA2_RMSE = 457
};
};

View File

@ -73,4 +73,20 @@ public:
virtual void writeOutput(ostream &output, const string &basename) const;
};
class HomotopyStatement : public Statement
{
public:
/*!
Contrary to Initval and Endval, we use a map, since it is impossible to reuse
a given initialization value in a second initialization inside the block.
*/
typedef map<string,pair<NodeID,NodeID> > homotopy_values_type;
private:
const homotopy_values_type homotopy_values;
const SymbolTable &symbol_table;
public:
HomotopyStatement(const homotopy_values_type &homotopy_values_arg,
const SymbolTable &symbol_table_arg);
virtual void writeOutput(ostream &output, const string &basename) const;
};
#endif

View File

@ -98,6 +98,8 @@ private:
InitOrEndValStatement::init_values_type init_values;
//! Temporary storage for histval blocks
HistValStatement::hist_values_type hist_values;
//! Temporary storage for homotopy_setup blocks
HomotopyStatement::homotopy_values_type homotopy_values;
//! Temporary storage for argument list of unknown function
vector<NodeID> unknown_function_args;
@ -195,12 +197,16 @@ public:
void init_val(string *name, NodeID rhs);
//! Writes an histval block
void hist_val(string *name, string *lag, NodeID rhs);
//! Writes an homotopy_setup block
void homotopy_val(string *name, NodeID val1, NodeID val2);
//! Writes end of an initval block
void end_initval();
//! Writes end of an endval block
void end_endval();
//! Writes end of an histval block
void end_histval();
//! Writes end of an homotopy_setup block
void end_homotopy();
//! Begin a model block
void begin_model();
//! Writes a shocks statement