time-shift
Johannes Pfeifer 2013-03-27 12:26:43 +01:00
commit 9e9f882c81
20 changed files with 351 additions and 207 deletions

View File

@ -364,7 +364,7 @@ If you want to give a URL, use the address of the Dynare website:
@node Software requirements @node Software requirements
@section Software requirements @section Software requirements
Packaged versions of Dynare are available for Windows XP/Vista/Seven, Packaged versions of Dynare are available for Windows XP/Vista/7/8,
@uref{http://www.debian.org,Debian GNU/Linux}, @uref{http://www.debian.org,Debian GNU/Linux},
@uref{http://www.ubuntu.com/,Ubuntu} and Mac OS X Leopard/Snow @uref{http://www.ubuntu.com/,Ubuntu} and Mac OS X Leopard/Snow
Leopard. Dynare should work on other systems, but some compilation Leopard. Dynare should work on other systems, but some compilation
@ -884,6 +884,7 @@ Declarations of variables and parameters are made with the following commands:
@deffn Command var @var{VARIABLE_NAME} [$@var{LATEX_NAME}$]@dots{}; @deffn Command var @var{VARIABLE_NAME} [$@var{LATEX_NAME}$]@dots{};
@deffnx Command var (deflator = @var{MODEL_EXPRESSION}) @var{VARIABLE_NAME} [$@var{LATEX_NAME}$]@dots{}; @deffnx Command var (deflator = @var{MODEL_EXPRESSION}) @var{VARIABLE_NAME} [$@var{LATEX_NAME}$]@dots{};
@deffnx Command var (log_deflator = @var{MODEL_EXPRESSION}) @var{VARIABLE_NAME} [$@var{LATEX_NAME}$]@dots{};
@descriptionhead @descriptionhead
@ -910,7 +911,15 @@ trend.
The expression used to detrend an endogenous variable. All trend The expression used to detrend an endogenous variable. All trend
variables, endogenous variables and parameters referenced in variables, endogenous variables and parameters referenced in
@var{MODEL_EXPRESSION} must already have been declared by the @var{MODEL_EXPRESSION} must already have been declared by the
@code{trend_var}, @code{var} and @code{parameters} commands. @code{trend_var}, @code{log_trend_var}, @code{var} and
@code{parameters} commands. The deflator is assumed to be
multiplicative; for an additive deflator, use @code{log_deflator}.
@item log_deflator = @var{MODEL_EXPRESSION}
Same as @code{deflator}, except that the deflator is assumed to be
additive instead of multiplicative (or, to put it otherwise, the
declared variable is equal to the log of a variable with a
multiplicative trend).
@end table @end table
@examplehead @examplehead
@ -1093,6 +1102,9 @@ model. @xref{Conventions}, for the syntax of @var{MODEL_EXPRESSION} and
@var{VARIABLE_NAME}. Optionally it is possible to give a LaTeX name to @var{VARIABLE_NAME}. Optionally it is possible to give a LaTeX name to
the variable. the variable.
The variable is assumed to have a multiplicative growth trend. For an
additive growth trend, use @code{log_trend_var} instead.
Trend variables are required if the user wants to be able to write a Trend variables are required if the user wants to be able to write a
nonstationary model in the @code{model} block. The @code{trend_var} nonstationary model in the @code{model} block. The @code{trend_var}
command must appear before the @code{var} command that references the command must appear before the @code{var} command that references the
@ -1117,6 +1129,17 @@ trend_var (growth_factor=gA) A;
@end deffn @end deffn
@deffn Command log_trend_var (log_growth_factor = @var{MODEL_EXPRESSION}) @var{VARIABLE_NAME} [$@var{LATEX_NAME}$]@dots{};
@descriptionhead
Same as @code{trend_var}, except that the variable is supposed to have
an additive trend (or, to put it otherwise, to be equal to the log of
a variable with a multiplicative trend).
@end deffn
@node Expressions @node Expressions
@section Expressions @section Expressions
@ -7265,7 +7288,7 @@ is @file{$HOME/.dynare}, while on Windows it is
@file{%APPDATA%\dynare.ini} (typically @file{C:\Documents and @file{%APPDATA%\dynare.ini} (typically @file{C:\Documents and
Settings\@var{USERNAME}\Application Data\dynare.ini} under Windows XP, Settings\@var{USERNAME}\Application Data\dynare.ini} under Windows XP,
or @file{C:\Users\@var{USERNAME}\AppData\dynare.ini} under Windows or @file{C:\Users\@var{USERNAME}\AppData\dynare.ini} under Windows
Vista or Windows 7). You can specify a non standard location using the Vista/7/8). You can specify a non standard location using the
@code{conffile} option of the @code{dynare} command (@pxref{Dynare @code{conffile} option of the @code{dynare} command (@pxref{Dynare
invocation}). invocation}).

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2007-2011 Dynare Team * Copyright (C) 2007-2013 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
@ -148,7 +148,8 @@ enum SymbolType
eModFileLocalVariable = 11, //!< Local variable whose scope is mod file (model excluded) eModFileLocalVariable = 11, //!< Local variable whose scope is mod file (model excluded)
eExternalFunction = 12, //!< External (user-defined) function eExternalFunction = 12, //!< External (user-defined) function
eTrend = 13, //!< Trend variable eTrend = 13, //!< Trend variable
eStatementDeclaredVariable = 14 //!< Local variable assigned within a Statement (see subsample statement for example) eStatementDeclaredVariable = 14, //!< Local variable assigned within a Statement (see subsample statement for example)
eLogTrend = 15 //!< Log-trend variable
}; };
enum ExpressionType enum ExpressionType

View File

