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-bf33cf982152time-shift
parent
d90393f9df
commit
f60bb42588
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue