diff --git a/doc/dynare.texi b/doc/dynare.texi index 89a3c6dbf..efb97dba6 100644 --- a/doc/dynare.texi +++ b/doc/dynare.texi @@ -100,127 +100,129 @@ This is Dynare Reference Manual, version @value{VERSION}. @end ifnottex @menu -* Introduction:: -* Installation and configuration:: -* Dynare invocation:: -* The Model file:: -* The Configuration File:: -* Examples:: -* Dynare internal documentation and unitary tests:: -* Bibliography:: -* Command and Function Index:: -* Variable Index:: +* Introduction:: +* Installation and configuration:: +* Dynare invocation:: +* The Model file:: +* The Configuration File:: +* Reporting:: +* Examples:: +* Dynare internal documentation and unitary tests:: +* Bibliography:: +* Command and Function Index:: +* Variable Index:: @detailmenu --- The Detailed Node Listing --- Introduction -* What is Dynare ?:: -* Documentation sources:: -* Citing Dynare in your research:: +* What is Dynare ?:: +* Documentation sources:: +* Citing Dynare in your research:: Installation and configuration -* Software requirements:: -* Installation of Dynare:: -* Configuration:: +* Software requirements:: +* Installation of Dynare:: +* Configuration:: Installation of Dynare -* On Windows:: -* On Debian GNU/Linux and Ubuntu:: -* On Mac OS X:: -* For other systems:: +* On Windows:: +* On Debian GNU/Linux and Ubuntu:: +* On Mac OS X:: +* For other systems:: Configuration -* For MATLAB:: -* For GNU Octave:: -* Some words of warning:: +* For MATLAB:: +* For GNU Octave:: +* Some words of warning:: The Model file -* Conventions:: -* Variable declarations:: -* Expressions:: -* Parameter initialization:: -* Model declaration:: -* Auxiliary variables:: -* Initial and terminal conditions:: -* Shocks on exogenous variables:: -* Other general declarations:: -* Steady state:: -* Getting information about the model:: -* Deterministic simulation:: -* Stochastic solution and simulation:: -* Estimation:: -* Forecasting:: -* Optimal policy:: -* Sensitivity and identification analysis:: -* Markov-switching SBVAR:: -* Displaying and saving results:: -* Macro-processing language:: -* Misc commands:: +* Conventions:: +* Variable declarations:: +* Expressions:: +* Parameter initialization:: +* Model declaration:: +* Auxiliary variables:: +* Initial and terminal conditions:: +* Shocks on exogenous variables:: +* Other general declarations:: +* Steady state:: +* Getting information about the model:: +* Deterministic simulation:: +* Stochastic solution and simulation:: +* Estimation:: +* Forecasting:: +* Optimal policy:: +* Sensitivity and identification analysis:: +* Markov-switching SBVAR:: +* Displaying and saving results:: +* Macro-processing language:: +* Misc commands:: Expressions -* Parameters and variables:: -* Operators:: -* Functions:: +* Parameters and variables:: +* Operators:: +* Functions:: +* A few words of warning in stochastic context:: Parameters and variables -* Inside the model:: -* Outside the model:: +* Inside the model:: +* Outside the model:: Functions -* Built-in Functions:: -* External Functions:: +* Built-in Functions:: +* External Functions:: Steady state -* Finding the steady state with Dynare nonlinear solver:: -* Using a steady state file:: -* Replace some equations during steady state computations:: +* Finding the steady state with Dynare nonlinear solver:: +* Using a steady state file:: +* Replace some equations during steady state computations:: Stochastic solution and simulation -* Computing the stochastic solution:: -* Typology and ordering of variables:: -* First order approximation:: -* Second order approximation:: -* Third order approximation:: +* Computing the stochastic solution:: +* Typology and ordering of variables:: +* First order approximation:: +* Second order approximation:: +* Third order approximation:: Sensitivity and identification analysis -* Sampling:: -* Stability Mapping:: -* Reduced Form Mapping:: -* RMSE:: -* Screening Analysis:: -* Identification Analysis:: -* Performing Sensitivity and Identification Analysis:: +* Sampling:: +* Stability Mapping:: +* Reduced Form Mapping:: +* RMSE:: +* Screening Analysis:: +* Identification Analysis:: +* Performing Sensitivity and Identification Analysis:: Macro-processing language -* Macro expressions:: -* Macro directives:: -* Typical usages:: -* MATLAB/Octave loops versus macro-processor loops:: +* Macro expressions:: +* Macro directives:: +* Typical usages:: +* MATLAB/Octave loops versus macro-processor loops:: Typical usages -* Modularization:: -* Indexed sums or products:: -* Multi-country models:: -* Endogeneizing parameters:: +* Modularization:: +* Indexed sums or products:: +* Multi-country models:: +* Endogeneizing parameters:: The Configuration File -* Dynare Configuration:: -* Parallel Configuration:: +* Dynare Configuration:: +* Parallel Configuration:: @end detailmenu @end menu @@ -229,9 +231,9 @@ The Configuration File @chapter Introduction @menu -* What is Dynare ?:: -* Documentation sources:: -* Citing Dynare in your research:: +* What is Dynare ?:: +* Documentation sources:: +* Citing Dynare in your research:: @end menu @node What is Dynare ? @@ -357,9 +359,9 @@ If you want to give a URL, use the address of the Dynare website: @chapter Installation and configuration @menu -* Software requirements:: -* Installation of Dynare:: -* Configuration:: +* Software requirements:: +* Installation of Dynare:: +* Configuration:: @end menu @node Software requirements @@ -429,10 +431,10 @@ upgrade Dynare and discard the previous version without having to worry about your own files. @menu -* On Windows:: -* On Debian GNU/Linux and Ubuntu:: -* On Mac OS X:: -* For other systems:: +* On Windows:: +* On Debian GNU/Linux and Ubuntu:: +* On Mac OS X:: +* For other systems:: @end menu @node On Windows @@ -498,9 +500,9 @@ Wiki}. @section Configuration @menu -* For MATLAB:: -* For GNU Octave:: -* Some words of warning:: +* For MATLAB:: +* For GNU Octave:: +* Some words of warning:: @end menu @node For MATLAB @@ -577,8 +579,9 @@ addpath /Applications/Dynare/4.@var{x}.@var{y}/matlab If you don't want to type this command every time you run Octave, you can put it in a file called @file{.octaverc} in your home directory -(under Windows this will generally by @file{c:\Documents and -Settings\USERNAME\}). This file is run by Octave at every startup. +(under Windows this will generally be @file{c:\Documents and +Settings\USERNAME\} while under Mac OS X it is @file{/Users/USERNAME/}). +This file is run by Octave at every startup. @node Some words of warning @subsection Some words of warning @@ -595,8 +598,8 @@ your configuration). You must verify that there is no directory coming from another version of Dynare than the one you are planning to use. You have to be aware that adding other directories to your path can -potentially create problems, if some of your M-files have the same names -than Dynare files. Your files would then override Dynare files, and make +potentially create problems if any of your M-files have the same name +as a Dynare file. Your file would then override the Dynare file, making Dynare unusable. @node Dynare invocation @@ -781,27 +784,27 @@ Structure containing the various results of the computations. @chapter The Model file @menu -* Conventions:: -* Variable declarations:: -* Expressions:: -* Parameter initialization:: -* Model declaration:: -* Auxiliary variables:: -* Initial and terminal conditions:: -* Shocks on exogenous variables:: -* Other general declarations:: -* Steady state:: -* Getting information about the model:: -* Deterministic simulation:: -* Stochastic solution and simulation:: -* Estimation:: -* Forecasting:: -* Optimal policy:: -* Sensitivity and identification analysis:: -* Markov-switching SBVAR:: -* Displaying and saving results:: -* Macro-processing language:: -* Misc commands:: +* Conventions:: +* Variable declarations:: +* Expressions:: +* Parameter initialization:: +* Model declaration:: +* Auxiliary variables:: +* Initial and terminal conditions:: +* Shocks on exogenous variables:: +* Other general declarations:: +* Steady state:: +* Getting information about the model:: +* Deterministic simulation:: +* Stochastic solution and simulation:: +* Estimation:: +* Forecasting:: +* Optimal policy:: +* Sensitivity and identification analysis:: +* Markov-switching SBVAR:: +* Displaying and saving results:: +* Macro-processing language:: +* Misc commands:: @end menu @node Conventions @@ -865,8 +868,8 @@ alphabetical character and can't contain: @samp{()+-*/^=!;:@@#.} or accentuated characters; @item -@var{LATEX_NAME} indicates a valid LaTeX expression in math mode (not -including the dollar signs); +@var{LATEX_NAME} indicates a valid @LaTeX{} expression in math mode +(not including the dollar signs); @item @var{FUNCTION_NAME} indicates a valid MATLAB function name; @@ -891,9 +894,9 @@ Declarations of variables and parameters are made with the following commands: This required command declares the endogenous variables in the model. @xref{Conventions}, for the syntax of @var{VARIABLE_NAME} and -@var{MODEL_EXPRESSION}. Optionally it is possible to give a LaTeX name -to the variable or, if it is nonstationary, provide information regarding -its deflator. +@var{MODEL_EXPRESSION}. Optionally it is possible to give a @LaTeX{} +name to the variable or, if it is nonstationary, provide information +regarding its deflator. @code{var} commands can appear several times in the file and Dynare will concatenate them. @@ -938,7 +941,7 @@ var(deflator=A) i b; This optional command declares the exogenous variables in the model. @xref{Conventions}, for the syntax of @var{VARIABLE_NAME}. Optionally it -is possible to give a LaTeX name to the variable. +is possible to give a @LaTeX{} name to the variable. Exogenous variables are required if the user wants to be able to apply shocks to her model. @@ -960,8 +963,8 @@ varexo m gov; This optional command declares exogenous deterministic variables in a stochastic model. See @ref{Conventions}, for the syntax of -@var{VARIABLE_NAME}. Optionally it is possible to give a LaTeX name to -the variable. +@var{VARIABLE_NAME}. Optionally it is possible to give a @LaTeX{} name +to the variable. It is possible to mix deterministic and stochastic shocks to build models where agents know from the start of the simulation about future @@ -992,7 +995,7 @@ varexo_det tau; This command declares parameters used in the model, in variable initialization or in shocks declarations. See @ref{Conventions}, for the syntax of @var{PARAMETER_NAME}. Optionally it is possible to give a -LaTeX name to the parameter. +@LaTeX{} name to the parameter. The parameters must subsequently be assigned values (@pxref{Parameter initialization}). @@ -1099,9 +1102,9 @@ end; @descriptionhead This optional command declares the trend variables in the -model. @xref{Conventions}, for the syntax of @var{MODEL_EXPRESSION} and -@var{VARIABLE_NAME}. Optionally it is possible to give a LaTeX name to -the variable. +model. @xref{Conventions}, for the syntax of @var{MODEL_EXPRESSION} +and @var{VARIABLE_NAME}. Optionally it is possible to give a @LaTeX{} +name to the variable. The variable is assumed to have a multiplicative growth trend. For an additive growth trend, use @code{log_trend_var} instead. @@ -1175,9 +1178,10 @@ Represents infinity. @end deffn @menu -* Parameters and variables:: -* Operators:: -* Functions:: +* Parameters and variables:: +* Operators:: +* Functions:: +* A few words of warning in stochastic context:: @end menu @node Parameters and variables @@ -1188,8 +1192,8 @@ typing their names. The semantics of parameters and variables is quite different whether they are used inside or outside the model block. @menu -* Inside the model:: -* Outside the model:: +* Inside the model:: +* Outside the model:: @end menu @node Inside the model @@ -1250,6 +1254,13 @@ unary arithmetic operators: @code{+}, @code{-} binary comparison operators (which evaluate to either @code{0} or @code{1}): @code{<}, @code{>}, @code{<=}, @code{>=}, @code{==}, @code{!=} + +Note that these operators are differentiable everywhere except on a +line of the 2-dimensional real plane. However for facilitating +convergence of Newton-type methods, Dynare assumes that, at the points +of non-differentiability, the partial derivatives of these operators +with respect to both arguments is equal to @math{0} (since this is the +value of the partial derivatives everywhere else). @end itemize The following special operators are accepted in @var{MODEL_EXPRESSION} @@ -1276,8 +1287,8 @@ internally and how this affects the output. @subsection Functions @menu -* Built-in Functions:: -* External Functions:: +* Built-in Functions:: +* External Functions:: @end menu @node Built-in Functions @@ -1305,10 +1316,23 @@ Square root. @defun abs (@var{x}) Absolute value. + +Note that this function is not differentiable at @math{x=0}. However, +for facilitating convergence of Newton-type methods, Dynare assumes +that the derivative at @math{x=0} is equal to @math{0} (this +assumption comes from the observation that the derivative of +@math{abs(x)} is equal to @math{sign(x)} for @math{x\neq 0} and from +the convention for the derivative of @math{sign(x)} at @math{x=0}). @end defun @defun sign (@var{x}) Signum function. + +Note that this function is not differentiable at @math{x=0}. However, +for facilitating convergence of Newton-type methods, Dynare assumes +that the derivative at @math{x=0} is equal to @math{0} (this assumption +comes from the observation that both the right- and left-derivatives +at this point exist and are equal to @math{0}). @end defun @defun sin (@var{x}) @@ -1323,6 +1347,15 @@ Trigonometric functions. @defun max (@var{a}, @var{b}) @defunx min (@var{a}, @var{b}) Maximum and minimum of two reals. + +Note that these functions are differentiable everywhere except on a +line of the 2-dimensional real plane defined by @math{a=b}. However +for facilitating convergence of Newton-type methods, Dynare assumes +that, at the points of non-differentiability, the partial derivative +of these functions with respect to the first (resp. the second) +argument is equal to @math{1} (resp. to @math{0}) (@i{i.e.} the +derivatives at the kink are equal to the derivatives observed on the +half-plane where the function is equal to its first argument). @end defun @defun normcdf (@var{x}) @@ -1405,6 +1438,25 @@ external_function(name = yetotherfuncname, nargs = 3, @end deffn +@node A few words of warning in stochastic context +@subsection A few words of warning in stochastic context + +The use of the following functions and operators is strongly +discouraged in a stochastic context: @code{max}, @code{min}, +@code{abs}, @code{sign}, @code{<}, @code{>}, @code{<=}, @code{>=}, +@code{==}, @code{!=}. + +The reason is that the local approximation used by @code{stoch_simul} +or @code{estimation} will by nature ignore the non-linearities +introduced by these functions if the steady state is away from the +kink. And, if the steady state is exactly at the kink, then the +approximation will be bogus because the derivative of these functions +at the kink is bogus (as explained in the respective documentations of +these functions and operators). + +Note that @code{extended_path} is not affected by this problem, +because it uses a global approximation method, not a local one. + @node Parameter initialization @section Parameter initialization @@ -1557,6 +1609,7 @@ Don't create the static model file. This can be useful for models which don't have a steady state. @item differentiate_forward_vars +@itemx differentiate_forward_vars = ( @var{VARIABLE_NAME} [@var{VARIABLE_NAME} @dots{}] ) Tells Dynare to create a new auxiliary variable for each endogenous variable that appears with a lead, such that the new variable is the time differentiate of the original one. More precisely, if the model @@ -1564,6 +1617,11 @@ contains @code{x(+1)}, then a variable @code{AUX_DIFF_VAR} will be created such that @code{AUX_DIFF_VAR=x-x(-1)}, and @code{x(+1)} will be replaced with @code{x+AUX_DIFF_VAR(+1)}. +The transformation is applied to all endogenous variables with a lead +if the option is given without a list of variables. If there is a +list, the transformation is restricted to endogenous with a lead that +also appear in the list. + This option can useful for some deterministic simulations where convergence is hard to obtain. Bad values for terminal conditions in the case of very persistent dynamics or permanent shocks can hinder @@ -1620,7 +1678,7 @@ end; @end deffn Dynare has the ability to output the list of model equations to a -LaTeX file, using the @code{write_latex_dynamic_model} command. The +@LaTeX{} file, using the @code{write_latex_dynamic_model} command. The static model can also be written with the @code{write_latex_static_model} command. @@ -1630,21 +1688,21 @@ static model can also be written with the @descriptionhead -This command creates a LaTeX file containing the (dynamic) model. +This command creates a @LaTeX{} file containing the (dynamic) model. If your @file{.mod} file is @file{@var{FILENAME}.mod}, then Dynare will create a file called @file{@var{FILENAME}_dynamic.tex}, containing the list of all the dynamic model equations. -If LaTeX names were given for variables and parameters +If @LaTeX{} names were given for variables and parameters (@pxref{Variable declarations}), then those will be used; otherwise, the plain text names will be used. Time subscripts (@code{t}, @code{t+1}, @code{t-1}, @dots{}) will be -appended to the variable names, as LaTeX subscripts. +appended to the variable names, as @LaTeX{} subscripts. -Note that the model written in the TeX file will differ from the model -declared by the user in the following dimensions: +Note that the model written in the @TeX{} file will differ from the +model declared by the user in the following dimensions: @itemize @@ -1668,7 +1726,7 @@ for a stochastic model, exogenous variables with leads or lags will also have been replaced by new auxiliary variables and equations. @end itemize -Compiling the TeX file requires the following Latex packages: +Compiling the @TeX{} file requires the following @LaTeX{} packages: @code{geometry}, @code{fullpage}, @code{breqn}. @end deffn @@ -1677,18 +1735,18 @@ Compiling the TeX file requires the following Latex packages: @descriptionhead -This command creates a LaTeX file containing the static model. +This command creates a @LaTeX{} file containing the static model. If your @file{.mod} file is @file{@var{FILENAME}.mod}, then Dynare will create a file called @file{@var{FILENAME}_static.tex}, containing the list of all the equations of the steady state model. -If LaTeX names were given for variables and parameters +If @LaTeX{} names were given for variables and parameters (@pxref{Variable declarations}), then those will be used; otherwise, the plain text names will be used. -Note that the model written in the TeX file will differ from the model -declared by the user in the some dimensions +Note that the model written in the @TeX{} file will differ from the +model declared by the user in the some dimensions (@pxref{write_latex_dynamic_model} for details). Also note that this command will not output the contents of the @@ -1696,7 +1754,7 @@ optional @code{steady_state_model} block (@pxref{steady_state_model}); it will rather output a static version (@i{i.e.} without leads and lags) of the dynamic model declared in the @code{model} block. -Compiling the TeX file requires the following Latex packages: +Compiling the @TeX{} file requires the following @LaTeX{} packages: @code{geometry}, @code{fullpage}, @code{breqn}. @end deffn @@ -2349,9 +2407,9 @@ give more guidance to Dynare, using your knowledge of the model, by providing it with a ``steady state file''. @menu -* Finding the steady state with Dynare nonlinear solver:: -* Using a steady state file:: -* Replace some equations during steady state computations:: +* Finding the steady state with Dynare nonlinear solver:: +* Using a steady state file:: +* Replace some equations during steady state computations:: @end menu @node Finding the steady state with Dynare nonlinear solver @@ -3052,11 +3110,11 @@ there are strong nonlinearities or binding constraints. Such a solution is computed using the @code{extended_path} command. @menu -* Computing the stochastic solution:: -* Typology and ordering of variables:: -* First order approximation:: -* Second order approximation:: -* Third order approximation:: +* Computing the stochastic solution:: +* Typology and ordering of variables:: +* First order approximation:: +* Second order approximation:: +* Third order approximation:: @end menu @node Computing the stochastic solution @@ -4360,9 +4418,9 @@ distribution of forecasts is stored in variables these variables. @item tex -@anchor{tex} Requests the printing of results and graphs in TeX tables -and graphics that can be later directly included in LaTeX files (not -yet implemented) +@anchor{tex} Requests the printing of results and graphs in @TeX{} +tables and graphics that can be later directly included in @LaTeX{} +files (not yet implemented) @item kalman_algo = @var{INTEGER} @anchor{kalman_algo} @@ -5438,13 +5496,13 @@ Sensitivity analysis results are saved locally in @code{/GSA}, where @code{.mod} is the name of the DYNARE model file. @menu -* Sampling:: -* Stability Mapping:: -* Reduced Form Mapping:: -* RMSE:: -* Screening Analysis:: -* Identification Analysis:: -* Performing Sensitivity and Identification Analysis:: +* Sampling:: +* Stability Mapping:: +* Reduced Form Mapping:: +* RMSE:: +* Screening Analysis:: +* Identification Analysis:: +* Performing Sensitivity and Identification Analysis:: @end menu @node Sampling @@ -6806,10 +6864,10 @@ types: integer, character string, array of integers, array of strings. @menu -* Macro expressions:: -* Macro directives:: -* Typical usages:: -* MATLAB/Octave loops versus macro-processor loops:: +* Macro expressions:: +* Macro directives:: +* Typical usages:: +* MATLAB/Octave loops versus macro-processor loops:: @end menu @node Macro expressions @@ -7035,10 +7093,10 @@ and to abort. The argument must evaluate to a string. @subsection Typical usages @menu -* Modularization:: -* Indexed sums or products:: -* Multi-country models:: -* Endogeneizing parameters:: +* Modularization:: +* Indexed sums or products:: +* Multi-country models:: +* Endogeneizing parameters:: @end menu @node Modularization @@ -7399,8 +7457,8 @@ Is @code{true} or @code{false}. @end table @menu -* Dynare Configuration:: -* Parallel Configuration:: +* Dynare Configuration:: +* Parallel Configuration:: @end menu @node Dynare Configuration @@ -7655,6 +7713,380 @@ MatlabOctavePath = matlab @end deffn +@node Reporting +@chapter Reporting + +Dynare provides a simple interface for creating @LaTeX{} reports, +comprised of @LaTeX{} tables and TikZ graphs. You can use the report as +created through Dynare or pick out the pieces you want for inclusion +in your own paper. + +Reports are created and modified by calling methods on class +objects. The objects are hierarchichal, with the following order (from +highest to lowest): @code{Report, Page, Section, Graph/Table/Vspace, +Series}. For simplicity of syntax, we abstract away from these +classes, allowing you to operate directly on a @code{Report} object, +while maintaining the names of these classes in the @code{Report} +Class methods you will use. + +The report is created sequentially, command by command, hence the +order of the commands matters. When an object of a certain hierarchy +is inserted, all methods will function on that object until an object +of equal or greater hierarchy is added. Hence, once you add a +@code{Page} to the report, every time you add a @code{Section} object, +it will be added to this @code{Page} until another @code{Page} is +added to the report (via @ref{addPage}). This will become more clear +with the example at the end of the section. + +Options to the methods are passed differently than those to Dynare +commands. They take the form of named options to Matlab functions +where the arguments come in pairs (@i{e.g.} +@code{function_name(`option_1_name', `option_1_value', +`option_2_name', `option_2_value', ...)}, where @code{option_X_name} +is the name of the option while @code{option_X_value} is the value +assigned to that option). The ordering of the option pairs matters +only in the unusual case when an option is provided twice (probably +erroneously). In this case, the last value passed is the one that is +used. + +Below, you will see a list of methods available for the Report class and +a clarifying example. + +@defmethod Report report compiler, showDate, filename, margin, marginUnit, orientation, paper, title +Instantiates a @code{Report} object. +@optionshead +@table @code +@anchor{compiler} +@item compiler, @var{FILENAME} +The full path to the @LaTeX{} compiler on your system. If this option +is not provided, Dynare will try to find the appropriate program to +compile @LaTeX{} on your system. Default is system dependent: Windows: +?, Mac OS X: @code{/usr/texbin/pdflatex}, Linux: the result of +@code{which pdflatex} + +@item showDate, @code{BOOLEAN} +Display the date and time when the report was compiled. Default: +@code{true} + +@anchor{filename} +@item filename, @var{FILENAME} +The filename to use when saving this report. Default: +@code{report.tex} + +@item margin, @var{DOUBLE} +The margin size. Default: @code{2.5} + +@item marginUnit, `cm' | `in' +Units associated with the margin. Default: @code{`cm'} + +@anchor{orientation} +@item orientation, `landscape' | `portrait' +Paper orientation: Default: @code{`portrait'} + +@anchor{paper} +@item paper, `a4' | `letter' +Paper size. Default: @code{`a4'} + +@item title, @code{STRING} +Report Title. Default: @code{none} +@end table +@end defmethod + +@anchor{addPage} +@defmethod Report addPage footnote, orientation, paper, title, titleFormat +Adds a @code{Page} to the @code{Report}. +@optionshead +@table @code +@item footnote, @code{STRING} +A footnote to be included at the bottom of this page. Default: @code{none} + +@item orientation, `landscape' | `portrait' +@xref{orientation}. + +@item paper, `a4' | `letter' +@xref{paper}. + +@anchor{title} +@item title, @code{STRING} | @code{CELL_ARRAY_STRINGS} +With one entry (a @code{STRING}), the title of the page. With more +than one entry (a @code{CELL_ARRAY_STRINGS}), the title and subtitle(s) +of the page. Default: @code{none} + +@anchor{titleFormat} +@item titleFormat, @code{STRING} | @code{CELL_ARRAY_STRINGS} +A string representing the @LaTeX{} markup to use on the +@ref{title}. The number of cell array entries must be equal to that of +the @ref{title} option. Default: @code{none} + +@end table +@end defmethod + +@defmethod Report addSection cols, height +Adds a @code{Section} to a @code{Page}. +@optionshead +@table @code +@item cols, @code{INTEGER} +The number of columns in the section. Default: @code{1} + +@item height, @code{STRING} +A string to be used with the @code{\sectionheight} @LaTeX{} +command. Default: @code{`!'} +@end table +@end defmethod + +@defmethod Report addGraph data, figname, showGrid, showLegend, showLegendBox, legendLocation, legendOrientation, legendFontSize, seriesToUse, shade, shadeColor, shadeOpacity, title, xlabel, ylabel, xrange, yrange, showZeroline +Adds a @code{Graph} to a @code{Section}. +@optionshead +@table @code +@anchor{data} +@item data, @code{dynSeries} +The @code{dynSeries} that provides the data for the graph. Default: +@code{none} + +@item figname, @code{STRING} +The name to use when saving this figure. Default: @code{[tempname +`.tex']} + +@item showGrid, @code{BOOLEAN} +Whether or not to display the minor grid on the graph. Default: +@code{true} + +@item showLegend, @code{BOOLEAN} +Whether or not to display the legend. Default: @code{false} + +@item showLegendBox, @code{BOOLEAN} +Whether or not to display a box around the legend. Default: +@code{false} + +@item legendLocation, `North' | `South' | `East' | `West' | `NorthEast' | `SouthEast' | `NorthWest' | `SouthWest' | `NorthOutside' | `SouthOutside' | `EastOutside' | `WestOutside' | `NorthEastOutside' | `SouthEastOutside' | `NorthWestOutside' | `SouthWestOutside' | `Best' | `BestOutside' +Where to place the legend in the graph. NB: some of these are not +available under Octave. Default: @code{`SouthEast'} + +@item legendOrientation, `vertical' | `horizontal' +Orientation of the legend. Default: @code{`horizontal'} + +@item legendFontSize, @code{DOUBLE} +The font size for legend entries. Default: @code{8} + +@anchor{seriesToUse} +@item seriesToUse, @code{CELL_ARRAY_STRINGS} +The names of the series contained in the @code{dynSeries} provided to +the @ref{data} option. If empty, use all series provided to +@ref{data} option. Default: @code{empty} + +@item shade, @code{dynDate}:@code{dynDate} +A @code{dynDates} range showing the portion of the graph that should +be shaded. Default: @code{none} + +@item shadeColor, @code{MATLAB_COLOR_NAME} +The color to use in the shaded portion of the graph. Default: +@code{`green'} + +@item shadeOpacity, @code{DOUBLE} +The opacity of the shaded area, must be in @math{[0,1]}. Default: @code{.2} + +@item title, @code{STRING} +Title for the graph. Default: @code{none} + +@item xlabel, @code{STRING} +The x-axis label. Default: @code{none} + +@item ylabel, @code{STRING} +The y-axis label. Default: @code{none} + +@item xrange, @code{dynDate}:@code{dynDate} +The boundary on the x-axis to display in the graph, represented as a +@code{dynDate} range. Default: all + +@item yrange, @code{dynDate}:@code{dynDate} +The boundary on the y-axis to display in the graph, represented as a +@code{dynDate} range. Default: all + +@item showZeroline, @code{BOOLEAN} +Display a solid black line at @math{y = 0}. Default: @code{false} + +@end table +@end defmethod + +@defmethod Report addTable data, showHlines, precision, range, seriesToUse, title, titleSize, vlineAfter, showVlines +Adds a @code{Table} to a @code{Section}. +@optionshead +@table @code + +@item data, @code{dynSeries} +@xref{data}. + +@item showHlines, @code{BOOLEAN} +Whether or not to show horizontal lines separating the rows. Default: @code{false} + +@item precision, @code{INTEGER} +The number of decimal places to report in the table data. Default: @code{1} + +@item range, @code{dynDate}:@code{dynDate} +The date range of the data to be displayed. Default: @code{all} + +@item seriesToUse, @code{CELL_ARRAY_STRINGS} +@xref{seriesToUse}. + +@item title, @code{STRING} +Title for the table. Default: @code{none} + +@item titleSize, @code{STRING} +@LaTeX{} string representing the size of the table title. Default: @code{large} + +@item vlineAfter, @code{dynDate} +Show a vertical line after the specified date. Default: @code{empty} + +@item showVlines, @code{BOOLEAN} +Whether or not to show vertical lines separating the columns. Default: @code{false} +@end table +@end defmethod + +@anchor{addSeries} +@defmethod Report addSeries data, graphLineColor, graphLineStyle, graphLineWidth, graphMarker, graphMarkerEdgeColor, graphMarkerFaceColor, graphMarkerSize, tableShowMarkers, tableAlignRight, tableNegColor, tablePosColor +Adds a @code{Series} to a @code{Graph} or a @code{Table}. +@optionshead +@table @code + +@item data, @code{dynSeries} +@xref{data}. + +@item graphLineColor, @code{MATLAB_COLOR} +Color to use for the series in a graph. Default: @code{`k'} + +@item graphLineStyle, @code{`none'} | @code{`-'} | @code{`--'} | @code{`:'} | @code{`-.'} +Line style for this series in a graph. Default: @code{'-'} + +@item graphLineWidth @code{DOUBLE} +Line width for this series in a graph. Default: @code{0.5} + +@item graphMarker, @code{`+'} | @code{`o'} | @code{`*'} | @code{`.'} | @code{`x'} | @code{`s'} | @code{`square'} | @code{`d'} | @code{`diamond'} | @code{`^'} | @code{`v'} | @code{`>'} | @code{`<'} | @code{`p'} | @code{`pentagram'} | @code{`h'} | @code{`hexagram'} | @code{`none'} +The Marker to use on this series in a graph. Default: @code{none} + +@item graphMarkerEdgeColor, @code{MATLAB_COLOR} +The edge color of the graph marker. Default: @code{`auto'} + +@item graphMarkerFaceColor, @code{MATLAB_COLOR} +The face color of the graph marker. Default: @code{`auto'} + +@item graphMarkerSize, @code{DOUBLE} +The size of the graph marker. Default: @code{6} + +@item tableShowMarkers, @code{BOOLEAN} +In a Table, if @code{true}, surround each cell with brackets and color +it according to @ref{tableNegColor} and @ref{tablePosColor}. No effect +for graphs. Default: @code{false} + +@item tableAlignRight, @code{BOOLEAN} +Whether or not to align the series name to the right of the +cell. Default: @code{false} + +@item tableMarkerLimit, @code{DOUBLE} +For values less than @math{-1*@code{tableMarkerLimit}}, mark the cell +with the color denoted by @ref{tableNegColor}. For those greater than +@code{tableMarkerLimit}, mark the cell with the color denoted by +@ref{tablePosColor}. Default: @code{1e-4} + +@anchor{tableNegColor} +@item tableNegColor, @code{LATEX_COLOR} +The color to use when marking Table data that is less than +zero. Default: @code{`red'} + +@anchor{tablePosColor} +@item tablePosColor, @code{LATEX_COLOR} +The color to use when marking Table data that is greater than +zero. Default: @code{`blue'} + +@end table +@end defmethod + +@defmethod Report addVspace hline, number +Adds a @code{Vspace} (vertical space) to a @code{Section}. +@optionshead +@table @code +@item hline, @code{INTEGER} +The number of horizontal lines to be inserted. Default: @code{0} + +@item number, @code{INTEGER} +The number of new lines to be inserted. Default: @code{1} +@end table +@end defmethod + +@anchor{write} +@defmethod Report write +Writes the @LaTeX{} representation of this @code{Report}, saving it to +the file specified by @ref{filename}. +@end defmethod + +@defmethod Report compile compiler +Compiles the report written by @ref{write} into a @code{pdf} file. If +the report has not already been written (determined by the existence +of the file specified by @ref{filename}, @ref{write} is called. +optionshead +@table @code +@item compiler, @code{FILENAME} +Like @ref{compiler}, except will not overwrite the value of +@code{compiler} contained in the report object. Hence, passing the +value here is useful for using different @LaTeX{} compilers or just +for passing the value at the last minute. +@end table +@end defmethod + +@examplehead + +The following code creates a one page report. The first part of the +page contains two graphs displayed across two columns and one +row. The bottom of the page displays a centered table. +@example +%% Create dynSeries +dsq = dynSeries(`quarterly.csv'); +dsa = dynSeries(`annual.csv'); +dsca = dynSeries(`annual_control.csv'); + +%% Report +rep = report(); + +%% Page 1 +rep = rep.addPage(`title', `My Page Title', `titleFormat', `\large\bfseries'); + +% Section 1 +rep = rep.addSection(`cols', 2); +rep = rep.addGraph(`title', `Graph (1,1)', `showLegend', true, ... + `xrange', dynDate(`2007q1'):dynDate(`2013q4'), ... + `shade', dynDate(`2012q2'):dynDate(`2013q4')); +rep = rep.addSeries(`data', dsq@{`SERIES1'@}, `color', `b', ... + `graphLineWidth', 1); +rep = rep.addSeries(`data', dsq@{`SERIES2'@}, `color', `g', ... + `graphLineStyle', '--', `graphLineWidth', 1.5); +rep = rep.addGraph(`title', `Graph (1,2)', `showLegend', true, ... + `xrange', dynDate(`2007q1'):dynDate(`2013q4'), ... + `shade', dynDate(`2012q2'):dynDate(`2013q4')); +rep = rep.addSeries(`data', dsq@{`SERIES3'@}, `color', `b', ... + `graphLineWidth', 1); +rep = rep.addSeries(`data', dsq@{`SERIES4'@}, `color', `g', ... + `graphLineStyle', '--', `graphLineWidth', 1.5); + +% Section 2 +rep = rep.addSection(); +rep = rep.addTable(`title', `Table 1', ... + `range', dynDate(`2012'):dynDate(`2014')); +shortNames = @{`US', `EU'@}; +longNames = @{`United States', `Euro Area'@}; +for i=1:length(shortNames) + rep = rep.addSeries(`data', dsa@{[`GDP_' shortNames@{i@}]@}); + delta = dsa@{[`GDP_' shortNames@{i@}]@}-dsca@{[`GDP_' shortNames@{i@}]@}; + delta = delta.tex_rename(`$\Delta$'); + rep = rep.addSeries(`data', delta, ... + `tableShowMarkers', true, ... + `tableAlignRight', true); +end + +%% Write & Compile Report +rep.write(); +rep.compile(); +@end example + + @node Examples @chapter Examples diff --git a/matlab/@dynSeries/lag.m b/matlab/@dynSeries/lag.m new file mode 100644 index 000000000..918510af1 --- /dev/null +++ b/matlab/@dynSeries/lag.m @@ -0,0 +1,81 @@ +function us = lag(ts,p) + +%@info: +%! @deftypefn {Function File} {@var{us} =} lag (@var{ts}) +%! @anchor{lag} +%! @sp 1 +%! Computes lagged time series. +%! @sp 2 +%! @strong{Inputs} +%! @sp 1 +%! @table @var +%! @item ts +%! Dynare time series object, instantiated by @ref{dynSeries} +%! @end table +%! @sp 2 +%! @strong{Outputs} +%! @sp 1 +%! @table @var +%! @item us +%! Dynare time series object with transformed data field. +%! @end table +%! @end deftypefn +%@eod: + +% Copyright (C) 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 . + +% Set default number of lags +if nargin<2 + p = 1; +end + +% Copy of ts dynSeries object +us = ts; + +% Update data member +us.data = [NaN(p,ts.vobs); ts.data(1:end-p,:)]; + +for i=1:ts.vobs + us.name(i) = {[ 'lag(' ts.name{i} ',' int2str(p) ')']}; + us.tex(i) = {[ ts.tex{i} '_{-' int2str(p) '}']}; +end + +%@test:1 +%$ t = zeros(4,1); +%$ +%$ try +%$ data = transpose(0:1:50); +%$ ts = dynSeries(data,'1950Q1'); +%$ a = ts.lag; +%$ b = ts.lag.lag; +%$ c = lag(ts,2); +%$ t(1) = 1; +%$ catch +%$ t = 0; +%$ end +%$ +%$ if length(t)>1 +%$ DATA = [NaN(1,ts.vobs); transpose(0:1:49)]; +%$ t(2) = dyn_assert(a.data,DATA,1e-15); +%$ DATA = [NaN(2,ts.vobs); transpose(0:1:48)]; +%$ t(3) = dyn_assert(b.data,DATA,1e-15); +%$ t(4) = dyn_assert(b.data,c.data,1e-15); +%$ end +%$ +%$ T = all(t); +%@eof:1b \ No newline at end of file diff --git a/matlab/@dynSeries/subsref.m b/matlab/@dynSeries/subsref.m index 3019617dc..249cdbee5 100644 --- a/matlab/@dynSeries/subsref.m +++ b/matlab/@dynSeries/subsref.m @@ -66,7 +66,7 @@ switch S(1).type switch S(1).subs case {'data','nobs','vobs','name','tex','freq','time','init'} % Public members. B = builtin('subsref', A, S(1)); - case {'log','exp','ygrowth','qgrowth','ydiff','qdiff'} % Give "dot access" to public methods. + case {'log','exp','ygrowth','qgrowth','ydiff','qdiff','lag'} % Give "dot access" to public methods. B = feval(S(1).subs,A); case {'save'} % Save dynSeries object on disk (default is a csv file). B = NaN; diff --git a/matlab/display_estimation_results_table.m b/matlab/display_estimation_results_table.m new file mode 100644 index 000000000..8ae45c01f --- /dev/null +++ b/matlab/display_estimation_results_table.m @@ -0,0 +1,560 @@ +function oo_=display_estimation_results_table(xparam1,stdh,M_,options_,estim_params_,bayestopt_,oo_,pnames,table_title,field_name) +%function oo_=display_results_table(xparam1,stdh,M_,estim_params_,bayestopt_,oo_,pnames,table_title,field_name) +% Display estimation results on screen and write them to TeX-file +% +% INPUTS +% o xparam1 [double] (p*1) vector of estimate parameters. +% o stdh [double] (p*1) vector of estimate parameters. +% o M_ Matlab's structure describing the Model (initialized by dynare, see @ref{M_}). +% o estim_params_ Matlab's structure describing the estimated_parameters (initialized by dynare, see @ref{estim_params_}). +% o options_ Matlab's structure describing the options (initialized by dynare, see @ref{options_}). +% o bayestopt_ Matlab's structure describing the priors (initialized by dynare, see @ref{bayesopt_}). +% o oo_ Matlab's structure gathering the results (initialized by dynare, see @ref{oo_}). +% o pnames [string] Character Array storing the names for prior distributions +% o table_title [string] Title of the Table +% o field_name [string] String storing the name of the fields for oo_ where the parameters are stored +% +% OUTPUTS +% o oo_ Matlab's structure gathering the results +% +% SPECIAL REQUIREMENTS +% None. + +% Copyright (C) 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 . + +nvx = estim_params_.nvx; % Variance of the structural innovations (number of parameters). +nvn = estim_params_.nvn; % Variance of the measurement innovations (number of parameters). +ncx = estim_params_.ncx; % Covariance of the structural innovations (number of parameters). +ncn = estim_params_.ncn; % Covariance of the measurement innovations (number of parameters). +np = estim_params_.np ; % Number of deep parameters. +nx = nvx+nvn+ncx+ncn+np; % Total number of parameters to be estimated. + +disp(' ') +disp(['RESULTS FROM ' upper(table_title) ' ESTIMATION']) +LaTeXtitle=strrep(table_title,' ','_'); +tstath = abs(xparam1)./stdh; + +header_width = row_header_width(M_,estim_params_,bayestopt_); +if strcmp(field_name,'posterior') + tit1 = sprintf('%-*s %7s %8s %7s %4s %6s\n',header_width-2,' ','prior mean', ... + 'mode','s.d.','prior','pstdev'); +else + tit1 = sprintf('%-*s %10s %7s %6s\n',header_width-2,' ','Estimate','s.d.','t-stat'); +end +if np + ip = nvx+nvn+ncx+ncn+1; + disp('parameters') + disp(tit1) + for i=1:np + name = bayestopt_.name{ip}; + if strcmp(field_name,'posterior') + fprintf('%-*s %7.3f %8.4f %7.4f %4s %6.4f \n', ... + header_width,name, ... + bayestopt_.p1(ip),xparam1(ip),stdh(ip), ... + pnames(bayestopt_.pshape(ip)+1,:), ... + bayestopt_.p2(ip)); + else + fprintf('%-*s %8.4f %7.4f %7.4f \n', ... + header_width,name,xparam1(ip),stdh(ip),tstath(ip)); + end + eval(['oo_.' field_name '_mode.parameters.' name ' = xparam1(ip);']); + eval(['oo_.' field_name '_std.parameters.' name ' = stdh(ip);']); + ip = ip+1; + end + disp(' ') +end +if nvx + ip = 1; + disp('standard deviation of shocks') + disp(tit1) + for i=1:nvx + k = estim_params_.var_exo(i,1); + name = deblank(M_.exo_names(k,:)); + if strcmp(field_name,'posterior') + fprintf('%-*s %7.3f %8.4f %7.4f %4s %6.4f \n', ... + header_width,name,bayestopt_.p1(ip),xparam1(ip), ... + stdh(ip),pnames(bayestopt_.pshape(ip)+1,:), ... + bayestopt_.p2(ip)); + else + fprintf('%-*s %8.4f %7.4f %7.4f \n',header_width,name,xparam1(ip),stdh(ip),tstath(ip)); + end + M_.Sigma_e(k,k) = xparam1(ip)*xparam1(ip); + eval(['oo_.' field_name '_mode.shocks_std.' name ' = xparam1(ip);']); + eval(['oo_.' field_name '_std.shocks_std.' name ' = stdh(ip);']); + ip = ip+1; + end + disp(' ') + end + if nvn + disp('standard deviation of measurement errors') + disp(tit1) + ip = nvx+1; + for i=1:nvn + name = deblank(options_.varobs(estim_params_.nvn_observable_correspondence(i,1),:)); + if strcmp(field_name,'posterior') + fprintf('%-*s %7.3f %8.4f %7.4f %4s %6.4f \n', ... + header_width,name,bayestopt_.p1(ip), ... + xparam1(ip),stdh(ip), ... + pnames(bayestopt_.pshape(ip)+1,:), ... + bayestopt_.p2(ip)); + else + fprintf('%-*s %8.4f %7.4f %7.4f \n',header_width,name,xparam1(ip),stdh(ip),tstath(ip)) + end + eval(['oo_.' field_name '_mode.measurement_errors_std.' name ' = xparam1(ip);']); + eval(['oo_.' field_name '_std.measurement_errors_std.' name ' = stdh(ip);']); + ip = ip+1; + end + disp(' ') + end + +if ncx + disp('correlation of shocks') + disp(tit1) + ip = nvx+nvn+1; + for i=1:ncx + k1 = estim_params_.corrx(i,1); + k2 = estim_params_.corrx(i,2); + name = [deblank(M_.exo_names(k1,:)) ',' deblank(M_.exo_names(k2,:))]; + NAME = [deblank(M_.exo_names(k1,:)) '_' deblank(M_.exo_names(k2,:))]; + if strcmp(field_name,'posterior') + fprintf('%-*s %7.3f %8.4f %7.4f %4s %6.4f \n', ... + header_width,name,bayestopt_.p1(ip),xparam1(ip),stdh(ip), ... + pnames(bayestopt_.pshape(ip)+1,:), bayestopt_.p2(ip)); + else + fprintf('%-*s %8.4f %7.4f %7.4f \n', header_width,name,xparam1(ip),stdh(ip),tstath(ip)); + end + M_.Sigma_e(k1,k2) = xparam1(ip)*sqrt(M_.Sigma_e(k1,k1)*M_.Sigma_e(k2,k2)); + M_.Sigma_e(k2,k1) = M_.Sigma_e(k1,k2); + eval(['oo_.' field_name '_mode.shocks_corr.' NAME ' = xparam1(ip);']); + eval(['oo_.' field_name '_std.shocks_corr.' NAME ' = stdh(ip);']); + ip = ip+1; + end + disp(' ') +end + +if ncn + disp('correlation of measurement errors') + disp(tit1) + ip = nvx+nvn+ncx+1; + for i=1:ncn + k1 = estim_params_.corrn(i,1); + k2 = estim_params_.corrn(i,2); + name = [deblank(M_.endo_names(k1,:)) ',' deblank(M_.endo_names(k2,:))]; + NAME = [deblank(M_.endo_names(k1,:)) '_' deblank(M_.endo_names(k2,:))]; + if strcmp(field_name,'posterior') + fprintf('%-*s %7.3f %8.4f %7.4f %4s %6.4f \n', ... + header_width,name,bayestopt_.p1(ip),xparam1(ip),stdh(ip), ... + pnames(bayestopt_.pshape(ip)+1,:), bayestopt_.p2(ip)); + else + fprintf('%-*s %8.4f %7.4f %7.4f \n',header_width,name,xparam1(ip),stdh(ip),tstath(ip)); + end + eval(['oo_.' field_name '_mode.measurement_errors_corr.' NAME ' = xparam1(ip);']); + eval(['oo_.' field_name '_std.measurement_errors_corr.' NAME ' = stdh(ip);']); + ip = ip+1; + end + disp(' ') +end + +OutputDirectoryName = CheckPath('Output',M_.dname); + +if any(bayestopt_.pshape > 0) && options_.TeX %% Bayesian estimation (posterior mode) Latex output + if np + filename = [OutputDirectoryName '/' M_.fname '_Posterior_Mode_1.TeX']; + fidTeX = fopen(filename,'w'); + fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); + fprintf(fidTeX,'%% RESULTS FROM POSTERIOR MAXIMIZATION (parameters)\n'); + fprintf(fidTeX,['%% ' datestr(now,0)]); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,'\\begin{center}\n'); + fprintf(fidTeX,'\\begin{longtable}{l|lcccc} \n'); + fprintf(fidTeX,'\\caption{Results from posterior maximization (parameters)}\n '); + fprintf(fidTeX,'\\label{Table:Posterior:1}\\\\\n'); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); + fprintf(fidTeX,'\\hline \\endfirsthead \n'); + fprintf(fidTeX,'\\caption{(continued)}\n '); + fprintf(fidTeX,'\\label{Table:Posterior:1}\\\\\n'); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); + fprintf(fidTeX,'\\hline \\endhead \n'); + fprintf(fidTeX,'\\hline \\multicolumn{6}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); + fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); + ip = nvx+nvn+ncx+ncn+1; + for i=1:np + fprintf(fidTeX,'$%s$ & %s & %7.3f & %6.4f & %8.4f & %7.4f \\\\ \n',... + M_.param_names_tex(estim_params_.param_vals(i,1),:),... + deblank(pnames(bayestopt_.pshape(ip)+1,:)),... + bayestopt_.p1(ip),... + bayestopt_.p2(ip),... + xparam1(ip),... + stdh(ip)); + ip = ip + 1; + end + fprintf(fidTeX,'\\end{longtable}\n '); + fprintf(fidTeX,'\\end{center}\n'); + fprintf(fidTeX,'%% End of TeX file.\n'); + fclose(fidTeX); + end + if nvx + TeXfile = [OutputDirectoryName '/' M_.fname '_Posterior_Mode_2.TeX']; + fidTeX = fopen(TeXfile,'w'); + fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); + fprintf(fidTeX,'%% RESULTS FROM POSTERIOR MAXIMIZATION (standard deviation of structural shocks)\n'); + fprintf(fidTeX,['%% ' datestr(now,0)]); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,'\\begin{center}\n'); + fprintf(fidTeX,'\\begin{longtable}{l|lcccc} \n'); + fprintf(fidTeX,'\\caption{Results from posterior maximization (standard deviation of structural shocks)}\n '); + fprintf(fidTeX,'\\label{Table:Posterior:2}\\\\\n'); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); + fprintf(fidTeX,'\\hline \\endfirsthead \n'); + fprintf(fidTeX,'\\caption{(continued)}\n '); + fprintf(fidTeX,'\\label{Table:Posterior:2}\\\\\n'); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); + fprintf(fidTeX,'\\hline \\endhead \n'); + fprintf(fidTeX,'\\hline \\multicolumn{6}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); + fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); + ip = 1; + for i=1:nvx + k = estim_params_.var_exo(i,1); + fprintf(fidTeX,[ '$%s$ & %4s & %7.3f & %6.4f & %8.4f & %7.4f \\\\ \n'],... + deblank(M_.exo_names_tex(k,:)),... + deblank(pnames(bayestopt_.pshape(ip)+1,:)),... + bayestopt_.p1(ip),... + bayestopt_.p2(ip),... + xparam1(ip), ... + stdh(ip)); + ip = ip+1; + end + fprintf(fidTeX,'\\end{longtable}\n '); + fprintf(fidTeX,'\\end{center}\n'); + fprintf(fidTeX,'%% End of TeX file.\n'); + fclose(fidTeX); + end + if nvn + TeXfile = [OutputDirectoryName '/' M_.fname '_Posterior_Mode_3.TeX']; + fidTeX = fopen(TeXfile,'w'); + fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); + fprintf(fidTeX,'%% RESULTS FROM POSTERIOR MAXIMIZATION (standard deviation of measurement errors)\n'); + fprintf(fidTeX,['%% ' datestr(now,0)]); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,'\\begin{center}\n'); + fprintf(fidTeX,'\\begin{longtable}{l|lcccc} \n'); + fprintf(fidTeX,'\\caption{Results from posterior maximization (standard deviation of measurement errors)}\n '); + fprintf(fidTeX,'\\label{Table:Posterior:3}\\\\\n'); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); + fprintf(fidTeX,'\\hline \\endfirsthead \n'); + fprintf(fidTeX,'\\caption{(continued)}\n '); + fprintf(fidTeX,'\\label{Table:Posterior:3}\\\\\n'); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); + fprintf(fidTeX,'\\hline \\endhead \n'); + fprintf(fidTeX,'\\hline \\multicolumn{6}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); + fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); + ip = nvx+1; + for i=1:nvn + idx = strmatch(options_.varobs(estim_params_.nvn_observable_correspondence(i,1),:),M_.endo_names); + fprintf(fidTeX,'$%s$ & %4s & %7.3f & %6.4f & %8.4f & %7.4f \\\\ \n',... + deblank(M_.endo_names_tex(idx,:)), ... + deblank(pnames(bayestopt_.pshape(ip)+1,:)), ... + bayestopt_.p1(ip), ... + bayestopt_.p2(ip),... + xparam1(ip),... + stdh(ip)); + ip = ip+1; + end + fprintf(fidTeX,'\\end{longtable}\n '); + fprintf(fidTeX,'\\end{center}\n'); + fprintf(fidTeX,'%% End of TeX file.\n'); + fclose(fidTeX); + end + if ncx + TeXfile = [OutputDirectoryName '/' M_.fname '_Posterior_Mode_4.TeX']; + fidTeX = fopen(TeXfile,'w'); + fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); + fprintf(fidTeX,'%% RESULTS FROM POSTERIOR MAXIMIZATION (correlation of structural shocks)\n'); + fprintf(fidTeX,['%% ' datestr(now,0)]); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,'\\begin{center}\n'); + fprintf(fidTeX,'\\begin{longtable}{l|lcccc} \n'); + fprintf(fidTeX,'\\caption{Results from posterior parameters (correlation of structural shocks)}\n '); + fprintf(fidTeX,'\\label{Table:Posterior:4}\\\\\n'); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); + fprintf(fidTeX,'\\hline \\endfirsthead \n'); + fprintf(fidTeX,'\\caption{(continued)}\n '); + fprintf(fidTeX,'\\label{Table:Posterior:4}\\\\\n'); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); + fprintf(fidTeX,'\\hline \\endhead \n'); + fprintf(fidTeX,'\\hline \\multicolumn{6}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); + fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); + ip = nvx+nvn+1; + for i=1:ncx + k1 = estim_params_.corrx(i,1); + k2 = estim_params_.corrx(i,2); + fprintf(fidTeX,[ '$%s$ & %s & %7.3f & %6.4f & %8.4f & %7.4f \\\\ \n'],... + [deblank(M_.exo_names_tex(k1,:)) ',' deblank(M_.exo_names_tex(k2,:))], ... + deblank(pnames(bayestopt_.pshape(ip)+1,:)), ... + bayestopt_.p1(ip), ... + bayestopt_.p2(ip), ... + xparam1(ip), ... + stdh(ip)); + ip = ip+1; + end + fprintf(fidTeX,'\\end{longtable}\n '); + fprintf(fidTeX,'\\end{center}\n'); + fprintf(fidTeX,'%% End of TeX file.\n'); + fclose(fidTeX); + end + if ncn + TeXfile = [OutputDirectoryName '/' M_.fname '_Posterior_Mode_5.TeX']; + fidTeX = fopen(TeXfile,'w'); + fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); + fprintf(fidTeX,'%% RESULTS FROM POSTERIOR MAXIMIZATION (correlation of measurement errors)\n'); + fprintf(fidTeX,['%% ' datestr(now,0)]); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,'\\begin{center}\n'); + fprintf(fidTeX,'\\begin{longtable}{l|lcccc} \n'); + fprintf(fidTeX,'\\caption{Results from posterior parameters (correlation of measurement errors)}\n '); + fprintf(fidTeX,'\\label{Table:Posterior:5}\\\\\n'); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); + fprintf(fidTeX,'\\hline \\endfirsthead \n'); + fprintf(fidTeX,'\\caption{(continued)}\n '); + fprintf(fidTeX,'\\label{Table:Posterior:5}\\\\\n'); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); + fprintf(fidTeX,'\\hline \\endhead \n'); + fprintf(fidTeX,'\\hline \\multicolumn{6}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); + fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); + ip = nvx+nvn+ncx+1; + for i=1:ncn + k1 = estim_params_.corrn(i,1); + k2 = estim_params_.corrn(i,2); + fprintf(fidTeX,'$%s$ & %s & %7.3f & %6.4f & %8.4f & %7.4f \\\\ \n',... + [deblank(M_.endo_names_tex(k1,:)) ',' deblank(M_.endo_names_tex(k2,:))], ... + pnames(bayestopt_.pshape(ip)+1,:), ... + bayestopt_.p1(ip), ... + bayestopt_.p2(ip), ... + xparam1(ip), ... + stdh(ip)); + ip = ip+1; + end + fprintf(fidTeX,'\\end{longtable}\n '); + fprintf(fidTeX,'\\end{center}\n'); + fprintf(fidTeX,'%% End of TeX file.\n'); + fclose(fidTeX); + end +elseif all(bayestopt_.pshape == 0) && options_.TeX %% MLE and GMM Latex output + if np + filename = [OutputDirectoryName '/' M_.fname '_' LaTeXtitle '_Mode_1.TeX']; + fidTeX = fopen(filename,'w'); + fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); + fprintf(fidTeX,['%% RESULTS FROM ' table_title ' MAXIMIZATION (parameters)\n']); + fprintf(fidTeX,['%% ' datestr(now,0)]); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,'\\begin{center}\n'); + fprintf(fidTeX,'\\begin{longtable}{l|lcc} \n'); + fprintf(fidTeX,['\\caption{Results from ' table_title ' maximization (parameters)}\n ']); + fprintf(fidTeX,['\\label{Table:' LaTeXtitle ':1}\\\\\n']); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Mode & s.d. & t-stat\\\\ \n'); + fprintf(fidTeX,'\\hline \\endfirsthead \n'); + fprintf(fidTeX,'\\caption{(continued)}\n '); + fprintf(fidTeX,['\\label{Table:' LaTeXtitle ':1}\\\\\n']); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Mode & s.d. & t-stat\\\\ \n'); + fprintf(fidTeX,'\\hline \\endhead \n'); + fprintf(fidTeX,'\\hline \\multicolumn{4}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); + fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); + ip = nvx+nvn+ncx+ncn+1; + for i=1:np + fprintf(fidTeX,'$%s$ & %8.4f & %7.4f & %7.4f\\\\ \n',... + M_.param_names_tex(estim_params_.param_vals(i,1),:),... + xparam1(ip),... + stdh(ip),... + tstath(ip)); + ip = ip + 1; + end + fprintf(fidTeX,'\\end{longtable}\n '); + fprintf(fidTeX,'\\end{center}\n'); + fprintf(fidTeX,'%% End of TeX file.\n'); + fclose(fidTeX); + end + if nvx + filename = [OutputDirectoryName '/' M_.fname '_' LaTeXtitle '_Mode_2.TeX']; + fidTeX = fopen(filename,'w'); + fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); + fprintf(fidTeX,['%% RESULTS FROM ' table_title ' MAXIMIZATION (standard deviation of structural shocks)\n']); + fprintf(fidTeX,['%% ' datestr(now,0)]); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,'\\begin{center}\n'); + fprintf(fidTeX,'\\begin{longtable}{l|lcc} \n'); + fprintf(fidTeX,['\\caption{Results from ' table_title ' maximization (standard deviation of structural shocks)}\n ']); + fprintf(fidTeX,['\\label{Table:' LaTeXtitle ':2}\\\\\n']); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Mode & s.d. & t-stat\\\\ \n'); + fprintf(fidTeX,'\\hline \\endfirsthead \n'); + fprintf(fidTeX,'\\caption{(continued)}\n '); + fprintf(fidTeX,['\\label{Table:' LaTeXtitle ':2}\\\\\n']); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Mode & s.d. & t-stat\\\\ \n'); + fprintf(fidTeX,'\\hline \\endhead \n'); + fprintf(fidTeX,'\\hline \\multicolumn{4}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); + fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); + ip = 1; + for i=1:nvx + k = estim_params_.var_exo(i,1); + fprintf(fidTeX,[ '$%s$ & %8.4f & %7.4f & %7.4f\\\\ \n'],... + deblank(M_.exo_names_tex(k,:)),... + xparam1(ip), ... + stdh(ip),... + tstath(ip)); + ip = ip+1; + end + fprintf(fidTeX,'\\end{longtable}\n '); + fprintf(fidTeX,'\\end{center}\n'); + fprintf(fidTeX,'%% End of TeX file.\n'); + fclose(fidTeX); + end + if nvn + filename = [OutputDirectoryName '/' M_.fname '_' LaTeXtitle '_Mode_3.TeX']; + fidTeX = fopen(filename,'w'); + fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); + fprintf(fidTeX,['%% RESULTS FROM ' table_title ' MAXIMIZATION (standard deviation of measurement errors)\n']); + fprintf(fidTeX,['%% ' datestr(now,0)]); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,'\\begin{center}\n'); + fprintf(fidTeX,'\\begin{longtable}{l|lcc} \n'); + fprintf(fidTeX,['\\caption{Results from ' table_title ' maximization (standard deviation of measurement errors)}\n ']); + fprintf(fidTeX,['\\label{Table:' LaTeXtitle ':3}\\\\\n']); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Mode & s.d. & t-stat\\\\ \n'); + fprintf(fidTeX,'\\hline \\endfirsthead \n'); + fprintf(fidTeX,'\\caption{(continued)}\n '); + fprintf(fidTeX,['\\label{Table:' LaTeXtitle ':3}\\\\\n']); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Mode & s.d. & t-stat\\\\ \n'); + fprintf(fidTeX,'\\hline \\endhead \n'); + fprintf(fidTeX,'\\hline \\multicolumn{4}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); + fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); + ip = nvx+1; + for i=1:nvn + idx = strmatch(options_.varobs(estim_params_.nvn_observable_correspondence(i,1),:),M_.endo_names); + fprintf(fidTeX,'$%s$ & %8.4f & %7.4f & %7.4f \\\\ \n',... + deblank(M_.endo_names_tex(idx,:)), ... + xparam1(ip),... + stdh(ip),... + tstath(ip)); + ip = ip+1; + end + fprintf(fidTeX,'\\end{longtable}\n '); + fprintf(fidTeX,'\\end{center}\n'); + fprintf(fidTeX,'%% End of TeX file.\n'); + fclose(fidTeX); + end + if ncx + filename = [OutputDirectoryName '/' M_.fname '_' LaTeXtitle '_Mode_4.TeX']; + fidTeX = fopen(filename,'w'); + fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); + fprintf(fidTeX,['%% RESULTS FROM ' table_title ' MAXIMIZATION (correlation of structural shocks)\n']); + fprintf(fidTeX,['%% ' datestr(now,0)]); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,'\\begin{center}\n'); + fprintf(fidTeX,'\\begin{longtable}{l|lcc} \n'); + fprintf(fidTeX,['\\caption{Results from ' table_title ' maximization (correlation of structural shocks)}\n ']); + fprintf(fidTeX,['\\label{Table:' LaTeXtitle ':4}\\\\\n']); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Mode & s.d. & t-stat\\\\ \n'); + fprintf(fidTeX,'\\hline \\endfirsthead \n'); + fprintf(fidTeX,'\\caption{(continued)}\n '); + fprintf(fidTeX,['\\label{Table:' LaTeXtitle ':4}\\\\\n']); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Mode & s.d. & t-stat\\\\ \n'); + fprintf(fidTeX,'\\hline \\endhead \n'); + fprintf(fidTeX,'\\hline \\multicolumn{4}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); + fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); + ip = nvx+nvn+1; + for i=1:ncx + k1 = estim_params_.corrx(i,1); + k2 = estim_params_.corrx(i,2); + fprintf(fidTeX,[ '$%s$ & %8.4f & %7.4f & %7.4f \\\\ \n'],... + [deblank(M_.exo_names_tex(k1,:)) ',' deblank(M_.exo_names_tex(k2,:))], ... + xparam1(ip), ... + stdh(ip),... + tstath(ip)); + ip = ip+1; + end + fprintf(fidTeX,'\\end{longtable}\n '); + fprintf(fidTeX,'\\end{center}\n'); + fprintf(fidTeX,'%% End of TeX file.\n'); + fclose(fidTeX); + end + if ncn + filename = [OutputDirectoryName '/' M_.fname '_' LaTeXtitle '_Mode_5.TeX']; + fidTeX = fopen(filename,'w'); + fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); + fprintf(fidTeX,['%% RESULTS FROM ' table_title ' MAXIMIZATION (correlation of measurement errors)\n']); + fprintf(fidTeX,['%% ' datestr(now,0)]); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,' \n'); + fprintf(fidTeX,'\\begin{center}\n'); + fprintf(fidTeX,'\\begin{longtable}{l|lcc} \n'); + fprintf(fidTeX,['\\caption{Results from ' table_title ' maximization (correlation of measurement errors)}\n ']); + fprintf(fidTeX,['\\label{Table:' LaTeXtitle ':5}\\\\\n']); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Mode & s.d. & t-stat\\\\ \n'); + fprintf(fidTeX,'\\hline \\endfirsthead \n'); + fprintf(fidTeX,'\\caption{(continued)}\n '); + fprintf(fidTeX,['\\label{Table:' LaTeXtitle ':5}\\\\\n']); + fprintf(fidTeX,'\\hline\\hline \\\\ \n'); + fprintf(fidTeX,' & Mode & s.d. & t-stat\\\\ \n'); + fprintf(fidTeX,'\\hline \\endhead \n'); + fprintf(fidTeX,'\\hline \\multicolumn{4}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); + fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); + ip = nvx+nvn+ncx+1; + for i=1:ncn + k1 = estim_params_.corrn(i,1); + k2 = estim_params_.corrn(i,2); + fprintf(fidTeX,'$%s$ & %8.4f & %7.4f & %7.4f \\\\ \n',... + [deblank(M_.endo_names_tex(k1,:)) ',' deblank(M_.endo_names_tex(k2,:))], ... + xparam1(ip), ... + stdh(ip),... + tstath(ip)); + ip = ip+1; + end + fprintf(fidTeX,'\\end{longtable}\n '); + fprintf(fidTeX,'\\end{center}\n'); + fprintf(fidTeX,'%% End of TeX file.\n'); + fclose(fidTeX); + end + +end \ No newline at end of file diff --git a/matlab/dynare_estimation_1.m b/matlab/dynare_estimation_1.m index 7efbd29c9..8f4522712 100644 --- a/matlab/dynare_estimation_1.m +++ b/matlab/dynare_estimation_1.m @@ -523,102 +523,8 @@ if ~options_.cova_compute end if any(bayestopt_.pshape > 0) && ~options_.mh_posterior_mode_estimation - disp(' ') - disp('RESULTS FROM POSTERIOR MAXIMIZATION') - tstath = zeros(nx,1); - for i = 1:nx - tstath(i) = abs(xparam1(i))/stdh(i); - end - - header_width = row_header_width(M_,estim_params_,bayestopt_); - - tit1 = sprintf('%-*s %7s %8s %7s %6s %4s %6s\n',header_width-2,' ','prior mean', ... - 'mode','s.d.','t-stat','prior','pstdev'); - if np - ip = nvx+nvn+ncx+ncn+1; - disp('parameters') - disp(tit1) - for i=1:np - name = bayestopt_.name{ip}; - disp(sprintf('%-*s %7.3f %8.4f %7.4f %7.4f %4s %6.4f', ... - header_width,name, ... - bayestopt_.p1(ip),xparam1(ip),stdh(ip),tstath(ip), ... - pnames(bayestopt_.pshape(ip)+1,:), ... - bayestopt_.p2(ip))); - eval(['oo_.posterior_mode.parameters.' name ' = xparam1(ip);']); - eval(['oo_.posterior_std.parameters.' name ' = stdh(ip);']); - ip = ip+1; - end - end - if nvx - ip = 1; - disp('standard deviation of shocks') - disp(tit1) - for i=1:nvx - k = estim_params_.var_exo(i,1); - name = deblank(M_.exo_names(k,:)); - disp(sprintf('%-*s %7.3f %8.4f %7.4f %7.4f %4s %6.4f', ... - header_width,name,bayestopt_.p1(ip),xparam1(ip), ... - stdh(ip),tstath(ip),pnames(bayestopt_.pshape(ip)+1,:), ... - bayestopt_.p2(ip))); - M_.Sigma_e(k,k) = xparam1(ip)*xparam1(ip); - eval(['oo_.posterior_mode.shocks_std.' name ' = xparam1(ip);']); - eval(['oo_.posterior_std.shocks_std.' name ' = stdh(ip);']); - ip = ip+1; - end - end - if nvn - disp('standard deviation of measurement errors') - disp(tit1) - ip = nvx+1; - for i=1:nvn - name = deblank(options_.varobs(estim_params_.nvn_observable_correspondence(i,1),:)); - disp(sprintf('%-*s %7.3f %8.4f %7.4f %7.4f %4s %6.4f', ... - header_width,name,bayestopt_.p1(ip), ... - xparam1(ip),stdh(ip),tstath(ip), ... - pnames(bayestopt_.pshape(ip)+1,:), ... - bayestopt_.p2(ip))); - eval(['oo_.posterior_mode.measurement_errors_std.' name ' = xparam1(ip);']); - eval(['oo_.posterior_std.measurement_errors_std.' name ' = stdh(ip);']); - ip = ip+1; - end - end - if ncx - disp('correlation of shocks') - disp(tit1) - ip = nvx+nvn+1; - for i=1:ncx - k1 = estim_params_.corrx(i,1); - k2 = estim_params_.corrx(i,2); - name = [deblank(M_.exo_names(k1,:)) ',' deblank(M_.exo_names(k2,:))]; - NAME = [deblank(M_.exo_names(k1,:)) '_' deblank(M_.exo_names(k2,:))]; - disp(sprintf('%-*s %7.3f %8.4f %7.4f %7.4f %4s %6.4f', ... - header_width,name,bayestopt_.p1(ip),xparam1(ip),stdh(ip),tstath(ip), ... - pnames(bayestopt_.pshape(ip)+1,:), bayestopt_.p2(ip))); - M_.Sigma_e(k1,k2) = xparam1(ip)*sqrt(M_.Sigma_e(k1,k1)*M_.Sigma_e(k2,k2)); - M_.Sigma_e(k2,k1) = M_.Sigma_e(k1,k2); - eval(['oo_.posterior_mode.shocks_corr.' NAME ' = xparam1(ip);']); - eval(['oo_.posterior_std.shocks_corr.' NAME ' = stdh(ip);']); - ip = ip+1; - end - end - if ncn - disp('correlation of measurement errors') - disp(tit1) - ip = nvx+nvn+ncx+1; - for i=1:ncn - k1 = estim_params_.corrn(i,1); - k2 = estim_params_.corrn(i,2); - name = [deblank(M_.endo_names(k1,:)) ',' deblank(M_.endo_names(k2,:))]; - NAME = [deblank(M_.endo_names(k1,:)) '_' deblank(M_.endo_names(k2,:))]; - disp(sprintf('%-*s %7.3f %8.4f %7.4f %7.4f %4s %6.4f', ... - header_width,name,bayestopt_.p1(ip),xparam1(ip),stdh(ip),tstath(ip), ... - pnames(bayestopt_.pshape(ip)+1,:), bayestopt_.p2(ip))); - eval(['oo_.posterior_mode.measurement_errors_corr.' NAME ' = xparam1(ip);']); - eval(['oo_.posterior_std.measurement_errors_corr.' NAME ' = stdh(ip);']); - ip = ip+1; - end - end + %% display results table and store parameter estimates and standard errors in results + oo_=display_estimation_results_table(xparam1,stdh,M_,options_,estim_params_,bayestopt_,oo_,pnames,'Posterior','posterior'); %% Laplace approximation to the marginal log density: if options_.cova_compute estim_params_nbr = size(xparam1,1); @@ -631,289 +537,11 @@ if any(bayestopt_.pshape > 0) && ~options_.mh_posterior_mode_estimation disp(' ') end elseif ~any(bayestopt_.pshape > 0) && ~options_.mh_posterior_mode_estimation - disp(' ') - disp('RESULTS FROM MAXIMUM LIKELIHOOD') - tstath = zeros(nx,1); - for i = 1:nx - tstath(i) = abs(xparam1(i))/stdh(i); - end - header_width = row_header_width(M_,estim_params_,bayestopt_); - tit1 = sprintf('%-*s %10s %7s %6s\n',header_width-2,' ','Estimate','s.d.','t-stat'); - if np - ip = nvx+nvn+ncx+ncn+1; - disp('parameters') - disp(tit1) - for i=1:np - name = bayestopt_.name{ip}; - disp(sprintf('%-*s %8.4f %7.4f %7.4f', ... - header_width,name,xparam1(ip),stdh(ip),tstath(ip))); - eval(['oo_.mle_mode.parameters.' name ' = xparam1(ip);']); - eval(['oo_.mle_std.parameters.' name ' = stdh(ip);']); - ip = ip+1; - end - end - if nvx - ip = 1; - disp('standard deviation of shocks') - disp(tit1) - for i=1:nvx - k = estim_params_.var_exo(i,1); - name = deblank(M_.exo_names(k,:)); - disp(sprintf('%-*s %8.4f %7.4f %7.4f',header_width,name,xparam1(ip),stdh(ip),tstath(ip))); - M_.Sigma_e(k,k) = xparam1(ip)*xparam1(ip); - eval(['oo_.mle_mode.shocks_std.' name ' = xparam1(ip);']); - eval(['oo_.mle_std.shocks_std.' name ' = stdh(ip);']); - ip = ip+1; - end - end - if nvn - disp('standard deviation of measurement errors') - disp(tit1) - ip = nvx+1; - for i=1:nvn - name = deblank(options_.varobs(estim_params_.nvn_observable_correspondence(i,1),:)); - disp(sprintf('%-*s %8.4f %7.4f %7.4f',header_width,name,xparam1(ip),stdh(ip),tstath(ip))) - eval(['oo_.mle_mode.measurement_errors_std.' name ' = xparam1(ip);']); - eval(['oo_.mle_std.measurement_errors_std.' name ' = stdh(ip);']); - ip = ip+1; - end - end - if ncx - disp('correlation of shocks') - disp(tit1) - ip = nvx+nvn+1; - for i=1:ncx - k1 = estim_params_.corrx(i,1); - k2 = estim_params_.corrx(i,2); - name = [deblank(M_.exo_names(k1,:)) ',' deblank(M_.exo_names(k2,:))]; - NAME = [deblank(M_.exo_names(k1,:)) '_' deblank(M_.exo_names(k2,:))]; - disp(sprintf('%-*s %8.4f %7.4f %7.4f', header_width,name,xparam1(ip),stdh(ip),tstath(ip))); - M_.Sigma_e(k1,k2) = xparam1(ip)*sqrt(M_.Sigma_e(k1,k1)*M_.Sigma_e(k2,k2)); - M_.Sigma_e(k2,k1) = M_.Sigma_e(k1,k2); - eval(['oo_.mle_mode.shocks_corr.' NAME ' = xparam1(ip);']); - eval(['oo_.mle_std.shocks_corr.' NAME ' = stdh(ip);']); - ip = ip+1; - end - end - if ncn - disp('correlation of measurement errors') - disp(tit1) - ip = nvx+nvn+ncx+1; - for i=1:ncn - k1 = estim_params_.corrn(i,1); - k2 = estim_params_.corrn(i,2); - name = [deblank(M_.endo_names(k1,:)) ',' deblank(M_.endo_names(k2,:))]; - NAME = [deblank(M_.endo_names(k1,:)) '_' deblank(M_.endo_names(k2,:))]; - disp(sprintf('%-*s %8.4f %7.4f %7.4f',header_width,name,xparam1(ip),stdh(ip),tstath(ip))); - eval(['oo_.mle_mode.measurement_error_corr.' NAME ' = xparam1(ip);']); - eval(['oo_.mle_std.measurement_error_corr.' NAME ' = stdh(ip);']); - ip = ip+1; - end - end + oo_=display_estimation_results_table(xparam1,stdh,M_,options_,estim_params_,bayestopt_,oo_,pnames,'Maximum Likelihood','mle'); end - OutputDirectoryName = CheckPath('Output',M_.dname); -if any(bayestopt_.pshape > 0) && options_.TeX %% Bayesian estimation (posterior mode) Latex output - if np - filename = [OutputDirectoryName '/' M_.fname '_Posterior_Mode_1.TeX']; - fidTeX = fopen(filename,'w'); - fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); - fprintf(fidTeX,'%% RESULTS FROM POSTERIOR MAXIMIZATION (parameters)\n'); - fprintf(fidTeX,['%% ' datestr(now,0)]); - fprintf(fidTeX,' \n'); - fprintf(fidTeX,' \n'); - fprintf(fidTeX,'\\begin{center}\n'); - fprintf(fidTeX,'\\begin{longtable}{l|lcccc} \n'); - fprintf(fidTeX,'\\caption{Results from posterior maximization (parameters)}\n '); - fprintf(fidTeX,'\\label{Table:Posterior:1}\\\\\n'); - fprintf(fidTeX,'\\hline\\hline \\\\ \n'); - fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); - fprintf(fidTeX,'\\hline \\endfirsthead \n'); - fprintf(fidTeX,'\\caption{(continued)}\n '); - fprintf(fidTeX,'\\label{Table:Posterior:1}\\\\\n'); - fprintf(fidTeX,'\\hline\\hline \\\\ \n'); - fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); - fprintf(fidTeX,'\\hline \\endhead \n'); - fprintf(fidTeX,'\\hline \\multicolumn{6}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); - fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); - ip = nvx+nvn+ncx+ncn+1; - for i=1:np - fprintf(fidTeX,'$%s$ & %s & %7.3f & %6.4f & %8.4f & %7.4f \\\\ \n',... - M_.param_names_tex(estim_params_.param_vals(i,1),:),... - deblank(pnames(bayestopt_.pshape(ip)+1,:)),... - bayestopt_.p1(ip),... - bayestopt_.p2(ip),... - xparam1(ip),... - stdh(ip)); - ip = ip + 1; - end - fprintf(fidTeX,'\\end{longtable}\n '); - fprintf(fidTeX,'\\end{center}\n'); - fprintf(fidTeX,'%% End of TeX file.\n'); - fclose(fidTeX); - end - if nvx - TeXfile = [OutputDirectoryName '/' M_.fname '_Posterior_Mode_2.TeX']; - fidTeX = fopen(TeXfile,'w'); - fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); - fprintf(fidTeX,'%% RESULTS FROM POSTERIOR MAXIMIZATION (standard deviation of structural shocks)\n'); - fprintf(fidTeX,['%% ' datestr(now,0)]); - fprintf(fidTeX,' \n'); - fprintf(fidTeX,' \n'); - fprintf(fidTeX,'\\begin{center}\n'); - fprintf(fidTeX,'\\begin{longtable}{l|lcccc} \n'); - fprintf(fidTeX,'\\caption{Results from posterior maximization (standard deviation of structural shocks)}\n '); - fprintf(fidTeX,'\\label{Table:Posterior:2}\\\\\n'); - fprintf(fidTeX,'\\hline\\hline \\\\ \n'); - fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); - fprintf(fidTeX,'\\hline \\endfirsthead \n'); - fprintf(fidTeX,'\\caption{(continued)}\n '); - fprintf(fidTeX,'\\label{Table:Posterior:2}\\\\\n'); - fprintf(fidTeX,'\\hline\\hline \\\\ \n'); - fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); - fprintf(fidTeX,'\\hline \\endhead \n'); - fprintf(fidTeX,'\\hline \\multicolumn{6}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); - fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); - ip = 1; - for i=1:nvx - k = estim_params_.var_exo(i,1); - fprintf(fidTeX,[ '$%s$ & %4s & %7.3f & %6.4f & %8.4f & %7.4f \\\\ \n'],... - deblank(M_.exo_names_tex(k,:)),... - deblank(pnames(bayestopt_.pshape(ip)+1,:)),... - bayestopt_.p1(ip),... - bayestopt_.p2(ip),... - xparam1(ip), ... - stdh(ip)); - ip = ip+1; - end - fprintf(fidTeX,'\\end{longtable}\n '); - fprintf(fidTeX,'\\end{center}\n'); - fprintf(fidTeX,'%% End of TeX file.\n'); - fclose(fidTeX); - end - if nvn - TeXfile = [OutputDirectoryName '/' M_.fname '_Posterior_Mode_3.TeX']; - fidTeX = fopen(TeXfile,'w'); - fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); - fprintf(fidTeX,'%% RESULTS FROM POSTERIOR MAXIMIZATION (standard deviation of measurement errors)\n'); - fprintf(fidTeX,['%% ' datestr(now,0)]); - fprintf(fidTeX,' \n'); - fprintf(fidTeX,' \n'); - fprintf(fidTeX,'\\begin{center}\n'); - fprintf(fidTeX,'\\begin{longtable}{l|lcccc} \n'); - fprintf(fidTeX,'\\caption{Results from posterior maximization (standard deviation of measurement errors)}\n '); - fprintf(fidTeX,'\\label{Table:Posterior:3}\\\\\n'); - fprintf(fidTeX,'\\hline\\hline \\\\ \n'); - fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); - fprintf(fidTeX,'\\hline \\endfirsthead \n'); - fprintf(fidTeX,'\\caption{(continued)}\n '); - fprintf(fidTeX,'\\label{Table:Posterior:3}\\\\\n'); - fprintf(fidTeX,'\\hline\\hline \\\\ \n'); - fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); - fprintf(fidTeX,'\\hline \\endhead \n'); - fprintf(fidTeX,'\\hline \\multicolumn{6}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); - fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); - ip = nvx+1; - for i=1:nvn - idx = strmatch(options_.varobs(estim_params_.nvn_observable_correspondence(i,1),:),M_.endo_names); - fprintf(fidTeX,'$%s$ & %4s & %7.3f & %6.4f & %8.4f & %7.4f \\\\ \n',... - deblank(M_.endo_names_tex(idx,:)), ... - deblank(pnames(bayestopt_.pshape(ip)+1,:)), ... - bayestopt_.p1(ip), ... - bayestopt_.p2(ip),... - xparam1(ip),... - stdh(ip)); - ip = ip+1; - end - fprintf(fidTeX,'\\end{longtable}\n '); - fprintf(fidTeX,'\\end{center}\n'); - fprintf(fidTeX,'%% End of TeX file.\n'); - fclose(fidTeX); - end - if ncx - TeXfile = [OutputDirectoryName '/' M_.fname '_Posterior_Mode_4.TeX']; - fidTeX = fopen(TeXfile,'w'); - fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); - fprintf(fidTeX,'%% RESULTS FROM POSTERIOR MAXIMIZATION (correlation of structural shocks)\n'); - fprintf(fidTeX,['%% ' datestr(now,0)]); - fprintf(fidTeX,' \n'); - fprintf(fidTeX,' \n'); - fprintf(fidTeX,'\\begin{center}\n'); - fprintf(fidTeX,'\\begin{longtable}{l|lcccc} \n'); - fprintf(fidTeX,'\\caption{Results from posterior parameters (correlation of structural shocks)}\n '); - fprintf(fidTeX,'\\label{Table:Posterior:4}\\\\\n'); - fprintf(fidTeX,'\\hline\\hline \\\\ \n'); - fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); - fprintf(fidTeX,'\\hline \\endfirsthead \n'); - fprintf(fidTeX,'\\caption{(continued)}\n '); - fprintf(fidTeX,'\\label{Table:Posterior:4}\\\\\n'); - fprintf(fidTeX,'\\hline\\hline \\\\ \n'); - fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); - fprintf(fidTeX,'\\hline \\endhead \n'); - fprintf(fidTeX,'\\hline \\multicolumn{6}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); - fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); - ip = nvx+nvn+1; - for i=1:ncx - k1 = estim_params_.corrx(i,1); - k2 = estim_params_.corrx(i,2); - fprintf(fidTeX,[ '$%s$ & %s & %7.3f & %6.4f & %8.4f & %7.4f \\\\ \n'],... - [deblank(M_.exo_names_tex(k1,:)) ',' deblank(M_.exo_names_tex(k2,:))], ... - deblank(pnames(bayestopt_.pshape(ip)+1,:)), ... - bayestopt_.p1(ip), ... - bayestopt_.p2(ip), ... - xparam1(ip), ... - stdh(ip)); - ip = ip+1; - end - fprintf(fidTeX,'\\end{longtable}\n '); - fprintf(fidTeX,'\\end{center}\n'); - fprintf(fidTeX,'%% End of TeX file.\n'); - fclose(fidTeX); - end - if ncn - TeXfile = [OutputDirectoryName '/' M_.fname '_Posterior_Mode_5.TeX']; - fidTeX = fopen(TeXfile,'w'); - fprintf(fidTeX,'%% TeX-table generated by dynare_estimation (Dynare).\n'); - fprintf(fidTeX,'%% RESULTS FROM POSTERIOR MAXIMIZATION (correlation of measurement errors)\n'); - fprintf(fidTeX,['%% ' datestr(now,0)]); - fprintf(fidTeX,' \n'); - fprintf(fidTeX,' \n'); - fprintf(fidTeX,'\\begin{center}\n'); - fprintf(fidTeX,'\\begin{longtabe}{l|lcccc} \n'); - fprintf(fidTeX,'\\caption{Results from posterior parameters (correlation of measurement errors)}\n '); - fprintf(fidTeX,'\\label{Table:Posterior:5}\\\\\n'); - fprintf(fidTeX,'\\hline\\hline \\\\ \n'); - fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); - fprintf(fidTeX,'\\hline \\endfirsthead \n'); - fprintf(fidTeX,'\\caption{(continued)}\n '); - fprintf(fidTeX,'\\label{Table:Posterior:5}\\\\\n'); - fprintf(fidTeX,'\\hline\\hline \\\\ \n'); - fprintf(fidTeX,' & Prior distribution & Prior mean & Prior s.d. & Posterior mode & s.d. \\\\ \n'); - fprintf(fidTeX,'\\hline \\endhead \n'); - fprintf(fidTeX,'\\hline \\multicolumn{6}{r}{(Continued on next page)} \\\\ \\hline \\endfoot \n'); - fprintf(fidTeX,'\\hline \\hline \\endlastfoot \n'); - ip = nvx+nvn+ncx+1; - for i=1:ncn - k1 = estim_params_.corrn(i,1); - k2 = estim_params_.corrn(i,2); - fprintf(fidTeX,'$%s$ & %s & %7.3f & %6.4f & %8.4f & %7.4f \\\\ \n',... - [deblank(M_.endo_names_tex(k1,:)) ',' deblank(M_.endo_names_tex(k2,:))], ... - pnames(bayestopt_.pshape(ip)+1,:), ... - bayestopt_.p1(ip), ... - bayestopt_.p2(ip), ... - xparam1(ip), ... - stdh(ip)); - ip = ip+1; - end - fprintf(fidTeX,'\\end{longtable}\n '); - fprintf(fidTeX,'\\end{center}\n'); - fprintf(fidTeX,'%% End of TeX file.\n'); - fclose(fidTeX); - end -end - if np > 0 pindx = estim_params_.param_vals(:,1); save([M_.fname '_params.mat'],'pindx'); @@ -927,9 +555,12 @@ if (any(bayestopt_.pshape >0 ) && options_.mh_replic) || ... bayestopt_.lb = bounds(:,1); bayestopt_.ub = bounds(:,2); if any(xparam1 < bounds(:,1)) || any(xparam1 > bounds(:,2)) - find(xparam1 < bounds(:,1)) - find(xparam1 > bounds(:,2)) - error('Mode values are outside prior bounds. Reduce prior_trunc.') + outside_bound_vars=bayestopt_.name([find(xparam1 < bounds(:,1)); find(xparam1 > bounds(:,2))],:); + disp_string=[outside_bound_vars{1,:}]; + for ii=2:size(outside_bound_vars,1) + disp_string=[disp_string,', ',outside_bound_vars{ii,:}]; + end + error(['Mode value(s) of ', disp_string ,' are outside parameter bounds. Potentially, you should set prior_trunc=0.']) end % runs MCMC if options_.mh_replic diff --git a/matlab/gsa/redform_map.m b/matlab/gsa/redform_map.m index 17fd0eda4..d85607066 100644 --- a/matlab/gsa/redform_map.m +++ b/matlab/gsa/redform_map.m @@ -163,9 +163,9 @@ for j=1:size(anamendo,1) disp([M_.param_names(estim_params_.param_vals(indsmirnov(jp),1),:),' d-stat = ', num2str(dproba(indsmirnov(jp)),'%1.3f'),' p-value = ', num2str(proba(indsmirnov(jp)),'%1.3f')]) end disp(' '); - stab_map_1(x0, iy, iyc, 'threshold',pvalue_ks,indsmirnov,xdir,[],['Reduced Form Mapping (Threshold) for ', namendo,' vs. lagged ', namlagendo]); - stab_map_2(x0(iy,:),alpha2,pvalue_corr,'inside_threshold',xdir,[],['Reduced Form Mapping (Inside Threshold)for ', namendo,' vs. lagged ', namlagendo]) - stab_map_2(x0(iyc,:),alpha2,pvalue_corr,'outside_threshold',xdir,[],['Reduced Form Mapping (Outside Threshold) for ', namendo,' vs. lagged ', namlagendo]) + stab_map_1(x0, iy, iyc, 'threshold',pvalue_ks,indsmirnov,xdir,[],['Reduced Form Mapping (Threshold) for ', namendo,' vs. lagged ', namexo]); + stab_map_2(x0(iy,:),alpha2,pvalue_corr,'inside_threshold',xdir,[],['Reduced Form Mapping (Inside Threshold)for ', namendo,' vs. lagged ', namexo]) + stab_map_2(x0(iyc,:),alpha2,pvalue_corr,'outside_threshold',xdir,[],['Reduced Form Mapping (Outside Threshold) for ', namendo,' vs. lagged ', namexo]) lpmat=x0(iy,:); if nshocks, lpmat0=xx0(iy,:); diff --git a/matlab/k_order_pert.m b/matlab/k_order_pert.m index 57d25bf50..7a02d8acd 100644 --- a/matlab/k_order_pert.m +++ b/matlab/k_order_pert.m @@ -39,20 +39,6 @@ switch(order) return; end dr.g_1 = g_1; - - dr.ghx = dr.g_1(:,1:nspred); - dr.ghu = dr.g_1(:,nspred+1:end); - - if options.loglinear == 1 - k = find(dr.kstate(:,2) <= M.maximum_endo_lag+1); - klag = dr.kstate(k,[1 2]); - k1 = dr.order_var; - - dr.ghx = repmat(1./dr.ys(k1),1,size(dr.ghx,2)).*dr.ghx.* ... - repmat(dr.ys(k1(klag(:,1)))',size(dr.ghx,1),1); - dr.ghu = repmat(1./dr.ys(k1),1,size(dr.ghu,2)).*dr.ghu; - end - case 2 [err, g_0, g_1, g_2] = k_order_perturbation(dr,M,options); if err @@ -62,61 +48,14 @@ switch(order) dr.g_0 = g_0; dr.g_1 = g_1; dr.g_2 = g_2; - - dr.ghx = dr.g_1(:,1:nspred); - dr.ghu = dr.g_1(:,nspred+1:end); - - dr.ghs2 = 2*g_0; - s0 = 0; - s1 = 0; - ghxx=zeros(endo_nbr, nspred^2); - ghxu=zeros(endo_nbr, nspred*exo_nbr); - ghuu=zeros(endo_nbr, exo_nbr^2); - for i=1:size(g_2,2) - if s0 < nspred && s1 < nspred - ghxx(:,s0*nspred+s1+1) = 2*g_2(:,i); - if s1 > s0 - ghxx(:,s1*nspred+s0+1) = 2*g_2(:,i); - end - elseif s0 < nspred && s1 < nspred+exo_nbr - ghxu(:,(s0*exo_nbr+s1-nspred+1)) = 2*g_2(:,i); - elseif s0 < nspred+exo_nbr && s1 < nspred+exo_nbr - ghuu(:,(s0-nspred)*exo_nbr+s1-nspred +1) = 2*g_2(:,i); - if s1 > s0 - ghuu(:,(s1-nspred)*exo_nbr+s0-nspred+1) = 2*g_2(:,i); - end - else - error('dr1:k_order_perturbation:g_2','Unaccounted columns in g_2'); - end - s1 = s1+1; - if s1 == nspred+exo_nbr - s0 = s0+1; - s1 = s0; - end - end % for loop - dr.ghxx = ghxx; - dr.ghxu = ghxu; - dr.ghuu = ghuu; case 3 - if options.pruning + if options.pruning [err, g_0, g_1, g_2, g_3, derivs] = k_order_perturbation(dr, ... M,options); if err info(1)=9; return; end - dr.ghx = derivs.gy; - dr.ghu = derivs.gu; - dr.ghxx = unfold2(derivs.gyy,nspred); - dr.ghxu = derivs.gyu; - dr.ghuu = unfold2(derivs.guu,exo_nbr); - dr.ghs2 = derivs.gss; - dr.ghxxx = unfold3(derivs.gyyy,nspred); - dr.ghxxu = unfold21(derivs.gyyu,nspred,exo_nbr); - dr.ghxuu = unfold12(derivs.gyuu,nspred,exo_nbr); - dr.ghuuu = unfold3(derivs.guuu,exo_nbr); - dr.ghxss = derivs.gyss; - dr.ghuss = derivs.guss; else [err, g_0, g_1, g_2, g_3] = k_order_perturbation(dr, ... M,options); @@ -133,7 +72,71 @@ switch(order) error('order > 3 isn''t implemented') end +% Now fill in dr.ghx, dr.ghu... +if options.pruning && order == 3 + dr.ghx = derivs.gy; + dr.ghu = derivs.gu; + dr.ghxx = unfold2(derivs.gyy,nspred); + dr.ghxu = derivs.gyu; + dr.ghuu = unfold2(derivs.guu,exo_nbr); + dr.ghs2 = derivs.gss; + dr.ghxxx = unfold3(derivs.gyyy,nspred); + dr.ghxxu = unfold21(derivs.gyyu,nspred,exo_nbr); + dr.ghxuu = unfold12(derivs.gyuu,nspred,exo_nbr); + dr.ghuuu = unfold3(derivs.guuu,exo_nbr); + dr.ghxss = derivs.gyss; + dr.ghuss = derivs.guss; +else + nspred = M.nspred; + + dr.ghx = dr.g_1(:,1:nspred); + dr.ghu = dr.g_1(:,nspred+1:end); + + if options.loglinear == 1 + k = find(dr.kstate(:,2) <= M.maximum_endo_lag+1); + klag = dr.kstate(k,[1 2]); + k1 = dr.order_var; + + dr.ghx = repmat(1./dr.ys(k1),1,size(dr.ghx,2)).*dr.ghx.* ... + repmat(dr.ys(k1(klag(:,1)))',size(dr.ghx,1),1); + dr.ghu = repmat(1./dr.ys(k1),1,size(dr.ghu,2)).*dr.ghu; + end + + if order > 1 + dr.ghs2 = 2*g_0; + s0 = 0; + s1 = 0; + ghxx=zeros(endo_nbr, nspred^2); + ghxu=zeros(endo_nbr, nspred*exo_nbr); + ghuu=zeros(endo_nbr, exo_nbr^2); + for i=1:size(g_2,2) + if s0 < nspred && s1 < nspred + ghxx(:,s0*nspred+s1+1) = 2*g_2(:,i); + if s1 > s0 + ghxx(:,s1*nspred+s0+1) = 2*g_2(:,i); + end + elseif s0 < nspred && s1 < nspred+exo_nbr + ghxu(:,(s0*exo_nbr+s1-nspred+1)) = 2*g_2(:,i); + elseif s0 < nspred+exo_nbr && s1 < nspred+exo_nbr + ghuu(:,(s0-nspred)*exo_nbr+s1-nspred +1) = 2*g_2(:,i); + if s1 > s0 + ghuu(:,(s1-nspred)*exo_nbr+s0-nspred+1) = 2*g_2(:,i); + end + else + error('dr1:k_order_perturbation:g_2','Unaccounted columns in g_2'); + end + s1 = s1+1; + if s1 == nspred+exo_nbr + s0 = s0+1; + s1 = s0; + end + end % for loop + dr.ghxx = ghxx; + dr.ghxu = ghxu; + dr.ghuu = ghuu; + end +end function y = unfold2(x,n) y=zeros(size(x,1),n*n); diff --git a/matlab/load_csv_file_data.m b/matlab/load_csv_file_data.m index 180a41838..8a62ba613 100644 --- a/matlab/load_csv_file_data.m +++ b/matlab/load_csv_file_data.m @@ -90,7 +90,7 @@ init = dynDate(1); varlist = []; if ~exist('OCTAVE_VERSION') % Under Matlab, save time by using importdata - assert(exist(file, 'file'), 'load_csv_file_data: I can''t find file ' file '!'); + assert(exist(file, 'file') == 2, ['load_csv_file_data: I can''t find file ' file '!']); A = importdata(file, ',', withnames); if withnames && withtime if size(A.textdata, 1) == 1 diff --git a/matlab/load_m_file_data.m b/matlab/load_m_file_data.m index e461e8c45..30a5d4434 100644 --- a/matlab/load_m_file_data.m +++ b/matlab/load_m_file_data.m @@ -93,7 +93,11 @@ varlist = {}; if isempty(varlist0) for i=1:length(list_of_variables) - if isequal(list_of_variables(i).name,'freq') || isequal(list_of_variables(i).name,'time') || isequal(list_of_variables(i).name,'data') || isequal(list_of_variables(i).name,'varlist') + if isequal(list_of_variables(i).name,'freq') || isequal(list_of_variables(i).name,'time') || isequal(list_of_variables(i).name,'data') ... + || isequal(list_of_variables(i).name,'varlist') ... + || isequal(list_of_variables(i).name,'varlist0') ... + || isequal(list_of_variables(i).name,'list_of_variables') ... + || isequal(list_of_variables(i).name,'tex') ... continue end if list_of_variables(i).global || list_of_variables(i).persistent diff --git a/matlab/reports/@elements/display.m b/matlab/reports/@elements/display.m index 9f6348c21..1c13a194f 100644 --- a/matlab/reports/@elements/display.m +++ b/matlab/reports/@elements/display.m @@ -3,7 +3,7 @@ function display(o) % Display a Elements object % % INPUTS -% none +% o [elements] elements object % % OUTPUTS % none @@ -28,9 +28,5 @@ function display(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -name = 'report.page.section.elements'; -disp(' '); -disp([name ' = ']); -disp(' '); -disp(getElements(o)); +reporting_object_display(o); end \ No newline at end of file diff --git a/matlab/reports/@elements/numElements.m b/matlab/reports/@elements/numElements.m index c31842037..73355b0d3 100644 --- a/matlab/reports/@elements/numElements.m +++ b/matlab/reports/@elements/numElements.m @@ -18,5 +18,5 @@ function n = numElements(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -n = o.objArray.numObjs(); +n = o.objArray.numObjArray(); end \ No newline at end of file diff --git a/matlab/reports/@graph/createGraph.m b/matlab/reports/@graph/createGraph.m index d81ab1257..6979f67f1 100644 --- a/matlab/reports/@graph/createGraph.m +++ b/matlab/reports/@graph/createGraph.m @@ -33,7 +33,7 @@ if ~isempty(o.figname) o.figname); end -if ~o.seriesElements.numElements() +if ~o.seriesElements.numSeriesElements() warning('@graph.crepateGraph: no series to plot, returning'); return; end @@ -41,7 +41,7 @@ end h = figure('visible','off'); hold on; box on; -if o.grid +if o.showGrid grid on; set(gca, 'GridLineStyle', '--'); end @@ -52,7 +52,7 @@ else dd = o.xrange; end -ne = o.seriesElements.numElements(); +ne = o.seriesElements.numSeriesElements(); line_handles = zeros(ne, 1); for i=1:ne line_handles(i) = o.seriesElements(i).getLine(dd); @@ -66,7 +66,7 @@ if ~isempty(o.yrange) ylim(o.yrange); end -if o.zeroline +if o.showZeroline a = ylim; if 0 > a(1) && 0 < a(2) lh = line(xlim, [0 0], 'color', 'k', 'LineWidth', 0.25); @@ -87,24 +87,32 @@ if ~isempty(o.shade) % From ShadePlotForEmpahsis (Matlab Exchange) % use patch bc area doesn't work with matlab2tikz sh = patch([repmat(x1, 1, 2) repmat(x2, 1, 2)], ... - [yrange fliplr(yrange)], o.shade_color, ... - 'facealpha', o.shade_opacity); - children =get(gca(), 'children'); + [yrange fliplr(yrange)], o.shadeColor, ... + 'facealpha', o.shadeOpacity); + children = get(gca, 'children'); children = [children(2:end); sh]; - set(gca(), 'children', children); + set(gca, 'children', children); end xticks = get(gca, 'XTick'); -[junk, ix, junk] = intersect(x, xticks); -set(gca, 'XTickLabel', xlabels(ix)); +xTickLabels = cell(1, length(xticks)); +for i=1:length(xticks) + if xticks(i) >= x(1) && ... + xticks(i) <= x(end) + xTickLabels{i} = xlabels{xticks(i)}; + else + xTickLabels{i} = ''; + end +end +set(gca, 'XTickLabel', xTickLabels); -if o.legend +if o.showLegend lh = legend(line_handles, o.seriesElements.getTexNames(), ... - 'orientation', o.legend_orientation, ... - 'location', o.legend_location); - set(lh, 'FontSize', o.legend_font_size); + 'orientation', o.legendOrientation, ... + 'location', o.legendLocation); + set(lh, 'FontSize', o.legendFontSize); set(lh, 'interpreter', 'latex'); - if o.legend_boxoff + if ~o.showLegendBox legend('boxoff'); end end @@ -118,12 +126,18 @@ if ~isempty(o.ylabel) end drawnow; -o.figname = [tempname '.tex']; +if isempty(o.figname) + o.figname = [tempname '.tex']; +end disp(' converting to tex....'); -matlab2tikz('filename', o.figname, ... - 'showInfo', false, ... - 'showWarnings', false, ... - 'checkForUpdates', false); +if exist('OCTAVE_VERSION') && isempty(regexpi(computer, '.*apple.*', 'once')) + print(o.figname, '-dtikz'); +else + matlab2tikz('filename', o.figname, ... + 'showInfo', false, ... + 'showWarnings', false, ... + 'checkForUpdates', false); +end grid off; box off; diff --git a/matlab/reports/@graph/display.m b/matlab/reports/@graph/display.m index b05877a95..9ddf4a08a 100644 --- a/matlab/reports/@graph/display.m +++ b/matlab/reports/@graph/display.m @@ -28,49 +28,5 @@ function display(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -name = 'report.page.section.graph'; -disp(' '); -disp([name '.title = ']); -disp(' '); -disp([' ''' o.title '''']); - -disp(' '); -disp([name '.xlabel = ']); -disp(' '); -disp([' ''' o.xlabel '''']); - -disp(' '); -disp([name '.ylabel = ']); -disp(' '); -disp([' ''' o.ylabel '''']); - -disp(' '); -disp([name '.footnote = ']); -disp(' '); -disp([' ''' o.footnote '''']); - -disp(' '); -disp([name '.figname = ']); -disp(' '); -disp([' ''' o.figname '''']); - -disp(' '); -disp([name '.config = ']); -disp(' '); -disp([' ''' o.config '''']); - -disp(' '); -disp([name '.legend = ']); -disp(' '); -disp(o.legend); - -disp(' '); -disp([name '.shade = ']); -disp(' '); -disp(o.shade); - -disp(' '); -disp([name '.seriesElements = ']); -disp(' '); -o.seriesElements.getSeriesElements() +reporting_object_display(o); end \ No newline at end of file diff --git a/matlab/reports/@graph/end.m b/matlab/reports/@graph/end.m index 52f11f364..a766b97c4 100644 --- a/matlab/reports/@graph/end.m +++ b/matlab/reports/@graph/end.m @@ -31,5 +31,5 @@ function lastIndex = end(o, k, n) % along with Dynare. If not, see . assert(k==1 && n==1, '@graph/end: graph only has one dimension'); -lastIndex = o.seriesElements.numElements(); +lastIndex = o.seriesElements.numSeriesElements(); end \ No newline at end of file diff --git a/matlab/reports/@graph/graph.m b/matlab/reports/@graph/graph.m index 8b89dcca6..a92003b12 100644 --- a/matlab/reports/@graph/graph.m +++ b/matlab/reports/@graph/graph.m @@ -33,34 +33,31 @@ function o = graph(varargin) o = struct; -o.config = ''; - o.seriesElements = seriesElements(); o.title = ''; o.ylabel = ''; o.xlabel = ''; -o.footnote = ''; o.figname = ''; o.data = ''; -o.seriestouse = ''; +o.seriesToUse = ''; o.xrange = ''; o.yrange = ''; o.shade = ''; -o.shade_color = [0 1 0]; -o.shade_opacity = .2; +o.shadeColor = 'green'; +o.shadeOpacity = .2; -o.grid = true; +o.showGrid = true; -o.legend = false; -o.legend_boxoff = false; -o.legend_location = 'SouthEast'; -o.legend_orientation = 'horizontal'; -o.legend_font_size = 8; +o.showLegend = false; +o.showLegendBox = false; +o.legendLocation = 'SouthEast'; +o.legendOrientation = 'horizontal'; +o.legendFontSize = 8; -o.zeroline = false; +o.showZeroline = false; if nargin == 1 assert(isa(varargin{1}, 'graph'),['@graph.graph: with one arg you ' ... @@ -73,34 +70,34 @@ elseif nargin > 1 'pairs.']); end - optNames = lower(fieldnames(o)); + optNames = fieldnames(o); % overwrite default values for pair = reshape(varargin, 2, []) - field = lower(pair{1}); - if any(strmatch(field, optNames, 'exact')) - o.(field) = pair{2}; + ind = strmatch(lower(pair{1}), lower(optNames), 'exact'); + assert(isempty(ind) || length(ind) == 1); + if ~isempty(ind) + o.(optNames{ind}) = pair{2}; else - error('@graph.graph: %s is not a recognized option.', field); + error('@graph.graph: %s is not a recognized option.', pair{1}); end end end % Check options provided by user assert(ischar(o.title), '@graph.graph: title must be a string'); -assert(ischar(o.footnote), '@graph.graph: footnote must be a string'); -assert(ischar(o.config), '@graph.graph: config file must be a string'); assert(ischar(o.xlabel), '@graph.graph: xlabel file must be a string'); assert(ischar(o.ylabel), '@graph.graph: ylabel file must be a string'); assert(ischar(o.figname), '@graph.graph: figname must be a string'); -assert(islogical(o.grid), '@graph.graph: grid must be either true or false'); -assert(islogical(o.legend), '@graph.graph: legend must be either true or false'); -assert(islogical(o.legend_boxoff), '@graph.graph: legend_boxoff must be either true or false'); -assert(isint(o.legend_font_size), '@graph.graph: legend_font_size must be an integer'); -assert(islogical(o.zeroline), '@graph.graph: zeroline must be either true or false'); -assert(isfloat(o.shade_opacity) && length(o.shade_opacity)==1 && ... - o.shade_opacity >= 0 && o.shade_opacity <= 1, ... - '@graph.graph: o.shade_opacity must be a real in [0 1]'); +assert(islogical(o.showGrid), '@graph.graph: showGrid must be either true or false'); +assert(islogical(o.showLegend), '@graph.graph: showLegend must be either true or false'); +assert(islogical(o.showLegendBox), '@graph.graph: showLegendBox must be either true or false'); +assert(isint(o.legendFontSize), '@graph.graph: legendFontSize must be an integer'); +assert(islogical(o.showZeroline), '@graph.graph: showZeroline must be either true or false'); +assert(ischar(o.shadeColor), '@graph.graph: shadeColor must be a string'); +assert(isfloat(o.shadeOpacity) && length(o.shadeOpacity)==1 && ... + o.shadeOpacity >= 0 && o.shadeOpacity <= 1, ... + '@graph.graph: o.shadeOpacity must be a real in [0 1]'); valid_legend_locations = ... {'North', 'South', 'East', 'West', ... 'NorthEast', 'SouthEast', 'NorthWest', 'SouthWest', ... @@ -108,12 +105,12 @@ valid_legend_locations = ... 'NorthEastOutside', 'SouthEastOutside', 'NorthWestOutside', 'SouthWestOutside', ... 'Best', 'BestOutside', ... }; -assert(any(strcmp(o.legend_location, valid_legend_locations)), ... - ['@graph.graph: legend_location must be one of ' strjoin(valid_legend_locations, ' ')]); +assert(any(strcmp(o.legendLocation, valid_legend_locations)), ... + ['@graph.graph: legendLocation must be one of ' strjoin(valid_legend_locations, ' ')]); valid_legend_orientations = {'vertical', 'horizontal'}; -assert(any(strcmp(o.legend_orientation, valid_legend_orientations)), ... - ['@graph.graph: legend_orientation must be one of ' strjoin(valid_legend_orientations, ' ')]); +assert(any(strcmp(o.legendOrientation, valid_legend_orientations)), ... + ['@graph.graph: legendOrientation must be one of ' strjoin(valid_legend_orientations, ' ')]); assert(isempty(o.shade) || (isa(o.shade, 'dynDates') && o.shade.ndat >= 2), ... ['@graph.graph: shade is specified as a dynDates range, e.g. ' ... @@ -127,22 +124,22 @@ assert(isempty(o.yrange) || (isfloat(o.yrange) && length(o.yrange) == 2 && ... 'the lower bound and upper bound.']); assert(isempty(o.data) || isa(o.data, 'dynSeries'), ['@graph.graph: data must ' ... 'be a dynSeries']); -assert(isempty(o.seriestouse) || iscellstr(o.seriestouse), ['@graph.graph: ' ... +assert(isempty(o.seriesToUse) || iscellstr(o.seriesToUse), ['@graph.graph: ' ... 'series to use must be a cell array of string(s)']); -% using o.seriestouse, create series objects and put them in o.seriesElements +% using o.seriesToUse, create series objects and put them in o.seriesElements if ~isempty(o.data) - if isempty(o.seriestouse) + if isempty(o.seriesToUse) for i=1:o.data.vobs o.seriesElements = o.seriesElements.addSeries('data', o.data{o.data.name{i}}); end else - for i=1:length(o.seriestouse) - o.seriesElements = o.seriesElements.addSeries('data', o.data{o.seriestouse{i}}); + for i=1:length(o.seriesToUse) + o.seriesElements = o.seriesElements.addSeries('data', o.data{o.seriesToUse{i}}); end end end -o = rmfield(o, 'seriestouse'); +o = rmfield(o, 'seriesToUse'); o = rmfield(o, 'data'); % Create graph object diff --git a/matlab/reports/@objArray/display.m b/matlab/reports/@objArray/display.m index e1665a1df..181ba5721 100644 --- a/matlab/reports/@objArray/display.m +++ b/matlab/reports/@objArray/display.m @@ -3,7 +3,7 @@ function display(oa) % Display an objArray object % % INPUTS -% none +% o [objArray] objArray object % % OUTPUTS % none @@ -28,8 +28,5 @@ function display(oa) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -disp(' '); -disp([inputname(1) '.objs = ']); -disp(' '); -disp(oa.objs); +reporting_object_display(o); end \ No newline at end of file diff --git a/matlab/reports/@objArray/numObjs.m b/matlab/reports/@objArray/numObjArray.m similarity index 89% rename from matlab/reports/@objArray/numObjs.m rename to matlab/reports/@objArray/numObjArray.m index 513f15b47..2c5cd029a 100644 --- a/matlab/reports/@objArray/numObjs.m +++ b/matlab/reports/@objArray/numObjArray.m @@ -1,5 +1,5 @@ -function no = numObjs(oa) -%function no = numObjs(oa) +function n = numObjArray(o) +%function n = numObjArray(o) % Copyright (C) 2013 Dynare Team % @@ -18,5 +18,5 @@ function no = numObjs(oa) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -no = size(oa.objs, 2); +n = size(o.objs, 2); end \ No newline at end of file diff --git a/matlab/reports/@page/display.m b/matlab/reports/@page/display.m index b7ae6c66c..ebdcc9e0c 100644 --- a/matlab/reports/@page/display.m +++ b/matlab/reports/@page/display.m @@ -3,7 +3,7 @@ function display(o) % Display a Page object % % INPUTS -% none +% o [page] page object % % OUTPUTS % none @@ -28,9 +28,5 @@ function display(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -name = 'report.page'; -disp(' '); -disp([name '.sections = ']); -disp(' '); -disp(o.sections()); +reporting_object_display(o); end \ No newline at end of file diff --git a/matlab/reports/@page/page.m b/matlab/reports/@page/page.m index a0469e0cc..b36adb1c5 100644 --- a/matlab/reports/@page/page.m +++ b/matlab/reports/@page/page.m @@ -32,7 +32,7 @@ function o = page(varargin) o = struct; o.paper = ''; o.title = {}; -o.title_format = {}; +o.titleFormat = {}; o.orientation = ''; o.footnote = {}; o.sections = sections(); @@ -48,15 +48,16 @@ elseif nargin > 1 'pairs.']); end - optNames = lower(fieldnames(o)); + optNames = fieldnames(o); % overwrite default values for pair = reshape(varargin, 2, []) - field = lower(pair{1}); - if any(strmatch(field, optNames, 'exact')) - o.(field) = pair{2}; + ind = strmatch(lower(pair{1}), lower(optNames), 'exact'); + assert(isempty(ind) || length(ind) == 1); + if ~isempty(ind) + o.(optNames{ind}) = pair{2}; else - error('@page.page: %s is not a recognized option.', field); + error('@page.page: %s is not a recognized option.', pair{1}); end end end @@ -65,15 +66,15 @@ end if ischar(o.title) o.title = {o.title}; end -if ischar(o.title_format) - o.title_format = {o.title_format}; +if ischar(o.titleFormat) + o.titleFormat = {o.titleFormat}; end assert(iscellstr(o.title), ... '@page.page: title must be a cell array of strings'); -assert(iscellstr(o.title_format), ... - '@page.page: title_format must be a cell array of strings'); -assert(length(o.title)==length(o.title_format), ... - '@page.page: title and title_format must be of the same length'); +assert(iscellstr(o.titleFormat), ... + '@page.page: titleFormat must be a cell array of strings'); +assert(length(o.title)==length(o.titleFormat), ... + '@page.page: title and titleFormat must be of the same length'); valid_paper = {'a4', 'letter'}; assert(any(strcmp(o.paper, valid_paper)), ... diff --git a/matlab/reports/@page/write.m b/matlab/reports/@page/write.m index 5520f307d..09a7f6218 100644 --- a/matlab/reports/@page/write.m +++ b/matlab/reports/@page/write.m @@ -43,7 +43,7 @@ fprintf(fid,'\n'); fprintf(fid, '\\begin{tabular}[t]{c}\n'); for i=1:length(o.title) - fprintf(fid,'\\multicolumn{1}{c}{%s %s}\\\\\n', o.title_format{i}, o.title{i}); + fprintf(fid,'\\multicolumn{1}{c}{%s %s}\\\\\n', o.titleFormat{i}, o.title{i}); end o.sections.write(fid); diff --git a/matlab/reports/@pages/display.m b/matlab/reports/@pages/display.m index a76ab637f..728fd7c3e 100644 --- a/matlab/reports/@pages/display.m +++ b/matlab/reports/@pages/display.m @@ -3,7 +3,7 @@ function display(o) % Display a Pages object % % INPUTS -% ps [pages] pages object +% o [pages] pages object % % OUTPUTS % none @@ -28,9 +28,5 @@ function display(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -name = 'report.pages'; -disp(' '); -disp([name ' = ']); -disp(' '); -disp(getPages(o)); +reporting_object_display(o); end \ No newline at end of file diff --git a/matlab/reports/@pages/numPages.m b/matlab/reports/@pages/numPages.m index 303ac223e..289196a0e 100644 --- a/matlab/reports/@pages/numPages.m +++ b/matlab/reports/@pages/numPages.m @@ -1,6 +1,5 @@ function n = numPages(o) % function n = numPages(o) -% Sections Class Constructor % % INPUTS % o [page] pages object @@ -28,5 +27,5 @@ function n = numPages(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -n = o.objArray.numObjs(); +n = o.objArray.numObjArray(); end \ No newline at end of file diff --git a/matlab/reports/@report/compile.m b/matlab/reports/@report/compile.m index 9a7170e5d..421a8fedd 100644 --- a/matlab/reports/@report/compile.m +++ b/matlab/reports/@report/compile.m @@ -1,9 +1,11 @@ -function o = compile(o) +function o = compile(o, varargin) %function o = compile(o) % Compile Report Object % % INPUTS -% o [report] report object +% o [report] report object +% varargin [char] allows user to change report compiler for a +% given run of compile. % % OUTPUTS % o [report] report object @@ -28,20 +30,32 @@ function o = compile(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . +assert(length(varargin) == 0 || length(varargin) == 2, ... + '@report.compile: calling form: compiler, ''/path/to/compiler''.'); +if length(varargin) == 2 + assert(ischar(varargin{1}) && strcmp(lower(varargin{1}), 'compiler'), ... + '@report.compile: ''compiler'' is the only option.'); + assert(ischar(varargin{2}), ... + '@report.compile: the argument to ''compiler'' must be a char'); + compiler = varargin{2}; +else + compiler = o.compiler; +end + if ~exist(o.filename, 'file') o.write(); end -compiler = o.compiler; if isempty(compiler) - if strcmp(computer, 'MACI') || strcmp(computer, 'MACI64') - % Add most likely places for pdflatex to - % exist outside of default $PATH + if strncmp(computer, 'MACI', 4) || ~isempty(regexpi(computer, '.*apple.*', 'once')) + % Add most likely places for pdflatex to exist outside of default $PATH [status, compiler] = ... system(['PATH=$PATH:/usr/texbin:/usr/local/bin:/usr/local/sbin;' ... 'which pdflatex'], '-echo'); elseif strcmp(computer, 'PCWIN') || strcmp(computer, 'PCWIN64') - % need to fill in for Windows + error(['@report.compile: On Windows machines, you must explicitly ' ... + 'provide the ''compiler'' option or set the compiler ' ... + 'variable in the Report class']); else % gnu/linux [status, compiler] = system('which pdflatex', '-echo'); end @@ -50,7 +64,12 @@ if isempty(compiler) compiler = strtrim(compiler); o.compiler = compiler; end -[status output] = system([compiler ' ./' o.filename], '-echo'); + +if exist('OCTAVE_VERSION') + status = system([compiler ' ./' o.filename], 0); +else + status = system([compiler ' ./' o.filename], '-echo'); +end [junk, rfn, junk] = fileparts(o.filename); if status ~= 0 diff --git a/matlab/reports/@report/display.m b/matlab/reports/@report/display.m index 60c3f11f4..92fe85a24 100644 --- a/matlab/reports/@report/display.m +++ b/matlab/reports/@report/display.m @@ -28,39 +28,5 @@ function display(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -name = 'report'; -disp(' '); -disp([name '.title = ']); -disp(' '); -disp([' ''' o.title '''']); - -disp(' ') -disp([name '.paper = ']); -disp(' '); -disp([' ''' o.paper '''']); - -disp(' ') -disp([name '.orientation = ']); -disp(' '); -disp([' ''' o.orientation '''']); - -disp(' ') -disp([name '.filename = ']); -disp(' '); -disp([' ''' o.filename '''']); - -disp(' ') -disp([name '.config = ']); -disp(' '); -disp([' ''' o.config '''']); - -disp(' ') -disp([name '.numPages() = ']); -disp(' '); -disp([' ' num2str(numPages(o))]); - -disp(' '); -disp([name '.pages = ']); -disp(' '); -disp(o.pages.getPages()); +reporting_object_display(o); end \ No newline at end of file diff --git a/matlab/reports/@report/report.m b/matlab/reports/@report/report.m index 2f440ebba..19b399dcf 100644 --- a/matlab/reports/@report/report.m +++ b/matlab/reports/@report/report.m @@ -36,11 +36,10 @@ o.title = ''; o.orientation = 'portrait'; o.paper = 'a4'; o.margin = 2.5; -o.margin_unit = 'cm'; +o.marginUnit = 'cm'; o.pages = pages(); o.filename = 'report.tex'; -o.config = ''; -o.showdate = true; +o.showDate = true; o.compiler = ''; if nargin == 1 @@ -54,16 +53,16 @@ elseif nargin > 1 'pairs']); end - optNames = lower(fieldnames(o)); + optNames = fieldnames(o); % overwrite default values for pair = reshape(varargin, 2, []) - field = lower(pair{1}); - if any(strmatch(field, optNames, 'exact')) - o.(field) = pair{2}; + ind = strmatch(lower(pair{1}), lower(optNames), 'exact'); + assert(isempty(ind) || length(ind) == 1); + if ~isempty(ind) + o.(optNames{ind}) = pair{2}; else - error('@report.report: %s is not a recognized option.', ... - field); + error('@report.report: %s is not a recognized option.', pair{1}); end end end @@ -71,14 +70,13 @@ end % Check options provided by user assert(ischar(o.title), '@report.report: title must be a string'); assert(ischar(o.filename), '@report.report: filename must be a string'); -assert(ischar(o.config), '@report.report: config file must be a string'); assert(ischar(o.compiler), '@report.report: compiler file must be a string'); -assert(islogical(o.showdate), '@report.report: showdate must be either true or false'); +assert(islogical(o.showDate), '@report.report: showDate must be either true or false'); assert(isfloat(o.margin) && o.margin > 0, '@report.report: margin must be a float > 0.'); valid_margin_unit = {'cm', 'in'}; -assert(any(strcmp(o.margin_unit, valid_margin_unit)), ... - ['@report.report: margin_unit must be one of ' strjoin(valid_margin_unit, ' ')]); +assert(any(strcmp(o.marginUnit, valid_margin_unit)), ... + ['@report.report: marginUnit must be one of ' strjoin(valid_margin_unit, ' ')]); valid_paper = {'a4', 'letter'}; assert(any(strcmp(o.paper, valid_paper)), ... diff --git a/matlab/reports/@report/write.m b/matlab/reports/@report/write.m index 031310d47..03b0dfc9a 100644 --- a/matlab/reports/@report/write.m +++ b/matlab/reports/@report/write.m @@ -36,16 +36,25 @@ end fprintf(fid, '%% Report Object\n'); fprintf(fid, '\\documentclass[11pt]{article}\n'); -fprintf(fid, '\\usepackage[%spaper,margin=%f%s', o.paper, o.margin, o.margin_unit); +fprintf(fid, '\\usepackage[%spaper,margin=%f%s', o.paper, o.margin, o.marginUnit); if strcmpi(o.orientation, 'landscape') fprintf(fid, ',landscape'); end fprintf(fid, ']{geometry}\n'); -fprintf(fid, '\\usepackage{pdflscape, pgf, pgfplots, booktabs}\n'); +fprintf(fid, '\\usepackage{pdflscape, pgf, booktabs}\n'); fprintf(fid, ['\\makeatletter\n' ... '\\def\\blfootnote{\\gdef\\@thefnmark{}\\@footnotetext}\n' ... '\\makeatother\n']); -if o.showdate + +if exist('OCTAVE_VERSION') && isempty(regexpi(computer, '.*apple.*', 'once')) + fprintf(fid, '\\usepackage[T1]{fontenc}\n'); + fprintf(fid, '\\usepackage[utf8x]{inputenc}\n'); + fprintf(fid, '\\usepackage{gnuplot-lua-tikz}\n'); +else + fprintf(fid, '\\usepackage{pgfplots}\n'); +end + +if o.showDate fprintf(fid, '\\usepackage{fancyhdr, datetime}\n'); fprintf(fid, '\\newdateformat{reportdate}{\\THEDAY\\ \\shortmonthname\\ \\THEYEAR}\n'); fprintf(fid, '\\pagestyle{fancy}\n'); diff --git a/matlab/reports/@section/display.m b/matlab/reports/@section/display.m index f8dbb345b..8729efe66 100644 --- a/matlab/reports/@section/display.m +++ b/matlab/reports/@section/display.m @@ -3,7 +3,7 @@ function display(o) % Display a Section object % % INPUTS -% none +% o [section] section object % % OUTPUTS % none @@ -28,15 +28,5 @@ function display(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -name = 'report.page.section'; - -disp(' '); -disp([name '.cols = ']); -disp(' '); -disp(o.cols); - -disp(' '); -disp([name '.elements = ']); -disp(' '); -disp(o.elements.getElements()); +reporting_object_display(o); end \ No newline at end of file diff --git a/matlab/reports/@section/section.m b/matlab/reports/@section/section.m index ba2bc2662..7e6bb0824 100644 --- a/matlab/reports/@section/section.m +++ b/matlab/reports/@section/section.m @@ -36,16 +36,16 @@ elseif nargin > 1 'pairs.']); end - optNames = lower(fieldnames(o)); + optNames = fieldnames(o); % overwrite default values for pair = reshape(varargin, 2, []) - field = lower(pair{1}); - if any(strmatch(field, optNames, 'exact')) - o.(field) = pair{2}; + ind = strmatch(lower(pair{1}), lower(optNames), 'exact'); + assert(isempty(ind) || length(ind) == 1); + if ~isempty(ind) + o.(optNames{ind}) = pair{2}; else - error('@section.section: %s is not a recognized option.', ... - field); + error('@section.section: %s is not a recognized option.', pair{1}); end end end diff --git a/matlab/reports/@sections/display.m b/matlab/reports/@sections/display.m index 908bd3897..0e344d000 100644 --- a/matlab/reports/@sections/display.m +++ b/matlab/reports/@sections/display.m @@ -3,7 +3,7 @@ function display(o) % Display a Sections object % % INPUTS -% none +% o [sections] sections object % % OUTPUTS % none @@ -28,9 +28,5 @@ function display(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -name = 'reports.page'; -disp(' '); -disp([name '.sections = ']); -disp(' '); -disp(getSections(o)); +reporting_object_display(o); end \ No newline at end of file diff --git a/matlab/reports/@sections/numSections.m b/matlab/reports/@sections/numSections.m index 006f4f2bf..2eb270077 100644 --- a/matlab/reports/@sections/numSections.m +++ b/matlab/reports/@sections/numSections.m @@ -1,5 +1,5 @@ -function ns = numSections(ss) -% function ns = numSections(ss) +function n = numSections(o) +% function n = numSections(o) % Copyright (C) 2013 Dynare Team % @@ -18,5 +18,5 @@ function ns = numSections(ss) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -ns = ss.objArray.numObjs(); +n = o.objArray.numObjArray(); end \ No newline at end of file diff --git a/matlab/reports/@series/display.m b/matlab/reports/@series/display.m index 7c8ce7848..5ad241bee 100644 --- a/matlab/reports/@series/display.m +++ b/matlab/reports/@series/display.m @@ -28,44 +28,5 @@ function display(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -name = 'report.page.section.graph.series'; -disp(' '); -disp([name '.data = ']); -disp(' '); -display(o.data); - -disp(' '); -disp([name '.color = ']); -disp(' '); -disp([' ''' o.color '''']); - -disp(' '); -disp([name '.line_style = ']); -disp(' '); -disp([' ''' o.line_style '''']); - -disp(' '); -disp([name '.line_width = ']); -disp(' '); -disp([' ''' o.line_width '''']); - -disp(' '); -disp([name '.graph_marker = ']); -disp(' '); -disp([' ''' o.graph_marker '''']); - -disp(' '); -disp([name '.graph_marker_edge_color = ']); -disp(' '); -disp([' ''' o.graph_marker_edge_color '''']); - -disp(' '); -disp([name '.graph_marker_face_color = ']); -disp(' '); -disp([' ''' o.graph_marker_face_color '''']); - -disp(' '); -disp([name '.graph_marker_size = ']); -disp(' '); -disp([' ''' o.graph_marker_size '''']); +reporting_object_display(o); end \ No newline at end of file diff --git a/matlab/reports/@series/getLine.m b/matlab/reports/@series/getLine.m index f4543a85c..c1f61c61c 100644 --- a/matlab/reports/@series/getLine.m +++ b/matlab/reports/@series/getLine.m @@ -34,28 +34,28 @@ assert(~isempty(o.data) && isa(o.data, 'dynSeries'), ['@series.getLine: must ' . 'provide data as a dynSeries']); % Line -assert(ischar(o.color), '@series.getLine: color must be a string'); +assert(ischar(o.graphLineColor), '@series.getLine: graphLineColor must be a string'); valid_line_style = {'none', '-', '--', ':', '-.'}; -assert(any(strcmp(o.line_style, valid_line_style)), ... - ['@series.getLine: line_style must be one of ' strjoin(valid_line_style, ' ')]); -assert(isfloat(o.line_width), ['@series.getLine: line_width must be a ' ... +assert(any(strcmp(o.graphLineStyle, valid_line_style)), ... + ['@series.getLine: graphLineStyle must be one of ' strjoin(valid_line_style, ' ')]); +assert(isfloat(o.graphLineWidth), ['@series.getLine: graphLineWidth must be a ' ... 'positive number']); -% Graph_Marker -valid_graph_marker = {'+', 'o', '*', '.', 'x', 's', 'square', 'd', 'diamond', ... +% GraphMarker +valid_graphMarker = {'+', 'o', '*', '.', 'x', 's', 'square', 'd', 'diamond', ... '^', 'v', '>', '<', 'p', 'pentagram', 'h', 'hexagram', ... 'none'}; -assert(isempty(o.graph_marker) || any(strcmp(o.graph_marker, valid_graph_marker)), ... - ['@series.getLine: graph_marker must be one of ' strjoin(valid_graph_marker)]); +assert(isempty(o.graphMarker) || any(strcmp(o.graphMarker, valid_graphMarker)), ... + ['@series.getLine: graphMarker must be one of ' strjoin(valid_graphMarker)]); -assert(ischar(o.graph_marker_edge_color), '@series.getLine: graph_marker_edge_color must be a string'); -assert(ischar(o.graph_marker_face_color), '@series.getLine: graph_marker_face_color must be a string'); -assert(isfloat(o.graph_marker_size), ['@series.getLine: graph_marker_size must be a ' ... +assert(ischar(o.graphMarkerEdgeColor), '@series.getLine: graphMarkerEdgeColor must be a string'); +assert(ischar(o.graphMarkerFaceColor), '@series.getLine: graphMarkerFaceColor must be a string'); +assert(isfloat(o.graphMarkerSize), ['@series.getLine: graphMarkerSize must be a ' ... 'positive number']); % Marker & Line -assert(~(strcmp(o.line_style, 'none') && isempty(o.graph_marker)), ['@series.getLine: ' ... - 'you must provide at least one of line_style and graph_marker']); +assert(~(strcmp(o.graphLineStyle, 'none') && isempty(o.graphMarker)), ['@series.getLine: ' ... + 'you must provide at least one of graphLineStyle and graphMarker']); % Validate xrange assert(isempty(xrange) || isa(xrange, 'dynDates')); @@ -70,15 +70,15 @@ end opt = {'XData', 1:length(ds.data)}; opt = {opt{:}, 'YData', ds.data}; -opt = {opt{:}, 'Color', o.color}; -opt = {opt{:}, 'LineStyle', o.line_style}; -opt = {opt{:}, 'LineWidth', o.line_width}; +opt = {opt{:}, 'Color', o.graphLineColor}; +opt = {opt{:}, 'LineStyle', o.graphLineStyle}; +opt = {opt{:}, 'LineWidth', o.graphLineWidth}; -if ~isempty(o.graph_marker) - opt = {opt{:}, 'Marker', o.graph_marker}; - opt = {opt{:}, 'MarkerSize', o.graph_marker_size}; - opt = {opt{:}, 'MarkerEdgeColor', o.graph_marker_edge_color}; - opt = {opt{:}, 'MarkerFaceColor', o.graph_marker_face_color}; +if ~isempty(o.graphMarker) + opt = {opt{:}, 'Marker', o.graphMarker}; + opt = {opt{:}, 'MarkerSize', o.graphMarkerSize}; + opt = {opt{:}, 'MarkerEdgeColor', o.graphMarkerEdgeColor}; + opt = {opt{:}, 'MarkerFaceColor', o.graphMarkerFaceColor}; end h = line(opt{:}); diff --git a/matlab/reports/@series/series.m b/matlab/reports/@series/series.m index 95f48562b..cf6f2db9a 100644 --- a/matlab/reports/@series/series.m +++ b/matlab/reports/@series/series.m @@ -35,20 +35,21 @@ o = struct; o.data = ''; -o.color = 'k'; -o.line_style = '-'; -o.line_width = 0.5; +o.graphLineColor = 'k'; +o.graphLineStyle = '-'; +o.graphLineWidth = 0.5; -o.graph_marker = ''; -o.graph_marker_edge_color = 'auto'; -o.graph_marker_face_color = 'auto'; -o.graph_marker_size = 6; +o.graphMarker = ''; +o.graphMarkerEdgeColor = 'auto'; +o.graphMarkerFaceColor = 'auto'; +o.graphMarkerSize = 6; -o.table_markers = false; -o.table_neg_color = 'red'; -o.table_pos_color = 'blue'; +o.tableShowMarkers = false; +o.tableNegColor = 'red'; +o.tablePosColor = 'blue'; +o.tableMarkerLimit = 1e-4; -o.table_align_right = false; +o.tableAlignRight = false; if nargin == 1 assert(isa(varargin{1}, 'series'),['@series.series: with one arg you ' ... @@ -61,15 +62,16 @@ elseif nargin > 1 'pairs.']); end - optNames = lower(fieldnames(o)); + optNames = fieldnames(o); % overwrite default values for pair = reshape(varargin, 2, []) - field = lower(pair{1}); - if any(strmatch(field, optNames, 'exact')) - o.(field) = pair{2}; + ind = strmatch(lower(pair{1}), lower(optNames), 'exact'); + assert(isempty(ind) || length(ind) == 1); + if ~isempty(ind) + o.(optNames{ind}) = pair{2}; else - error('@series.series: %s is not a recognized option.', field); + error('@series.series: %s is not a recognized option.', pair{1}); end end end diff --git a/matlab/reports/@series/write.m b/matlab/reports/@series/write.m index 30549913a..e0f0ffcae 100644 --- a/matlab/reports/@series/write.m +++ b/matlab/reports/@series/write.m @@ -4,6 +4,7 @@ function o = write(o, fid, dates, precision) % % INPUTS % o [series] series object +% fid [int] file id % dates [dynDates] dates for series slice % precision [float] precision with which to print the data % @@ -39,42 +40,40 @@ assert(isint(precision)); assert(~isempty(o.data) && isa(o.data, 'dynSeries'), ... '@series.write: must provide data as a dynSeries'); -assert(ischar(o.color), '@series.write: color must be a string'); -assert(ischar(o.table_neg_color), '@series.write: table_neg_color must be a string'); -assert(ischar(o.table_pos_color), '@series.write: table_pos_color must be a string'); -assert(islogical(o.table_markers), '@series.write: table_markers must be a string'); -assert(islogical(o.table_align_right), '@series.write: table_align_right must be a string'); +assert(ischar(o.tableNegColor), '@series.write: tableNegColor must be a string'); +assert(ischar(o.tablePosColor), '@series.write: tablePosColor must be a string'); +assert(islogical(o.tableShowMarkers), '@series.write: tableShowMarkers must be true or false'); +assert(islogical(o.tableAlignRight), '@series.write: tableAlignRight must be true or false'); +assert(isfloat(o.tableMarkerLimit), '@series,write: tableMarkerLimit must be a float'); %% Write Output dataString = ['%.' num2str(precision) 'f']; precision = 10^precision; fprintf(fid, '%% Table Row (series)\n'); -if o.table_align_right +if o.tableAlignRight fprintf(fid, '\\multicolumn{1}{r}{'); end fprintf(fid, '%s', o.data.tex{:}); -if o.table_align_right +if o.tableAlignRight fprintf(fid, '}'); end data = o.data(dates); data = data.data; for i=1:size(data,1) - thisCellData = round(data(i)*precision)/precision; - fprintf(fid, ' &'); - if o.table_markers - if thisCellData < 0 - fprintf(fid, '\\color{%s}', o.table_neg_color); - elseif thisCellData > 0 - fprintf(fid, '\\color{%s}', o.table_pos_color); + if o.tableShowMarkers + if data(i) < -o.tableMarkerLimit + fprintf(fid, '\\color{%s}', o.tableNegColor); + elseif data(i) > o.tableMarkerLimit + fprintf(fid, '\\color{%s}', o.tablePosColor); end fprintf(fid, '['); end - fprintf(fid, dataString, thisCellData); + fprintf(fid, dataString, round(data(i)*precision)/precision); - if o.table_markers + if o.tableShowMarkers fprintf(fid, ']'); end end diff --git a/matlab/reports/@seriesElements/display.m b/matlab/reports/@seriesElements/display.m index 38061b3e9..ed1b330d1 100644 --- a/matlab/reports/@seriesElements/display.m +++ b/matlab/reports/@seriesElements/display.m @@ -1,9 +1,9 @@ function display(o) %function display(o) -% Display a Elements object +% Display a seriesElements object % % INPUTS -% none +% o [seriesElements] seriesElements object % % OUTPUTS % none @@ -28,10 +28,5 @@ function display(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -name = 'report.page.section.elements.seriesElement'; - -disp(' '); -disp([name ' = ']); -disp(' '); -disp(getSeriesElements(o)); +reporting_object_display(o); end \ No newline at end of file diff --git a/matlab/reports/@seriesElements/getMaxRange.m b/matlab/reports/@seriesElements/getMaxRange.m index 9ba1f6af6..35eeebde2 100644 --- a/matlab/reports/@seriesElements/getMaxRange.m +++ b/matlab/reports/@seriesElements/getMaxRange.m @@ -18,7 +18,7 @@ function dd = getMaxRange(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -ne = numElements(o); +ne = numSeriesElements(o); ddmin = dynDate(); ddmax = dynDate(); for i=1:ne diff --git a/matlab/reports/@seriesElements/numElements.m b/matlab/reports/@seriesElements/numSeriesElements.m similarity index 87% rename from matlab/reports/@seriesElements/numElements.m rename to matlab/reports/@seriesElements/numSeriesElements.m index c31842037..fad1c52e2 100644 --- a/matlab/reports/@seriesElements/numElements.m +++ b/matlab/reports/@seriesElements/numSeriesElements.m @@ -1,5 +1,5 @@ -function n = numElements(o) -% function n = numElements(o) +function n = numSeriesElements(o) +% function n = numSeriesElements(o) % Copyright (C) 2013 Dynare Team % @@ -18,5 +18,5 @@ function n = numElements(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -n = o.objArray.numObjs(); +n = o.objArray.numObjArray(); end \ No newline at end of file diff --git a/matlab/reports/@table/display.m b/matlab/reports/@table/display.m index 42000527d..658722079 100644 --- a/matlab/reports/@table/display.m +++ b/matlab/reports/@table/display.m @@ -3,7 +3,7 @@ function display(o) % Display a Table object % % INPUTS -% none +% o [table] table object % % OUTPUTS % none @@ -28,34 +28,5 @@ function display(o) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see . -name = 'report.page.section.table'; -disp(' '); -disp([name '.title = ']); -disp(' '); -disp([' ''' o.title '''']); - -disp(' '); -disp([name '.footnote = ']); -disp(' '); -disp([' ''' o.footnote '''']); - -disp(' '); -disp([name '.hlines = ']); -disp(' '); -disp(o.hlines); - -disp(' '); -disp([name '.vlines = ']); -disp(' '); -disp(o.vlines); - -disp(' '); -disp([name '.precision = ']); -disp(' '); -disp(o.precision); - -disp(' '); -disp([name '.seriesElements = ']); -disp(' '); -o.seriesElements.getSeriesElements() +reporting_object_display(o); end \ No newline at end of file diff --git a/matlab/reports/@table/table.m b/matlab/reports/@table/table.m index 069288598..55cdde174 100644 --- a/matlab/reports/@table/table.m +++ b/matlab/reports/@table/table.m @@ -34,16 +34,14 @@ o = struct; o.seriesElements = seriesElements(); o.title = ''; -o.title_size = 'large'; -o.footnote = ''; +o.titleSize = 'large'; -o.config = ''; -o.hlines = false; -o.vlines = false; -o.vline_after = ''; +o.showHlines = false; +o.showVlines = false; +o.vlineAfter = ''; o.data = ''; -o.seriestouse = ''; +o.seriesToUse = ''; o.range = {}; o.precision = 1; @@ -58,57 +56,55 @@ elseif nargin > 1 'pairs.']); end - optNames = lower(fieldnames(o)); + optNames = fieldnames(o); % overwrite default values for pair = reshape(varargin, 2, []) - field = lower(pair{1}); - if any(strmatch(field, optNames, 'exact')) - o.(field) = pair{2}; + ind = strmatch(lower(pair{1}), lower(optNames), 'exact'); + assert(isempty(ind) || length(ind) == 1); + if ~isempty(ind) + o.(optNames{ind}) = pair{2}; else - error('%s is not a recognized option to the Table constructor.', ... - field); + error('%s is not a recognized option to the Table constructor.', pair{1}); end end end % Check options provided by user assert(ischar(o.title), '@table.table: title must be a string'); -assert(ischar(o.footnote), '@table.table: footnote must be a string'); -assert(ischar(o.config), '@table.table: config file must be a string'); -assert(islogical(o.hlines), '@table.table: hlines must be true or false'); -assert(islogical(o.vlines), '@table.table: vlines must be true or false'); +assert(islogical(o.showHlines), '@table.table: showHlines must be true or false'); +assert(islogical(o.showVlines), '@table.table: showVlines must be true or false'); assert(isint(o.precision), '@table.table: precision must be an int'); assert(isempty(o.range) || (isa(o.range, 'dynDates') && o.range.ndat >= 2), ... ['@table.table: range is specified as a dynDates range, e.g. ' ... '''dynDates(''1999q1''):dynDates(''1999q3'')''.']); assert(isempty(o.data) || isa(o.data, 'dynSeries'), ... '@table.table: data must be a dynSeries'); -assert(isempty(o.seriestouse) || iscellstr(o.seriestouse), ... - '@table.table: seriestouse must be a cell array of string(s)'); -assert(isempty(o.vline_after) || isa(o.vline_after, 'dynDate'), ... - '@table.table: vline_after must be a dynDate'); -if o.vlines - o.vline_after = ''; +assert(isempty(o.seriesToUse) || iscellstr(o.seriesToUse), ... + '@table.table: seriesToUse must be a cell array of string(s)'); +assert(isempty(o.vlineAfter) || isa(o.vlineAfter, 'dynDate'), ... + '@table.table: vlineAfter must be a dynDate'); +if o.showVlines + o.vlineAfter = ''; end valid_title_sizes = {'Huge', 'huge', 'LARGE', 'Large', 'large', 'normalsize', ... 'small', 'footnotesize', 'scriptsize', 'tiny'}; -assert(any(strcmp(o.title_size, valid_title_sizes)), ... - ['@table.table: title_size must be one of ' strjoin(valid_title_sizes, ' ')]); +assert(any(strcmp(o.titleSize, valid_title_sizes)), ... + ['@table.table: titleSize must be one of ' strjoin(valid_title_sizes, ' ')]); -% using o.seriestouse, create series objects and put them in o.seriesElements +% using o.seriesToUse, create series objects and put them in o.seriesElements if ~isempty(o.data) - if isempty(o.seriestouse) + if isempty(o.seriesToUse) for i=1:o.data.vobs o.seriesElements = o.seriesElements.addSeries('data', o.data{o.data.name{i}}); end else - for i=1:length(o.seriestouse) - o.seriesElements = o.seriesElements.addSeries('data', o.data{o.seriestouse{i}}); + for i=1:length(o.seriesToUse) + o.seriesElements = o.seriesElements.addSeries('data', o.data{o.seriesToUse{i}}); end end end -o = rmfield(o, 'seriestouse'); +o = rmfield(o, 'seriesToUse'); o = rmfield(o, 'data'); % Create table object diff --git a/matlab/reports/@table/write.m b/matlab/reports/@table/write.m index af10ff79b..afb47f16b 100644 --- a/matlab/reports/@table/write.m +++ b/matlab/reports/@table/write.m @@ -30,7 +30,7 @@ function o = write(o, fid) % along with Dynare. If not, see . assert(fid ~= -1); -if ~o.seriesElements.numElements() +if ~o.seriesElements.numSeriesElements() warning('@table.write: no series to plot, returning'); return; end @@ -54,12 +54,12 @@ fprintf(fid, '\\setlength{\\tabcolsep}{4pt}\n'); fprintf(fid, '\\begin{tabular}{@{}l'); for i=1:ndates - if o.vlines + if o.showVlines fprintf(fid, '|'); end fprintf(fid, 'r'); - if ~isempty(o.vline_after) - if dates(i) == o.vline_after + if ~isempty(o.vlineAfter) + if dates(i) == o.vlineAfter fprintf(fid, '|'); end end @@ -67,7 +67,7 @@ end fprintf(fid, '@{}}%%\n'); if ~isempty(o.title) fprintf(fid, '\\multicolumn{%d}{c}{\\%s %s}\\\\\n', ... - ndates+nlhc, o.title_size, o.title); + ndates+nlhc, o.titleSize, o.title); end fprintf(fid, '\\toprule%%\n'); @@ -122,9 +122,12 @@ fprintf(fid, '\\\\%%\n'); fprintf(fid, '%%\n'); % Write Table Data -ne = o.seriesElements.numElements(); +ne = o.seriesElements.numSeriesElements(); for i=1:ne o.seriesElements(i).write(fid, dates, o.precision); + if o.showHlines + fprintf(fid, '\\hline\n'); + end end fprintf(fid, '\\bottomrule\n'); diff --git a/matlab/reports/@vspace/display.m b/matlab/reports/@vspace/display.m new file mode 100644 index 000000000..9d8e0097c --- /dev/null +++ b/matlab/reports/@vspace/display.m @@ -0,0 +1,32 @@ +function display(o) +%function display(o) +% Display a Vspace object +% +% INPUTS +% o [vspace] vspace object +% +% OUTPUTS +% none +% +% SPECIAL REQUIREMENTS +% none + +% Copyright (C) 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 . + +reporting_object_display(o); +end \ No newline at end of file diff --git a/matlab/reports/@vspace/vspace.m b/matlab/reports/@vspace/vspace.m index 4958c48be..e61ca8149 100644 --- a/matlab/reports/@vspace/vspace.m +++ b/matlab/reports/@vspace/vspace.m @@ -44,15 +44,16 @@ elseif nargin > 1 'pairs.']); end - optNames = lower(fieldnames(o)); + optNames = fieldnames(o); % overwrite default values for pair = reshape(varargin, 2, []) - field = lower(pair{1}); - if any(strmatch(field, optNames, 'exact')) - o.(field) = pair{2}; + ind = strmatch(lower(pair{1}), lower(optNames), 'exact'); + assert(isempty(ind) || length(ind) == 1); + if ~isempty(ind) + o.(optNames{ind}) = pair{2}; else - error('@vspace.vspace: %s is not a recognized option.', field); + error('@vspace.vspace: %s is not a recognized option.', pair{1}); end end end diff --git a/matlab/reports/reporting_object_display.m b/matlab/reports/reporting_object_display.m new file mode 100644 index 000000000..a69b749c5 --- /dev/null +++ b/matlab/reports/reporting_object_display.m @@ -0,0 +1,89 @@ +function reporting_object_display(o) +%function reporting_object_display(o) +% Display a Reporting Object +% i.e., one of: elements +% graph +% objArray +% page +% pages +% report +% section +% sections +% series +% seriesElements +% table +% vspace +% +% INPUTS +% o [object] reporting object +% +% OUTPUTS +% none +% +% SPECIAL REQUIREMENTS +% none + +% Copyright (C) 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 . + +fprintf('\n%s Object = \n\n', upper(class(o))); +fields = fieldnames(o); +for i=1:length(fields) + fprintf(' %s: ', fields{i}); + val = o.(fields{i}); + if iscell(val) + fprintf('{'); + for j=1:length(val) + assert(ischar(val{j})); + fprintf('''%s''', val{j}); + if j~=length(val) + fprintf(', '); + end + end + fprintf('}'); + elseif ischar(val) + fprintf('''%s''', val); + elseif isnumeric(val) + fprintf('%s', num2str(val)); + elseif islogical(val) + if val + fprintf('true'); + else + fprintf('false'); + end + elseif isobject(val) + if isa(val, 'dynDates') + fprintf('', ... + val(1).format, val(end).format); + elseif isa(val, 'dynSeries') + if numel(val) == 1 + fprintf('', val.name{1}); + else + fprintf('%s', class(val)); + end + else + cl = class(val); + fprintf('%d', val.(['num' upper(cl(1)) cl(2:end)])); + end + else + keyboard + fprintf('fix this'); + end + fprintf('\n'); +end +fprintf('\n'); +end \ No newline at end of file diff --git a/matlab/simult_.m b/matlab/simult_.m index 0d472c216..d2b948a97 100644 --- a/matlab/simult_.m +++ b/matlab/simult_.m @@ -47,7 +47,7 @@ if options_.order == 3 options_.k_order_solver = 1; end -if ~options_.k_order_solver +if ~options_.k_order_solver || (options_.k_order_solver && options_.pruning) %if k_order_pert is not used or if we do not use Dynare++ with k_order_pert if iorder==1 y_(:,1) = y_(:,1)-dr.ys; end diff --git a/preprocessor/DynamicModel.cc b/preprocessor/DynamicModel.cc index 10ca5aa2f..2dfba144b 100644 --- a/preprocessor/DynamicModel.cc +++ b/preprocessor/DynamicModel.cc @@ -3924,29 +3924,29 @@ DynamicModel::writeLatexFile(const string &basename) const void DynamicModel::substituteEndoLeadGreaterThanTwo(bool deterministic_model) { - substituteLeadLagInternal(avEndoLead, deterministic_model); + substituteLeadLagInternal(avEndoLead, deterministic_model, vector()); } void DynamicModel::substituteEndoLagGreaterThanTwo(bool deterministic_model) { - substituteLeadLagInternal(avEndoLag, deterministic_model); + substituteLeadLagInternal(avEndoLag, deterministic_model, vector()); } void DynamicModel::substituteExoLead(bool deterministic_model) { - substituteLeadLagInternal(avExoLead, deterministic_model); + substituteLeadLagInternal(avExoLead, deterministic_model, vector()); } void DynamicModel::substituteExoLag(bool deterministic_model) { - substituteLeadLagInternal(avExoLag, deterministic_model); + substituteLeadLagInternal(avExoLag, deterministic_model, vector()); } void -DynamicModel::substituteLeadLagInternal(aux_var_t type, bool deterministic_model) +DynamicModel::substituteLeadLagInternal(aux_var_t type, bool deterministic_model, const vector &subset) { ExprNode::subst_table_t subst_table; vector neweqs; @@ -3976,7 +3976,7 @@ DynamicModel::substituteLeadLagInternal(aux_var_t type, bool deterministic_model subst = value->substituteExoLag(subst_table, neweqs); break; case avDiffForward: - subst = value->differentiateForwardVars(subst_table, neweqs); + subst = value->differentiateForwardVars(subset, subst_table, neweqs); break; default: cerr << "DynamicModel::substituteLeadLagInternal: impossible case" << endl; @@ -4004,7 +4004,7 @@ DynamicModel::substituteLeadLagInternal(aux_var_t type, bool deterministic_model subst = equations[i]->substituteExoLag(subst_table, neweqs); break; case avDiffForward: - subst = equations[i]->differentiateForwardVars(subst_table, neweqs); + subst = equations[i]->differentiateForwardVars(subset, subst_table, neweqs); break; default: cerr << "DynamicModel::substituteLeadLagInternal: impossible case" << endl; @@ -4134,9 +4134,9 @@ DynamicModel::removeTrendVariableFromEquations() } void -DynamicModel::differentiateForwardVars() +DynamicModel::differentiateForwardVars(const vector &subset) { - substituteLeadLagInternal(avDiffForward, true); + substituteLeadLagInternal(avDiffForward, true, subset); } void diff --git a/preprocessor/DynamicModel.hh b/preprocessor/DynamicModel.hh index b3ca75c9b..63ac665f4 100644 --- a/preprocessor/DynamicModel.hh +++ b/preprocessor/DynamicModel.hh @@ -139,8 +139,11 @@ private: void collectBlockVariables(); //! Factorized code for substitutions of leads/lags - /*! \param[in] type determines which type of variables is concerned */ - void substituteLeadLagInternal(aux_var_t type, bool deterministic_model); + /*! \param[in] type determines which type of variables is concerned + \param[in] deterministic_model whether we are in a deterministic model (only for exogenous leads/lags) + \param[in] subset variables to which to apply the transformation (only for diff of forward vars) + */ + void substituteLeadLagInternal(aux_var_t type, bool deterministic_model, const vector &subset); private: //! Indicate if the temporary terms are computed for the overall model (true) or not (false). Default value true @@ -281,7 +284,9 @@ public: void removeTrendVariableFromEquations(); //! Transforms the model by creating aux vars for the diff of forward vars - void differentiateForwardVars(); + /*! If subset is empty, does the transformation for all fwrd vars; otherwise + restrict it to the vars in subset */ + void differentiateForwardVars(const vector &subset); //! Fills eval context with values of model local variables and auxiliary variables void fillEvalContext(eval_context_t &eval_context) const; diff --git a/preprocessor/DynareBison.yy b/preprocessor/DynareBison.yy index 92d492755..7bc5698f1 100644 --- a/preprocessor/DynareBison.yy +++ b/preprocessor/DynareBison.yy @@ -568,7 +568,8 @@ model_options : BLOCK { driver.block(); } | BYTECODE { driver.byte_code(); } | USE_DLL { driver.use_dll(); } | NO_STATIC { driver.no_static();} - | DIFFERENTIATE_FORWARD_VARS { driver.differentiate_forward_vars(); } + | DIFFERENTIATE_FORWARD_VARS { driver.differentiate_forward_vars_all(); } + | DIFFERENTIATE_FORWARD_VARS EQUAL '(' symbol_list ')' { driver.differentiate_forward_vars_some(); } | o_linear ; diff --git a/preprocessor/ExprNode.cc b/preprocessor/ExprNode.cc index 59d26fa26..930ee3e0d 100644 --- a/preprocessor/ExprNode.cc +++ b/preprocessor/ExprNode.cc @@ -431,7 +431,7 @@ NumConstNode::substituteExpectation(subst_table_t &subst_table, vector &neweqs) const +NumConstNode::differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const { return const_cast(this); } @@ -1225,14 +1225,16 @@ VariableNode::substituteExpectation(subst_table_t &subst_table, vector &neweqs) const +VariableNode::differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const { expr_t value; switch (type) { case eEndogenous: assert(lag <= 1); - if (lag <= 0) + if (lag <= 0 + || (subset.size() > 0 + && find(subset.begin(), subset.end(), datatree.symbol_table.getName(symb_id)) == subset.end())) return const_cast(this); else { @@ -1255,7 +1257,7 @@ VariableNode::differentiateForwardVars(subst_table_t &subst_table, vectormaxEndoLead() <= 0) return const_cast(this); else - return value->differentiateForwardVars(subst_table, neweqs); + return value->differentiateForwardVars(subset, subst_table, neweqs); default: return const_cast(this); } @@ -2339,9 +2341,9 @@ UnaryOpNode::substituteExpectation(subst_table_t &subst_table, vector &neweqs) const +UnaryOpNode::differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const { - expr_t argsubst = arg->differentiateForwardVars(subst_table, neweqs); + expr_t argsubst = arg->differentiateForwardVars(subset, subst_table, neweqs); return buildSimilarUnaryOpNode(argsubst, datatree); } @@ -3583,10 +3585,10 @@ BinaryOpNode::substituteExpectation(subst_table_t &subst_table, vector &neweqs) const +BinaryOpNode::differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const { - expr_t arg1subst = arg1->differentiateForwardVars(subst_table, neweqs); - expr_t arg2subst = arg2->differentiateForwardVars(subst_table, neweqs); + expr_t arg1subst = arg1->differentiateForwardVars(subset, subst_table, neweqs); + expr_t arg2subst = arg2->differentiateForwardVars(subset, subst_table, neweqs); return buildSimilarBinaryOpNode(arg1subst, arg2subst, datatree); } @@ -4200,11 +4202,11 @@ TrinaryOpNode::substituteExpectation(subst_table_t &subst_table, vector &neweqs) const +TrinaryOpNode::differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const { - expr_t arg1subst = arg1->differentiateForwardVars(subst_table, neweqs); - expr_t arg2subst = arg2->differentiateForwardVars(subst_table, neweqs); - expr_t arg3subst = arg3->differentiateForwardVars(subst_table, neweqs); + expr_t arg1subst = arg1->differentiateForwardVars(subset, subst_table, neweqs); + expr_t arg2subst = arg2->differentiateForwardVars(subset, subst_table, neweqs); + expr_t arg3subst = arg3->differentiateForwardVars(subset, subst_table, neweqs); return buildSimilarTrinaryOpNode(arg1subst, arg2subst, arg3subst, datatree); } @@ -4765,11 +4767,11 @@ ExternalFunctionNode::substituteExpectation(subst_table_t &subst_table, vector &neweqs) const +ExternalFunctionNode::differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const { vector arguments_subst; for (vector::const_iterator it = arguments.begin(); it != arguments.end(); it++) - arguments_subst.push_back((*it)->differentiateForwardVars(subst_table, neweqs)); + arguments_subst.push_back((*it)->differentiateForwardVars(subset, subst_table, neweqs)); return buildSimilarExternalFunctionNode(arguments_subst, datatree); } diff --git a/preprocessor/ExprNode.hh b/preprocessor/ExprNode.hh index 7ba4ccc2c..917643f1f 100644 --- a/preprocessor/ExprNode.hh +++ b/preprocessor/ExprNode.hh @@ -361,11 +361,13 @@ public: //! Constructs a new expression where forward variables (supposed to be at most in t+1) have been replaced by themselves at t, plus a new aux var representing their (time) differentiate /*! + \param[in] subset variables to which to limit the transformation; transform + all fwrd vars if empty \param[in,out] subst_table Map used to store mapping between a given forward variable and the aux var that contains its differentiate \param[out] neweqs Equations to be added to the model to match the creation of auxiliary variables. */ - virtual expr_t differentiateForwardVars(subst_table_t &subst_table, vector &neweqs) const = 0; + virtual expr_t differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const = 0; //! Return true if the nodeID is a numerical constant equal to value and false otherwise /*! @@ -452,7 +454,7 @@ public: virtual expr_t substituteExoLag(subst_table_t &subst_table, vector &neweqs) const; virtual expr_t substituteExpectation(subst_table_t &subst_table, vector &neweqs, bool partial_information_model) const; virtual expr_t decreaseLeadsLagsPredeterminedVariables() const; - virtual expr_t differentiateForwardVars(subst_table_t &subst_table, vector &neweqs) const; + virtual expr_t differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const; virtual bool isNumConstNodeEqualTo(double value) const; virtual bool containsEndogenous(void) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; @@ -514,7 +516,7 @@ public: virtual expr_t substituteExoLag(subst_table_t &subst_table, vector &neweqs) const; virtual expr_t substituteExpectation(subst_table_t &subst_table, vector &neweqs, bool partial_information_model) const; virtual expr_t decreaseLeadsLagsPredeterminedVariables() const; - virtual expr_t differentiateForwardVars(subst_table_t &subst_table, vector &neweqs) const; + virtual expr_t differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const; virtual bool isNumConstNodeEqualTo(double value) const; virtual bool containsEndogenous(void) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; @@ -591,7 +593,7 @@ public: virtual expr_t substituteExoLag(subst_table_t &subst_table, vector &neweqs) const; virtual expr_t substituteExpectation(subst_table_t &subst_table, vector &neweqs, bool partial_information_model) const; virtual expr_t decreaseLeadsLagsPredeterminedVariables() const; - virtual expr_t differentiateForwardVars(subst_table_t &subst_table, vector &neweqs) const; + virtual expr_t differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const; virtual bool isNumConstNodeEqualTo(double value) const; virtual bool containsEndogenous(void) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; @@ -681,7 +683,7 @@ public: virtual expr_t substituteExoLag(subst_table_t &subst_table, vector &neweqs) const; virtual expr_t substituteExpectation(subst_table_t &subst_table, vector &neweqs, bool partial_information_model) const; virtual expr_t decreaseLeadsLagsPredeterminedVariables() const; - virtual expr_t differentiateForwardVars(subst_table_t &subst_table, vector &neweqs) const; + virtual expr_t differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const; virtual bool isNumConstNodeEqualTo(double value) const; virtual bool containsEndogenous(void) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; @@ -751,7 +753,7 @@ public: virtual expr_t substituteExoLag(subst_table_t &subst_table, vector &neweqs) const; virtual expr_t substituteExpectation(subst_table_t &subst_table, vector &neweqs, bool partial_information_model) const; virtual expr_t decreaseLeadsLagsPredeterminedVariables() const; - virtual expr_t differentiateForwardVars(subst_table_t &subst_table, vector &neweqs) const; + virtual expr_t differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const; virtual bool isNumConstNodeEqualTo(double value) const; virtual bool containsEndogenous(void) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; @@ -825,7 +827,7 @@ public: virtual expr_t substituteExpectation(subst_table_t &subst_table, vector &neweqs, bool partial_information_model) const; virtual expr_t buildSimilarExternalFunctionNode(vector &alt_args, DataTree &alt_datatree) const; virtual expr_t decreaseLeadsLagsPredeterminedVariables() const; - virtual expr_t differentiateForwardVars(subst_table_t &subst_table, vector &neweqs) const; + virtual expr_t differentiateForwardVars(const vector &subset, subst_table_t &subst_table, vector &neweqs) const; virtual bool isNumConstNodeEqualTo(double value) const; virtual bool containsEndogenous(void) const; virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const; diff --git a/preprocessor/ModFile.cc b/preprocessor/ModFile.cc index 503c9e20a..86296273f 100644 --- a/preprocessor/ModFile.cc +++ b/preprocessor/ModFile.cc @@ -250,6 +250,19 @@ ModFile::checkPass() cerr << "ERROR: marking equations as [static] or [dynamic] is not possible with ramsey_policy or discretionary_policy" << endl; exit(EXIT_FAILURE); } + + if (stochastic_statement_present && + (dynamic_model.isUnaryOpUsed(oSign) + || dynamic_model.isUnaryOpUsed(oAbs) + || dynamic_model.isBinaryOpUsed(oMax) + || dynamic_model.isBinaryOpUsed(oMin) + || dynamic_model.isBinaryOpUsed(oGreater) + || dynamic_model.isBinaryOpUsed(oLess) + || dynamic_model.isBinaryOpUsed(oGreaterEqual) + || dynamic_model.isBinaryOpUsed(oLessEqual) + || dynamic_model.isBinaryOpUsed(oEqualEqual) + || dynamic_model.isBinaryOpUsed(oDifferent))) + warnings << "WARNING: you are using a function (max, min, abs, sign) or an operator (<, >, <=, >=, ==, !=) which is unsuitable for a stochastic context; see the reference manual, section about \"Expressions\", for more details." << endl; } void @@ -309,7 +322,7 @@ ModFile::transformPass() } if (differentiate_forward_vars) - dynamic_model.differentiateForwardVars(); + dynamic_model.differentiateForwardVars(differentiate_forward_vars_subset); if (mod_file_struct.dsge_var_estimated || !mod_file_struct.dsge_var_calibrated.empty()) try diff --git a/preprocessor/ModFile.hh b/preprocessor/ModFile.hh index ceba97b1c..d2784d1a4 100644 --- a/preprocessor/ModFile.hh +++ b/preprocessor/ModFile.hh @@ -78,6 +78,12 @@ public: //! Is the 'differentiate_forward_vars' option used? bool differentiate_forward_vars; + /*! If the 'differentiate_forward_vars' option is used, contains the set of + endogenous with respect to which to do the transformation; + if empty, means that the transformation must be applied to all endos + with a lead */ + vector differentiate_forward_vars_subset; + //! Are nonstationary variables present ? bool nonstationary_variables; diff --git a/preprocessor/ParsingDriver.cc b/preprocessor/ParsingDriver.cc index 2d8d4fa9c..9747b6408 100644 --- a/preprocessor/ParsingDriver.cc +++ b/preprocessor/ParsingDriver.cc @@ -494,11 +494,26 @@ ParsingDriver::byte_code() } void -ParsingDriver::differentiate_forward_vars() +ParsingDriver::differentiate_forward_vars_all() { mod_file->differentiate_forward_vars = true; } +void +ParsingDriver::differentiate_forward_vars_some() +{ + mod_file->differentiate_forward_vars = true; + mod_file->differentiate_forward_vars_subset = symbol_list.get_symbols(); + for (vector::const_iterator it = mod_file->differentiate_forward_vars_subset.begin(); + it != mod_file->differentiate_forward_vars_subset.end(); ++it) + { + check_symbol_existence(*it); + if (mod_file->symbol_table.getType(*it) != eEndogenous) + error("Symbol " + *it + " is not an endogenous"); + } + symbol_list.clear(); +} + void ParsingDriver::cutoff(string *value) { diff --git a/preprocessor/ParsingDriver.hh b/preprocessor/ParsingDriver.hh index 7da190a25..6d3fda9f0 100644 --- a/preprocessor/ParsingDriver.hh +++ b/preprocessor/ParsingDriver.hh @@ -245,8 +245,10 @@ public: void byte_code(); //! the static model is not computed void no_static(); - //! the differentiate_forward_vars option is enabled - void differentiate_forward_vars(); + //! the differentiate_forward_vars option is enabled (for all vars) + void differentiate_forward_vars_all(); + //! the differentiate_forward_vars option is enabled (for a subset of vars) + void differentiate_forward_vars_some(); //! cutoff option of model block void cutoff(string *value); //! mfs option of model block