@ -3532,6 +3532,7 @@ DynamicModel::computeDerivIDs()
equations[i]->collectVariables(eExogenousDet, dynvars); equations[i]->collectVariables(eExogenousDet, dynvars);
equations[i]->collectVariables(eParameter, dynvars); equations[i]->collectVariables(eParameter, dynvars);
equations[i]->collectVariables(eTrend, dynvars); equations[i]->collectVariables(eTrend, dynvars);
equations[i]->collectVariables(eLogTrend, dynvars);
} }
for (set<pair<int, int> >::const_iterator it = dynvars.begin(); for (set<pair<int, int> >::const_iterator it = dynvars.begin();
@ -3657,6 +3658,7 @@ DynamicModel::computeDynJacobianCols(bool jacobianExo)
break; break;
case eParameter: case eParameter:
case eTrend: case eTrend:
case eLogTrend:
// We don't assign a dynamic jacobian column to parameters or trend variables // We don't assign a dynamic jacobian column to parameters or trend variables
break; break;
default: default:
@ -3692,21 +3694,21 @@ DynamicModel::testTrendDerivativesEqualToZero(const eval_context_t &eval_context
{ {
for (deriv_id_table_t::const_iterator it = deriv_id_table.begin(); for (deriv_id_table_t::const_iterator it = deriv_id_table.begin();
it != deriv_id_table.end(); it++) it != deriv_id_table.end(); it++)
if (symbol_table.getType(it->first.first) == eTrend) if (symbol_table.getType(it->first.first) == eTrend
|| symbol_table.getType(it->first.first) == eLogTrend)
for (int eq = 0; eq < (int) equations.size(); eq++) for (int eq = 0; eq < (int) equations.size(); eq++)
{ {
expr_t testeq = AddLog(AddMinus(equations[eq]->get_arg1(), // F: a = b -> ln(a - b) expr_t testeq = AddLog(AddMinus(equations[eq]->get_arg1(), // F: a = b -> ln(a - b)
equations[eq]->get_arg2())); equations[eq]->get_arg2()));
assert(testeq != NULL);
testeq = testeq->getDerivative(it->second); // d F / d Trend testeq = testeq->getDerivative(it->second); // d F / d Trend
for (deriv_id_table_t::const_iterator endogit = deriv_id_table.begin(); for (deriv_id_table_t::const_iterator endogit = deriv_id_table.begin();
endogit != deriv_id_table.end(); endogit++) endogit != deriv_id_table.end(); endogit++)
if (symbol_table.getType(endogit->first.first) == eEndogenous) if (symbol_table.getType(endogit->first.first) == eEndogenous)
{ {
double nearZero = testeq->getDerivative(endogit->second)->eval(eval_context); // eval d F / d Trend d Endog double nearZero = testeq->getDerivative(endogit->second)->eval(eval_context); // eval d F / d Trend d Endog
if (nearZero < -ZERO_BAND || nearZero > ZERO_BAND) if (fabs(nearZero) > ZERO_BAND)
{ {
cerr << "ERROR: the second-order cross partial of equation " << eq + 1 << " w.r.t. trend variable " cerr << "ERROR: trends not compatible with balanced growth path; the second-order cross partial of equation " << eq + 1 << " w.r.t. trend variable "
<< symbol_table.getName(it->first.first) << " and endogenous variable " << symbol_table.getName(it->first.first) << " and endogenous variable "
<< symbol_table.getName(endogit->first.first) << " is not null. " << endl; << symbol_table.getName(endogit->first.first) << " is not null. " << endl;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -3715,19 +3717,6 @@ DynamicModel::testTrendDerivativesEqualToZero(const eval_context_t &eval_context
} }
} }
void
DynamicModel::print_trend_vars()
{
for (trend_symbols_map_t::const_iterator it = nonstationary_symbols_map.begin();
it != nonstationary_symbols_map.end(); it++)
{
cout << "it->first:" << symbol_table.getName(it->first) << " ";
it->second->print_deflator();
cout << endl;
}
}
void void
DynamicModel::writeParamsDerivativesFile(const string &basename) const DynamicModel::writeParamsDerivativesFile(const string &basename) const
{ {
@ -4109,11 +4098,11 @@ DynamicModel::transformPredeterminedVariables()
void void
DynamicModel::detrendEquations() DynamicModel::detrendEquations()
{ {
for (trend_symbols_map_t::const_iterator it = nonstationary_symbols_map.begin(); for (nonstationary_symbols_map_t::const_iterator it = nonstationary_symbols_map.begin();
it != nonstationary_symbols_map.end(); it++) it != nonstationary_symbols_map.end(); it++)
for (int i = 0; i < (int) equations.size(); i++) for (int i = 0; i < (int) equations.size(); i++)
{ {
BinaryOpNode *substeq = dynamic_cast<BinaryOpNode *>(equations[i]->detrend(it->first, it->second)); BinaryOpNode *substeq = dynamic_cast<BinaryOpNode *>(equations[i]->detrend(it->first, it->second.first, it->second.second));
assert(substeq != NULL); assert(substeq != NULL);
equations[i] = dynamic_cast<BinaryOpNode *>(substeq); equations[i] = dynamic_cast<BinaryOpNode *>(substeq);
} }

View File

@ -230,7 +230,6 @@ public:
virtual int getDerivID(int symb_id, int lag) const throw (UnknownDerivIDException); virtual int getDerivID(int symb_id, int lag) const throw (UnknownDerivIDException);
virtual int getDynJacobianCol(int deriv_id) const throw (UnknownDerivIDException); virtual int getDynJacobianCol(int deriv_id) const throw (UnknownDerivIDException);
virtual void addAllParamDerivId(set<int> &deriv_id_set); virtual void addAllParamDerivId(set<int> &deriv_id_set);
void print_trend_vars();
//! Returns true indicating that this is a dynamic model //! Returns true indicating that this is a dynamic model
virtual bool virtual bool

View File

@ -110,7 +110,7 @@ class ParsingDriver;
%token INV_GAMMA_PDF INV_GAMMA1_PDF INV_GAMMA2_PDF IRF IRF_SHOCKS %token INV_GAMMA_PDF INV_GAMMA1_PDF INV_GAMMA2_PDF IRF IRF_SHOCKS
%token KALMAN_ALGO KALMAN_TOL SUBSAMPLES OPTIONS %token KALMAN_ALGO KALMAN_TOL SUBSAMPLES OPTIONS
%token LABELS LAPLACE LIK_ALGO LIK_INIT LINEAR LOAD_IDENT_FILES LOAD_MH_FILE LOAD_PARAMS_AND_STEADY_STATE LOGLINEAR LYAPUNOV %token LABELS LAPLACE LIK_ALGO LIK_INIT LINEAR LOAD_IDENT_FILES LOAD_MH_FILE LOAD_PARAMS_AND_STEADY_STATE LOGLINEAR LYAPUNOV
%token LYAPUNOV_FIXED_POINT_TOL LYAPUNOV_DOUBLING_TOL LYAPUNOV_SQUARE_ROOT_SOLVER_TOL MARKOWITZ MARGINAL_DENSITY MAX MAXIT %token LYAPUNOV_FIXED_POINT_TOL LYAPUNOV_DOUBLING_TOL LYAPUNOV_SQUARE_ROOT_SOLVER_TOL LOG_DEFLATOR LOG_TREND_VAR LOG_GROWTH_FACTOR MARKOWITZ MARGINAL_DENSITY MAX MAXIT
%token MFS MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER MIN MINIMAL_SOLVING_PERIODS SOLVE_MAXIT %token MFS MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER MIN MINIMAL_SOLVING_PERIODS SOLVE_MAXIT
%token MODE_CHECK MODE_COMPUTE MODE_FILE MODEL MODEL_COMPARISON MODEL_INFO MSHOCKS ABS SIGN %token MODE_CHECK MODE_COMPUTE MODE_FILE MODEL MODEL_COMPARISON MODEL_INFO MSHOCKS ABS SIGN
%token MODEL_DIAGNOSTICS MODIFIEDHARMONICMEAN MOMENTS_VARENDO DIFFUSE_FILTER SUB_DRAWS %token MODEL_DIAGNOSTICS MODIFIEDHARMONICMEAN MOMENTS_VARENDO DIFFUSE_FILTER SUB_DRAWS
@ -262,6 +262,7 @@ statement : parameters
| external_function | external_function
| steady_state_model | steady_state_model
| trend_var | trend_var
| log_trend_var
| ms_estimation | ms_estimation
| ms_simulation | ms_simulation
| ms_compute_mdd | ms_compute_mdd
@ -287,22 +288,42 @@ trend_var : TREND_VAR '(' GROWTH_FACTOR EQUAL { driver.begin_trend(); } hand_sid
; ;
trend_var_list : trend_var_list symbol trend_var_list : trend_var_list symbol
{ driver.declare_trend_var($2); } { driver.declare_trend_var(false, $2); }
| trend_var_list COMMA symbol | trend_var_list COMMA symbol
{ driver.declare_trend_var($3); } { driver.declare_trend_var(false, $3); }
| symbol | symbol
{ driver.declare_trend_var($1); } { driver.declare_trend_var(false, $1); }
| trend_var_list symbol TEX_NAME | trend_var_list symbol TEX_NAME
{ driver.declare_trend_var($2, $3); } { driver.declare_trend_var(false, $2, $3); }
| trend_var_list COMMA symbol TEX_NAME | trend_var_list COMMA symbol TEX_NAME
{ driver.declare_trend_var($3, $4); } { driver.declare_trend_var(false, $3, $4); }
| symbol TEX_NAME | symbol TEX_NAME
{ driver.declare_trend_var($1, $2); } { driver.declare_trend_var(false, $1, $2); }
; ;
log_trend_var : LOG_TREND_VAR '(' LOG_GROWTH_FACTOR EQUAL { driver.begin_trend(); } hand_side ')' log_trend_var_list ';'
{ driver.end_trend_var($6); }
;
log_trend_var_list : log_trend_var_list symbol
{ driver.declare_trend_var(true, $2); }
| log_trend_var_list COMMA symbol
{ driver.declare_trend_var(true, $3); }
| symbol
{ driver.declare_trend_var(true, $1); }
| log_trend_var_list symbol TEX_NAME
{ driver.declare_trend_var(true, $2, $3); }
| log_trend_var_list COMMA symbol TEX_NAME
{ driver.declare_trend_var(true, $3, $4); }
| symbol TEX_NAME
{ driver.declare_trend_var(true, $1, $2); }
;
var : VAR var_list ';' var : VAR var_list ';'
| VAR '(' DEFLATOR EQUAL { driver.begin_trend(); } hand_side ')' nonstationary_var_list ';' | VAR '(' DEFLATOR EQUAL { driver.begin_trend(); } hand_side ')' nonstationary_var_list ';'
{ driver.end_nonstationary_var($6); } { driver.end_nonstationary_var(false, $6); }
| VAR '(' LOG_DEFLATOR EQUAL { driver.begin_trend(); } hand_side ')' nonstationary_var_list ';'
{ driver.end_nonstationary_var(true, $6); }
; ;
nonstationary_var_list : nonstationary_var_list symbol nonstationary_var_list : nonstationary_var_list symbol

View File

@ -103,6 +103,7 @@ string eofbuff;
<INITIAL>varexo {BEGIN DYNARE_STATEMENT; return token::VAREXO;} <INITIAL>varexo {BEGIN DYNARE_STATEMENT; return token::VAREXO;}
<INITIAL>varexo_det {BEGIN DYNARE_STATEMENT; return token::VAREXO_DET;} <INITIAL>varexo_det {BEGIN DYNARE_STATEMENT; return token::VAREXO_DET;}
<INITIAL>trend_var {BEGIN DYNARE_STATEMENT; return token::TREND_VAR;} <INITIAL>trend_var {BEGIN DYNARE_STATEMENT; return token::TREND_VAR;}
<INITIAL>log_trend_var {BEGIN DYNARE_STATEMENT; return token::LOG_TREND_VAR;}
<INITIAL>predetermined_variables {BEGIN DYNARE_STATEMENT; return token::PREDETERMINED_VARIABLES;} <INITIAL>predetermined_variables {BEGIN DYNARE_STATEMENT; return token::PREDETERMINED_VARIABLES;}
<INITIAL>parameters {BEGIN DYNARE_STATEMENT; return token::PARAMETERS;} <INITIAL>parameters {BEGIN DYNARE_STATEMENT; return token::PARAMETERS;}
<INITIAL>periods {BEGIN DYNARE_STATEMENT; return token::PERIODS;} <INITIAL>periods {BEGIN DYNARE_STATEMENT; return token::PERIODS;}
@ -467,7 +468,9 @@ string eofbuff;
<DYNARE_STATEMENT>selected_variables_only {return token::SELECTED_VARIABLES_ONLY; } <DYNARE_STATEMENT>selected_variables_only {return token::SELECTED_VARIABLES_ONLY; }
<DYNARE_STATEMENT>pruning {return token::PRUNING; } <DYNARE_STATEMENT>pruning {return token::PRUNING; }
<DYNARE_STATEMENT>deflator {return token::DEFLATOR;} <DYNARE_STATEMENT>deflator {return token::DEFLATOR;}
<DYNARE_STATEMENT>log_deflator {return token::LOG_DEFLATOR;}
<DYNARE_STATEMENT>growth_factor {return token::GROWTH_FACTOR;} <DYNARE_STATEMENT>growth_factor {return token::GROWTH_FACTOR;}
<DYNARE_STATEMENT>log_growth_factor {return token::LOG_GROWTH_FACTOR;}
<DYNARE_STATEMENT>cova_compute {return token::COVA_COMPUTE;} <DYNARE_STATEMENT>cova_compute {return token::COVA_COMPUTE;}
<DYNARE_STATEMENT>discretionary_tol {return token::DISCRETIONARY_TOL;} <DYNARE_STATEMENT>discretionary_tol {return token::DISCRETIONARY_TOL;}
<DYNARE_STATEMENT>analytic_derivation {return token::ANALYTIC_DERIVATION;} <DYNARE_STATEMENT>analytic_derivation {return token::ANALYTIC_DERIVATION;}

View File

@ -175,64 +175,6 @@ ExprNode::writeExternalFunctionOutput(ostream &output, ExprNodeOutputType output
// Nothing to do // Nothing to do
} }
void
ExprNode::print_deflator()
{
}
void
VariableNode::print_deflator()
{
cout << datatree.symbol_table.getName(symb_id);
}
void
UnaryOpNode::print_deflator()
{
arg->print_deflator();
}
void
BinaryOpNode::print_deflator()
{
arg1->print_deflator();
arg2->print_deflator();
}
void
TrinaryOpNode::print_deflator()
{
arg1->print_deflator();
arg2->print_deflator();
arg3->print_deflator();
}
void
ExternalFunctionNode::print_deflator()
{
}
void
FirstDerivExternalFunctionNode::print_deflator()
{
}
void
SecondDerivExternalFunctionNode::print_deflator()
{
}
void void
ExprNode::compileExternalFunctionOutput(ostream &CompileCode, unsigned int &instruction_number, ExprNode::compileExternalFunctionOutput(ostream &CompileCode, unsigned int &instruction_number,
bool lhs_rhs, const temporary_terms_t &temporary_terms, bool lhs_rhs, const temporary_terms_t &temporary_terms,
@ -355,12 +297,6 @@ NumConstNode::collectTemporary_terms(const temporary_terms_t &temporary_terms, t
temporary_terms_inuse.insert(idx); temporary_terms_inuse.insert(idx);
} }
void
NumConstNode::print_deflator()
{
}
void void
NumConstNode::writeOutput(ostream &output, ExprNodeOutputType output_type, NumConstNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
const temporary_terms_t &temporary_terms, const temporary_terms_t &temporary_terms,
@ -528,7 +464,7 @@ NumConstNode::replaceTrendVar() const
} }
expr_t expr_t
NumConstNode::detrend(int symb_id, expr_t trend) const NumConstNode::detrend(int symb_id, bool log_trend, expr_t trend) const
{ {
return const_cast<NumConstNode *>(this); return const_cast<NumConstNode *>(this);
} }
@ -569,6 +505,7 @@ VariableNode::prepareForDerivation()
case eExogenousDet: case eExogenousDet:
case eParameter: case eParameter:
case eTrend: case eTrend:
case eLogTrend:
// For a variable or a parameter, the only non-null derivative is with respect to itself // For a variable or a parameter, the only non-null derivative is with respect to itself
non_null_derivatives.insert(datatree.getDerivID(symb_id, lag)); non_null_derivatives.insert(datatree.getDerivID(symb_id, lag));
break; break;
@ -597,6 +534,7 @@ VariableNode::computeDerivative(int deriv_id)
case eExogenousDet: case eExogenousDet:
case eParameter: case eParameter:
case eTrend: case eTrend:
case eLogTrend:
if (deriv_id == datatree.getDerivID(symb_id, lag)) if (deriv_id == datatree.getDerivID(symb_id, lag))
return datatree.One; return datatree.One;
else else
@ -649,7 +587,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
output << "\\bar{"; output << "\\bar{";
output << datatree.symbol_table.getTeXName(symb_id); output << datatree.symbol_table.getTeXName(symb_id);
if (output_type == oLatexDynamicModel if (output_type == oLatexDynamicModel
&& (type == eEndogenous || type == eExogenous || type == eExogenousDet || type == eModelLocalVariable || type == eTrend)) && (type == eEndogenous || type == eExogenous || type == eExogenousDet || type == eModelLocalVariable || type == eTrend || type == eLogTrend))
{ {
output << "_{t"; output << "_{t";
if (lag != 0) if (lag != 0)
@ -821,6 +759,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
case eExternalFunction: case eExternalFunction:
case eTrend: case eTrend:
case eLogTrend:
case eStatementDeclaredVariable: case eStatementDeclaredVariable:
cerr << "Impossible case" << endl; cerr << "Impossible case" << endl;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -974,6 +913,7 @@ VariableNode::getChainRuleDerivative(int deriv_id, const map<int, expr_t> &recur
case eExogenousDet: case eExogenousDet:
case eParameter: case eParameter:
case eTrend: case eTrend:
case eLogTrend:
if (deriv_id == datatree.getDerivID(symb_id, lag)) if (deriv_id == datatree.getDerivID(symb_id, lag))
return datatree.One; return datatree.One;
else else
@ -1108,6 +1048,7 @@ VariableNode::decreaseLeadsLags(int n) const
case eExogenous: case eExogenous:
case eExogenousDet: case eExogenousDet:
case eTrend: case eTrend:
case eLogTrend:
return datatree.AddVariable(symb_id, lag-n); return datatree.AddVariable(symb_id, lag-n);
case eModelLocalVariable: case eModelLocalVariable:
return datatree.local_variables_table[symb_id]->decreaseLeadsLags(n); return datatree.local_variables_table[symb_id]->decreaseLeadsLags(n);
@ -1312,43 +1253,76 @@ VariableNode::replaceTrendVar() const
{ {
if (get_type() == eTrend) if (get_type() == eTrend)
return datatree.One; return datatree.One;
else if (get_type() == eLogTrend)
return datatree.Zero;
else else
return const_cast<VariableNode *>(this); return const_cast<VariableNode *>(this);
} }
expr_t expr_t
VariableNode::detrend(int symb_id, expr_t trend) const VariableNode::detrend(int symb_id, bool log_trend, expr_t trend) const
{ {
if (get_symb_id() != symb_id) if (get_symb_id() != symb_id)
return const_cast<VariableNode *>(this); return const_cast<VariableNode *>(this);
if (get_lag() == 0) if (log_trend)
return datatree.AddTimes(const_cast<VariableNode *>(this), trend); {
if (get_lag() == 0)
return datatree.AddPlus(const_cast<VariableNode *>(this), trend);
else
return datatree.AddPlus(const_cast<VariableNode *>(this), trend->decreaseLeadsLags(-1*get_lag()));
}
else else
return datatree.AddTimes(const_cast<VariableNode *>(this), trend->decreaseLeadsLags(-1*get_lag())); {
if (get_lag() == 0)
return datatree.AddTimes(const_cast<VariableNode *>(this), trend);
else
return datatree.AddTimes(const_cast<VariableNode *>(this), trend->decreaseLeadsLags(-1*get_lag()));
}
} }
expr_t expr_t
VariableNode::removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const VariableNode::removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const
{ {
if (get_type() != eTrend || get_lag() == 0) if ((get_type() != eTrend && get_type() != eLogTrend) || get_lag() == 0)
return const_cast<VariableNode *>(this); return const_cast<VariableNode *>(this);
map<int, expr_t>::const_iterator it = trend_symbols_map.find(symb_id); map<int, expr_t>::const_iterator it = trend_symbols_map.find(symb_id);
expr_t noTrendLeadLagNode = new VariableNode(datatree, it->first, 0); expr_t noTrendLeadLagNode = new VariableNode(datatree, it->first, 0);
bool log_trend = get_type() == eLogTrend;
expr_t trend = it->second;
if (get_lag() > 0) if (get_lag() > 0)
{ {
expr_t growthFactorSequence = it->second->decreaseLeadsLags(-1); expr_t growthFactorSequence = trend->decreaseLeadsLags(-1);
for (int i = 1; i < get_lag(); i++) if (log_trend)
growthFactorSequence = datatree.AddTimes(growthFactorSequence, it->second->decreaseLeadsLags(-1*(i+1))); {
return datatree.AddTimes(noTrendLeadLagNode, growthFactorSequence); for (int i = 1; i < get_lag(); i++)
growthFactorSequence = datatree.AddPlus(growthFactorSequence, trend->decreaseLeadsLags(-1*(i+1)));
return datatree.AddPlus(noTrendLeadLagNode, growthFactorSequence);
}
else
{
for (int i = 1; i < get_lag(); i++)
growthFactorSequence = datatree.AddTimes(growthFactorSequence, trend->decreaseLeadsLags(-1*(i+1)));
return datatree.AddTimes(noTrendLeadLagNode, growthFactorSequence);
}
} }
else //get_lag < 0 else //get_lag < 0
{ {
expr_t growthFactorSequence = it->second; expr_t growthFactorSequence = trend;
for (int i = 1; i < abs(get_lag()); i++) if (log_trend)
growthFactorSequence = datatree.AddTimes(growthFactorSequence, it->second->decreaseLeadsLags(i)); {
return datatree.AddDivide(noTrendLeadLagNode, growthFactorSequence); for (int i = 1; i < abs(get_lag()); i++)
growthFactorSequence = datatree.AddPlus(growthFactorSequence, trend->decreaseLeadsLags(i));
return datatree.AddMinus(noTrendLeadLagNode, growthFactorSequence);
}
else
{
for (int i = 1; i < abs(get_lag()); i++)
growthFactorSequence = datatree.AddTimes(growthFactorSequence, trend->decreaseLeadsLags(i));
return datatree.AddDivide(noTrendLeadLagNode, growthFactorSequence);
}
} }
} }
@ -2433,9 +2407,9 @@ UnaryOpNode::replaceTrendVar() const
} }
expr_t expr_t
UnaryOpNode::detrend(int symb_id, expr_t trend) const UnaryOpNode::detrend(int symb_id, bool log_trend, expr_t trend) const
{ {
expr_t argsubst = arg->detrend(symb_id, trend); expr_t argsubst = arg->detrend(symb_id, log_trend, trend);
return buildSimilarUnaryOpNode(argsubst, datatree); return buildSimilarUnaryOpNode(argsubst, datatree);
} }
@ -3729,10 +3703,10 @@ BinaryOpNode::replaceTrendVar() const
} }
expr_t expr_t
BinaryOpNode::detrend(int symb_id, expr_t trend) const BinaryOpNode::detrend(int symb_id, bool log_trend, expr_t trend) const
{ {
expr_t arg1subst = arg1->detrend(symb_id, trend); expr_t arg1subst = arg1->detrend(symb_id, log_trend, trend);
expr_t arg2subst = arg2->detrend(symb_id, trend); expr_t arg2subst = arg2->detrend(symb_id, log_trend, trend);
return buildSimilarBinaryOpNode(arg1subst, arg2subst, datatree); return buildSimilarBinaryOpNode(arg1subst, arg2subst, datatree);
} }
@ -4333,11 +4307,11 @@ TrinaryOpNode::replaceTrendVar() const
} }
expr_t expr_t
TrinaryOpNode::detrend(int symb_id, expr_t trend) const TrinaryOpNode::detrend(int symb_id, bool log_trend, expr_t trend) const
{ {
expr_t arg1subst = arg1->detrend(symb_id, trend); expr_t arg1subst = arg1->detrend(symb_id, log_trend, trend);
expr_t arg2subst = arg2->detrend(symb_id, trend); expr_t arg2subst = arg2->detrend(symb_id, log_trend, trend);
expr_t arg3subst = arg3->detrend(symb_id, trend); expr_t arg3subst = arg3->detrend(symb_id, log_trend, trend);
return buildSimilarTrinaryOpNode(arg1subst, arg2subst, arg3subst, datatree); return buildSimilarTrinaryOpNode(arg1subst, arg2subst, arg3subst, datatree);
} }
@ -4919,11 +4893,11 @@ ExternalFunctionNode::replaceTrendVar() const
} }
expr_t expr_t
ExternalFunctionNode::detrend(int symb_id, expr_t trend) const ExternalFunctionNode::detrend(int symb_id, bool log_trend, expr_t trend) const
{ {
vector<expr_t> arguments_subst; vector<expr_t> arguments_subst;
for (vector<expr_t>::const_iterator it = arguments.begin(); it != arguments.end(); it++) for (vector<expr_t>::const_iterator it = arguments.begin(); it != arguments.end(); it++)
arguments_subst.push_back((*it)->detrend(symb_id, trend)); arguments_subst.push_back((*it)->detrend(symb_id, log_trend, trend));
return buildSimilarExternalFunctionNode(arguments_subst, datatree); return buildSimilarExternalFunctionNode(arguments_subst, datatree);
} }

View File

@ -284,7 +284,6 @@ public:
//! Returns the relative period of the most forward term in this expression //! Returns the relative period of the most forward term in this expression
/*! A negative value means that the expression contains only lagged variables */ /*! A negative value means that the expression contains only lagged variables */
virtual int maxLead() const = 0; virtual int maxLead() const = 0;
virtual void print_deflator();
//! Returns a new expression where all the leads/lags have been shifted backwards by the same amount //! Returns a new expression where all the leads/lags have been shifted backwards by the same amount
/*! /*!
@ -390,10 +389,11 @@ public:
//! Constructs a new expression where the variable indicated by symb_id has been detrended //! Constructs a new expression where the variable indicated by symb_id has been detrended
/*! /*!
\param[in] symb_id indicating the variable to be detrended \param[in] symb_id indicating the variable to be detrended
\param[in] expr_t indicating the trend \param[in] log_trend indicates if the trend is in log
\param[out] expr_t the new binary op pointing to a detrended variable \param[in] trend indicating the trend
\return the new binary op pointing to a detrended variable
*/ */
virtual expr_t detrend(int symb_id, expr_t trend) const = 0; virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const = 0;
//! Add ExprNodes to the provided datatree //! Add ExprNodes to the provided datatree
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const = 0; virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const = 0;
@ -453,10 +453,9 @@ public:
virtual bool containsEndogenous(void) const; virtual bool containsEndogenous(void) const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
virtual expr_t replaceTrendVar() const; virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, expr_t trend) const; virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const; virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual void print_deflator();
}; };
//! Symbol or variable node //! Symbol or variable node
@ -485,7 +484,6 @@ public:
virtual double eval(const eval_context_t &eval_context) const throw (EvalException, EvalExternalFunctionException); virtual double eval(const eval_context_t &eval_context) const throw (EvalException, EvalExternalFunctionException);
virtual void compile(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, deriv_node_temp_terms_t &tef_terms) const; virtual void compile(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, deriv_node_temp_terms_t &tef_terms) const;
virtual expr_t toStatic(DataTree &static_datatree) const; virtual expr_t toStatic(DataTree &static_datatree) const;
virtual void print_deflator();
SymbolType SymbolType
get_type() const get_type() const
{ {
@ -516,7 +514,7 @@ public:
virtual bool containsEndogenous(void) const; virtual bool containsEndogenous(void) const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
virtual expr_t replaceTrendVar() const; virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, expr_t trend) const; virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const; virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
}; };
@ -557,7 +555,6 @@ public:
virtual void collectTemporary_terms(const temporary_terms_t &temporary_terms, temporary_terms_inuse_t &temporary_terms_inuse, int Curr_Block) const; virtual void collectTemporary_terms(const temporary_terms_t &temporary_terms, temporary_terms_inuse_t &temporary_terms_inuse, int Curr_Block) const;
static double eval_opcode(UnaryOpcode op_code, double v) throw (EvalException, EvalExternalFunctionException); static double eval_opcode(UnaryOpcode op_code, double v) throw (EvalException, EvalExternalFunctionException);
virtual double eval(const eval_context_t &eval_context) const throw (EvalException, EvalExternalFunctionException); virtual double eval(const eval_context_t &eval_context) const throw (EvalException, EvalExternalFunctionException);
virtual void print_deflator();
virtual void compile(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, deriv_node_temp_terms_t &tef_terms) const; virtual void compile(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, deriv_node_temp_terms_t &tef_terms) const;
//! Returns operand //! Returns operand
expr_t expr_t
@ -593,7 +590,7 @@ public:
virtual bool containsEndogenous(void) const; virtual bool containsEndogenous(void) const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
virtual expr_t replaceTrendVar() const; virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, expr_t trend) const; virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const; virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
}; };
@ -637,7 +634,6 @@ public:
virtual double eval(const eval_context_t &eval_context) const throw (EvalException, EvalExternalFunctionException); virtual double eval(const eval_context_t &eval_context) const throw (EvalException, EvalExternalFunctionException);
virtual void compile(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, deriv_node_temp_terms_t &tef_terms) const; virtual void compile(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, deriv_node_temp_terms_t &tef_terms) const;
virtual expr_t Compute_RHS(expr_t arg1, expr_t arg2, int op, int op_type) const; virtual expr_t Compute_RHS(expr_t arg1, expr_t arg2, int op, int op_type) const;
virtual void print_deflator();
//! Returns first operand //! Returns first operand
expr_t expr_t
get_arg1() const get_arg1() const
@ -683,7 +679,7 @@ public:
virtual bool containsEndogenous(void) const; virtual bool containsEndogenous(void) const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
virtual expr_t replaceTrendVar() const; virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, expr_t trend) const; virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const; virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
//! Function to write out the oPowerNode in expr_t terms as opposed to writing out the function itself //! Function to write out the oPowerNode in expr_t terms as opposed to writing out the function itself
@ -738,7 +734,6 @@ public:
virtual int maxEndoLag() const; virtual int maxEndoLag() const;
virtual int maxExoLag() const; virtual int maxExoLag() const;
virtual int maxLead() const; virtual int maxLead() const;
virtual void print_deflator();
virtual expr_t decreaseLeadsLags(int n) const; virtual expr_t decreaseLeadsLags(int n) const;
virtual expr_t substituteEndoLeadGreaterThanTwo(subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs, bool deterministic_model) const; virtual expr_t substituteEndoLeadGreaterThanTwo(subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs, bool deterministic_model) const;
//! Creates another TrinaryOpNode with the same opcode, but with a possibly different datatree and arguments //! Creates another TrinaryOpNode with the same opcode, but with a possibly different datatree and arguments
@ -753,7 +748,7 @@ public:
virtual bool containsEndogenous(void) const; virtual bool containsEndogenous(void) const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
virtual expr_t replaceTrendVar() const; virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, expr_t trend) const; virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const; virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
}; };
@ -803,7 +798,6 @@ public:
bool lhs_rhs, const temporary_terms_t &temporary_terms, bool lhs_rhs, const temporary_terms_t &temporary_terms,
const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic,
deriv_node_temp_terms_t &tef_terms) const; deriv_node_temp_terms_t &tef_terms) const;
virtual void print_deflator();
virtual void compile(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, deriv_node_temp_terms_t &tef_terms) const; virtual void compile(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, deriv_node_temp_terms_t &tef_terms) const;
virtual expr_t toStatic(DataTree &static_datatree) const; virtual expr_t toStatic(DataTree &static_datatree) const;
@ -828,7 +822,7 @@ public:
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
virtual void writePrhs(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const string &ending) const; virtual void writePrhs(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const string &ending) const;
virtual expr_t replaceTrendVar() const; virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, expr_t trend) const; virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const; virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const; virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
}; };
@ -862,7 +856,6 @@ public:
bool lhs_rhs, const temporary_terms_t &temporary_terms, bool lhs_rhs, const temporary_terms_t &temporary_terms,
const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic,
deriv_node_temp_terms_t &tef_terms) const; deriv_node_temp_terms_t &tef_terms) const;
virtual void print_deflator();
}; };
class SecondDerivExternalFunctionNode : public ExternalFunctionNode class SecondDerivExternalFunctionNode : public ExternalFunctionNode
@ -888,7 +881,6 @@ public:
virtual void writeExternalFunctionOutput(ostream &output, ExprNodeOutputType output_type, virtual void writeExternalFunctionOutput(ostream &output, ExprNodeOutputType output_type,
const temporary_terms_t &temporary_terms, const temporary_terms_t &temporary_terms,
deriv_node_temp_terms_t &tef_terms) const; deriv_node_temp_terms_t &tef_terms) const;
virtual void print_deflator();
}; };
#endif #endif

View File

@ -107,7 +107,6 @@ ModFile::addStatementAtFront(Statement *st)
void void
ModFile::checkPass() ModFile::checkPass()
{ {
dynamic_model.print_trend_vars();
for (vector<Statement *>::iterator it = statements.begin(); for (vector<Statement *>::iterator it = statements.begin();
it != statements.end(); it++) it != statements.end(); it++)
(*it)->checkPass(mod_file_struct, warnings); (*it)->checkPass(mod_file_struct, warnings);
@ -375,8 +374,8 @@ ModFile::computingPass(bool no_tmp_terms)
// Mod file may have no equation (for example in a standalone BVAR estimation) // Mod file may have no equation (for example in a standalone BVAR estimation)
if (dynamic_model.equation_number() > 0) if (dynamic_model.equation_number() > 0)
{ {
/*if (nonstationary_variables) if (nonstationary_variables)
trend_dynamic_model.runTrendTest(global_eval_context);*/ trend_dynamic_model.runTrendTest(global_eval_context);
// Compute static model and its derivatives // Compute static model and its derivatives
dynamic_model.toStatic(static_model); dynamic_model.toStatic(static_model);

View File

@ -1003,19 +1003,14 @@ ModelTree::computeJacobian(const set<int> &vars)
for (set<int>::const_iterator it = vars.begin(); for (set<int>::const_iterator it = vars.begin();
it != vars.end(); it++) it != vars.end(); it++)
{ {
int prev_deriv = NNZDerivatives[0]; for (int eq = 0; eq < (int) equations.size(); eq++)
for (int eq = 0; eq < (int) equations.size(); eq++) {
{ expr_t d1 = equations[eq]->getDerivative(*it);
expr_t d1 = equations[eq]->getDerivative(*it); if (d1 == Zero)
if (d1 == Zero) continue;
continue; first_derivatives[make_pair(eq, *it)] = d1;
first_derivatives[make_pair(eq, *it)] = d1; ++NNZDerivatives[0];
++NNZDerivatives[0]; }
}
if (NNZDerivatives[0] == prev_deriv)
{
cout << "the derivatives w.r. to " << symbol_table.getName(*it) << " is always equal to 0\n";
}
} }
} }
@ -1418,14 +1413,14 @@ ModelTree::addTrendVariables(vector<int> trend_vars, expr_t growth_factor) throw
} }
void void
ModelTree::addNonstationaryVariables(vector<int> nonstationary_vars, expr_t deflator) throw (TrendException) ModelTree::addNonstationaryVariables(vector<int> nonstationary_vars, bool log_deflator, expr_t deflator) throw (TrendException)
{ {
while (!nonstationary_vars.empty()) while (!nonstationary_vars.empty())
if (nonstationary_symbols_map.find(nonstationary_vars.back()) != nonstationary_symbols_map.end()) if (nonstationary_symbols_map.find(nonstationary_vars.back()) != nonstationary_symbols_map.end())
throw TrendException(symbol_table.getName(nonstationary_vars.back())); throw TrendException(symbol_table.getName(nonstationary_vars.back()));
else else
{ {
nonstationary_symbols_map[nonstationary_vars.back()] = deflator; nonstationary_symbols_map[nonstationary_vars.back()] = make_pair(log_deflator, deflator);
nonstationary_vars.pop_back(); nonstationary_vars.pop_back();
} }
} }

View File

@ -45,9 +45,6 @@ typedef vector< pair<pair<int, int>, pair< int, expr_t > > > block_derivatives_e
//! for all blocks derivatives description //! for all blocks derivatives description
typedef vector<block_derivatives_equation_variable_laglead_nodeid_t> blocks_derivatives_t; typedef vector<block_derivatives_equation_variable_laglead_nodeid_t> blocks_derivatives_t;
//! for all trends
typedef map<int, expr_t> trend_symbols_map_t;
//! Shared code for static and dynamic models //! Shared code for static and dynamic models
class ModelTree : public DataTree class ModelTree : public DataTree
{ {
@ -136,9 +133,13 @@ protected:
//! Trend variables and their growth factors //! Trend variables and their growth factors
trend_symbols_map_t trend_symbols_map; map<int, expr_t> trend_symbols_map;
//! for all trends; the boolean is true if this is a log-trend, false otherwise
typedef map<int, pair<bool, expr_t> > nonstationary_symbols_map_t;
//! Nonstationary variables and their deflators //! Nonstationary variables and their deflators
trend_symbols_map_t nonstationary_symbols_map; nonstationary_symbols_map_t nonstationary_symbols_map;
//! vector of block reordered variables and equations //! vector of block reordered variables and equations
vector<int> equation_reordered, variable_reordered, inv_equation_reordered, inv_variable_reordered; vector<int> equation_reordered, variable_reordered, inv_equation_reordered, inv_variable_reordered;
@ -304,8 +305,8 @@ public:
int equation_number() const; int equation_number() const;
//! Adds a trend variable with its growth factor //! Adds a trend variable with its growth factor
void addTrendVariables(vector<int> trend_vars, expr_t growth_factor) throw (TrendException); void addTrendVariables(vector<int> trend_vars, expr_t growth_factor) throw (TrendException);
//! Adds a nonstationary variable with its deflator //! Adds a nonstationary variables with their (common) deflator
void addNonstationaryVariables(vector<int> nonstationary_vars, expr_t deflator) throw (TrendException); void addNonstationaryVariables(vector<int> nonstationary_vars, bool log_deflator, expr_t deflator) throw (TrendException);
void set_cutoff_to_zero(); void set_cutoff_to_zero();
//! Helper for writing the Jacobian elements in MATLAB and C //! Helper for writing the Jacobian elements in MATLAB and C
/*! Writes either (i+1,j+1) or [i+j*no_eq] */ /*! Writes either (i+1,j+1) or [i+j*no_eq] */

View File

@ -204,9 +204,9 @@ ParsingDriver::begin_trend()
} }
void void
ParsingDriver::declare_trend_var(string *name, string *tex_name) ParsingDriver::declare_trend_var(bool log_trend, string *name, string *tex_name)
{ {
declare_symbol(name, eTrend, tex_name); declare_symbol(name, log_trend ? eLogTrend : eTrend, tex_name);
declared_trend_vars.push_back(mod_file->symbol_table.getID(*name)); declared_trend_vars.push_back(mod_file->symbol_table.getID(*name));
delete name; delete name;
if (tex_name != NULL) if (tex_name != NULL)
@ -339,11 +339,11 @@ ParsingDriver::declare_nonstationary_var(string *name, string *tex_name)
} }
void void
ParsingDriver::end_nonstationary_var(expr_t deflator) ParsingDriver::end_nonstationary_var(bool log_deflator, expr_t deflator)
{ {
try try
{ {
dynamic_model->addNonstationaryVariables(declared_nonstationary_vars, deflator); dynamic_model->addNonstationaryVariables(declared_nonstationary_vars, log_deflator, deflator);
} }
catch (DataTree::TrendException &e) catch (DataTree::TrendException &e)
{ {

View File

@ -631,13 +631,13 @@ public:
//! Switches datatree //! Switches datatree
void begin_trend(); void begin_trend();
//! Declares a trend variable with its growth factor //! Declares a trend variable with its growth factor
void declare_trend_var(string *name, string *tex_name = NULL); void declare_trend_var(bool log_trend, string *name, string *tex_name = NULL);
//! Ends declaration of trend variable //! Ends declaration of trend variable
void end_trend_var(expr_t growth_factor); void end_trend_var(expr_t growth_factor);
//! Declares a nonstationary variable with its deflator //! Declares a nonstationary variable with its deflator
void declare_nonstationary_var(string *name, string *tex_name = NULL); void declare_nonstationary_var(string *name, string *tex_name = NULL);
//! Ends declaration of nonstationary variable //! Ends declaration of nonstationary variable
void end_nonstationary_var(expr_t deflator); void end_nonstationary_var(bool log_deflator, expr_t deflator);
//! Add a graph format to the list of formats requested //! Add a graph format to the list of formats requested
void add_graph_format(const string &name); void add_graph_format(const string &name);
//! Add the graph_format option to the OptionsList structure //! Add the graph_format option to the OptionsList structure

View File

@ -502,7 +502,7 @@ SymbolTable::getTrendVarIds() const
vector <int> trendVars; vector <int> trendVars;
for (symbol_table_type::const_iterator it = symbol_table.begin(); for (symbol_table_type::const_iterator it = symbol_table.begin();
it != symbol_table.end(); it++) it != symbol_table.end(); it++)
if (getType(it->second) == eTrend) if (getType(it->second) == eTrend || getType(it->second) == eLogTrend)
trendVars.push_back(it->second); trendVars.push_back(it->second);
return trendVars; return trendVars;
} }

1
tests/.gitignore vendored
View File

@ -5,6 +5,7 @@
*.cod *.cod
*.c *.c
*.tex *.tex
*.TeX
*.jnl *.jnl
*.swp *.swp
*.dat *.dat

View File

@ -146,7 +146,9 @@ MODFILES = \
deterministic_simulations/rbc_det4.mod \ deterministic_simulations/rbc_det4.mod \
deterministic_simulations/rbc_det5.mod \ deterministic_simulations/rbc_det5.mod \
walsh.mod \ walsh.mod \
measurement_errors/fs2000_corr_me_ml_mcmc/fs2000_corr_ME.mod measurement_errors/fs2000_corr_me_ml_mcmc/fs2000_corr_ME.mod \
trend_var/fs2000_nonstationary.mod \
trend_var/fs2000_log_nonstationary.mod
XFAIL_MODFILES = ramst_xfail.mod XFAIL_MODFILES = ramst_xfail.mod

View File

@ -13,7 +13,6 @@ rho = 0.7;
psi = 0.787; psi = 0.787;
del = 0.02; del = 0.02;
//model(block, bytecode);
model; model;
dA = exp(gam+e_a); dA = exp(gam+e_a);
log(m) = (1-rho)*log(mst) + rho*log(m(-1))+e_m; log(m) = (1-rho)*log(mst) + rho*log(m(-1))+e_m;
@ -57,41 +56,18 @@ steady;
check; check;
//stoch_simul(irf=0); stoch_simul(irf=0);
conditional_forecast_paths; conditional_forecast_paths;
var gp_obs;
periods 1 2:5;
//values 0.05;
//values 0.98 1.00797;
values 0.98 0.99;
//expectation perfect_foresight;
var gy_obs; var gy_obs;
periods 1 2 3:5; periods 1 2 3:5;
//values 0.01 -0.02 0; values 0.01 -0.02 0;
//values 0.85 0.85 0.95; var gp_obs;
values 0.95 0.95 0.99; periods 1:5;
//expectation perfect_foresight; values 0.05;
end; end;
options_.stack_solve_algo = 0; conditional_forecast(parameter_set=calibration, controlled_varexo=(e_a,e_m));
options_.maxit_ = 50;
error('Test disabled, enters an infinite loop') plot_conditional_forecast(periods=10) gy_obs gp_obs;
conditional_forecast(parameter_set=calibration, controlled_varexo=(e_m,e_a), simulation_type = deterministic);
/*shocks;
var e_a;
periods 1 2 3 4 5;
values -0.0109 -0.0122 -0.0137 -0.0154 -0.0173;
var e_m;
periods 1 2 3 4 5;
values -0.1242 -0.0386 -0.0392 -0.0398 -0.0405;
end;
simul(periods=40);*/
rplot gy_obs;
rplot gp_obs;
//if ~(exist('OCTAVE_VERSION') && octave_ver_less_than('3.4.0'))
//plot_conditional_forecast(periods=10) gy_obs gp_obs;
//end

View File

@ -97,8 +97,6 @@ varobs gp_obs gy_obs;
options_.solve_tolf = 1e-12; options_.solve_tolf = 1e-12;
error('Test disabled, enters an infinite loop')
// Metropolis replications are too few, this is only for testing purpose // Metropolis replications are too few, this is only for testing purpose
estimation(order=1,datafile=fsdat_simul,nobs=192,loglinear,mh_replic=10000,mh_nblocks=1,mh_jscale=0.8); estimation(order=1,datafile=fsdat_simul,nobs=192,loglinear,mh_replic=10000,mh_nblocks=1,mh_jscale=0.8);

View File

@ -0,0 +1,85 @@
/*
* This file is a modified version of 'fs2000.mod'.
*
* The difference is that, here, the equations are written in non-stationary form,
* all variables are taken in logs, and Dynare automatically does the detrending.
*
* Also note that "m" and "dA" in 'fs2000.mod' are here called "gM" and "gA"
*/
/*
* Copyright (C) 2004-2013 Dynare Team
*
* This file is part of Dynare.
*
* Dynare is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Dynare is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Dynare. If not, see <http://www.gnu.org/licenses/>.
*/
var gM gA;
log_trend_var(log_growth_factor=gA) A;
log_trend_var(log_growth_factor=gM) M;
var(log_deflator=A) k c y;
var(log_deflator=M(-1)-A) P;
var(log_deflator=M(-1)) W l d;
var R n;
varexo e_a e_m;
parameters alp bet gam mst rho psi del;
alp = 0.33;
bet = 0.99;
gam = 0.003;
mst = 1.011;
rho = 0.7;
psi = 0.787;
del = 0.02;
model;
gA = gam+e_a;
gM = (1-rho)*log(mst) + rho*gM(-1)+e_m;
exp(c)+exp(k) = exp(k(-1))^alp*(exp(A)*exp(n))^(1-alp)+(1-del)*exp(k(-1));
P+c = M;
P-(c(+1)+P(+1))=log(bet)+P(+1)+log(alp*exp(k)^(alp-1)*(exp(A(+1)+n(+1)))^(1-alp)+(1-del))-(c(+2)+P(+2));
log(psi/(1-psi))+(c+P-log(1-exp(n)))=W;
R = P+log(1-alp)+alp*k(-1)+(1-alp)*A+(-alp)*n-W;
W = l-n;
exp(M)-exp(M(-1))+exp(d) = exp(l);
-(c+P)=log(bet)+R-(c(+1)+P(+1));
y = alp*k(-1)+(1-alp)*(A+n);
end;
initval;
k = log(6);
gM = log(mst);
P = log(2.25);
c = log(0.45);
W = log(4);
R = log(1.02);
d = log(0.85);
n = log(0.19);
l = log(0.86);
y = log(0.6);
gA = gam;
end;
shocks;
var e_a; stderr 0.014;
var e_m; stderr 0.005;
end;
steady;
check;
stoch_simul;

View File

@ -0,0 +1,85 @@
/*
* This file is a modified version of 'fs2000.mod'.
*
* The difference is that, here, the equations are written in non-stationary form,
* and Dynare automatically does the detrending.
*
* Also note that "m" and "dA" in 'fs2000.mod' are here called "gM" and "gA"
*/
/*
* Copyright (C) 2004-2010 Dynare Team
*
* This file is part of Dynare.
*
* Dynare is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Dynare is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Dynare. If not, see <http://www.gnu.org/licenses/>.
*/
var gM gA;
trend_var(growth_factor=gA) A;
trend_var(growth_factor=gM) M;
var(deflator=A) k c y;
var(deflator=M(-1)/A) P;
var(deflator=M(-1)) W l d;
var R n;
varexo e_a e_m;
parameters alp bet gam mst rho psi del;
alp = 0.33;
bet = 0.99;
gam = 0.003;
mst = 1.011;
rho = 0.7;
psi = 0.787;
del = 0.02;
model;
gA = exp(gam+e_a);
log(gM) = (1-rho)*log(mst) + rho*log(gM(-1))+e_m;
c+k = k(-1)^alp*(A*n)^(1-alp)+(1-del)*k(-1);
P*c = M;
P/(c(+1)*P(+1))=bet*P(+1)*(alp*k^(alp-1)*(A(+1)*n(+1))^(1-alp)+(1-del))/(c(+2)*P(+2));
(psi/(1-psi))*(c*P/(1-n))=W;
R = P*(1-alp)*k(-1)^alp*A^(1-alp)*n^(-alp)/W;
W = l/n;
M-M(-1)+d = l;
1/(c*P)=bet*R/(c(+1)*P(+1));
y = k(-1)^alp*(A*n)^(1-alp);
end;
initval;
k = 6;
gM = mst;
P = 2.25;
c = 0.45;
W = 4;
R = 1.02;
d = 0.85;
n = 0.19;
l = 0.86;
y = 0.6;
gA = exp(gam);
end;
shocks;
var e_a; stderr 0.014;
var e_m; stderr 0.005;
end;
steady;
check;
stoch_simul;