move preprocessor and macroprocessor documentation to preprocessor submodule
parent
ba3cebbad7
commit
5d1a132374
|
@ -75,8 +75,6 @@ checksum
|
|||
/doc/mdate-sh
|
||||
/doc/stamp-vti
|
||||
!/doc/guide.bbl
|
||||
!/doc/macroprocessor/new-design.pdf
|
||||
!/doc/macroprocessor/old-design.pdf
|
||||
!/doc/userguide/P_ModStruct3.pdf
|
||||
!/doc/userguide/P_MH2.pdf
|
||||
!/doc/userguide/P_flowest.pdf
|
||||
|
|
|
@ -155,8 +155,6 @@ AX_PTHREAD
|
|||
AC_CONFIG_FILES([Makefile
|
||||
VERSION
|
||||
doc/Makefile
|
||||
doc/preprocessor/Makefile
|
||||
doc/macroprocessor/Makefile
|
||||
doc/parallel/Makefile
|
||||
doc/internals/Makefile
|
||||
doc/gsa/Makefile
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
SUBDIRS = preprocessor macroprocessor parallel internals gsa dseries-and-reporting
|
||||
SUBDIRS = parallel internals gsa dseries-and-reporting
|
||||
|
||||
info_TEXINFOS = dynare.texi
|
||||
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
if HAVE_PDFLATEX
|
||||
if HAVE_BEAMER
|
||||
pdf-local: macroprocessor.pdf
|
||||
endif
|
||||
endif
|
||||
|
||||
SRC = macroprocessor.tex new-design.pdf
|
||||
|
||||
EXTRA_DIST = $(SRC)
|
||||
|
||||
macroprocessor.pdf: $(SRC)
|
||||
$(PDFLATEX) macroprocessor
|
||||
$(PDFLATEX) macroprocessor
|
||||
|
||||
clean-local:
|
||||
rm -f macroprocessor.pdf *.toc *.aux *.log *.nav *.snm *.vrb *.out *~
|
|
@ -1,624 +0,0 @@
|
|||
\documentclass{beamer}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{lmodern}
|
||||
\usepackage{amsmath}
|
||||
\usepackage[copyright]{ccicons}
|
||||
|
||||
\usetheme{Boadilla}
|
||||
|
||||
\title{The Dynare Macro-processor}
|
||||
\subtitle{Dynare Summer School 2017}
|
||||
\author{Sébastien Villemot}
|
||||
%\pgfdeclareimage[height=0.6cm]{logo}{logo-ofce}
|
||||
\institute{OFCE}
|
||||
\date{June 13, 2017}
|
||||
|
||||
\AtBeginSection[]
|
||||
{
|
||||
\begin{frame}
|
||||
\frametitle{Outline}
|
||||
\tableofcontents[currentsection]
|
||||
\end{frame}
|
||||
}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\begin{frame}
|
||||
\titlepage
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Outline}
|
||||
\tableofcontents
|
||||
\end{frame}
|
||||
|
||||
\section{Overview}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Motivation}
|
||||
\begin{itemize}
|
||||
\item The \textbf{Dynare language} (used in MOD files) is well suited for many economic models
|
||||
\item However, as such, it lacks some useful features, such as:
|
||||
\begin{itemize}
|
||||
\item a loop mechanism for automatically repeating similar blocks of equations (such as in multi-country models)
|
||||
\item an operator for indexed sums or products inside equations
|
||||
\item a mechanism for splitting large MOD files in smaller modular files
|
||||
\item the possibility of conditionally including some equations or some runtime commands
|
||||
\end{itemize}
|
||||
\item The \textbf{Dynare Macro-language} was specifically designed to address these issues
|
||||
\item Being flexible and fairly general, it can also be helpful in other situations
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Design of the macro-language}
|
||||
\begin{itemize}
|
||||
\item The Dynare Macro-language provides a new set of \textbf{macro-commands} which can be inserted inside MOD files
|
||||
\item Language features include:
|
||||
\begin{itemize}
|
||||
\item file inclusion
|
||||
\item loops (\textit{for} structure)
|
||||
\item conditional inclusion (\textit{if/else} structures)
|
||||
\item expression substitution
|
||||
\end{itemize}
|
||||
\item The macro-processor transforms a MOD file with macro-commands into a MOD file without macro-commands (doing text expansions/inclusions) and then feeds it to the Dynare parser
|
||||
\item The key point to understand is that the macro-processor only does \textbf{text substitution} (like the C preprocessor or the PHP language)
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Design of Dynare}
|
||||
\includegraphics[width=0.95\linewidth]{new-design.pdf}
|
||||
\end{frame}
|
||||
|
||||
\section{Syntax}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Macro Directives}
|
||||
\begin{itemize}
|
||||
\item Directives begin with an at-sign followed by a pound sign (\verb+@#+)
|
||||
\item A directive produces no output, but gives instructions to the macro-processor
|
||||
\item Main directives are:
|
||||
\begin{itemize}
|
||||
\item file inclusion: \verb+@#include+
|
||||
\item definition a variable of the macro-processor: \verb+@#define+
|
||||
\item conditional statements (\verb+@#if/@#ifdef/@#ifndef/@#else/@#endif+)
|
||||
\item loop statements (\verb+@#for/@#endfor+)
|
||||
\end{itemize}
|
||||
\item In most cases, directives occupy exactly one line of text. In case of need, two anti-slashes (\verb+\\+) at the end of the line indicates that the directive is continued on the next line.
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Variables}
|
||||
\begin{itemize}
|
||||
\item The macro processor maintains its own list of variables (distinct of model variables and of MATLAB/Octave variables)
|
||||
\item Macro-variables can be of four types:
|
||||
\begin{itemize}
|
||||
\item integer
|
||||
\item character string (declared between \textit{double} quotes)
|
||||
\item array of integers
|
||||
\item array of strings
|
||||
\end{itemize}
|
||||
\item No boolean type:
|
||||
\begin{itemize}
|
||||
\item false is represented by integer zero
|
||||
\item true is any non-null integer
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Macro-expressions (1/2)}
|
||||
It is possible to construct macro-expressions, using standard operators.
|
||||
\begin{block}{Operators on integers}
|
||||
\begin{itemize}
|
||||
\item arithmetic operators: \texttt{+ - * /}
|
||||
\item comparison operators: \texttt{< > <= >= == !=}
|
||||
\item logical operators: \verb+&& || !+
|
||||
\item integer ranges: \texttt{1:4} is equivalent to integer array \texttt{[1,2,3,4]}
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
|
||||
\begin{block}{Operators on character strings}
|
||||
\begin{itemize}
|
||||
\item comparison operators: \texttt{== !=}
|
||||
\item concatenation: \texttt{+}
|
||||
\item extraction of substrings: if \texttt{s} is a string, then one can write \texttt{s[3]} or \texttt{s[4:6]}
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Macro-expressions (2/2)}
|
||||
\begin{block}{Operators on arrays}
|
||||
\begin{itemize}
|
||||
\item dereferencing: if \texttt{v} is an array, then \texttt{v[2]} is its $2^{\textrm{nd}}$ element
|
||||
\item concatenation: \texttt{+}
|
||||
\item difference \texttt{-}: returns the first operand from which the elements of the second operand have been removed
|
||||
\item extraction of sub-arrays: \textit{e.g.} \texttt{v[4:6]}
|
||||
\item testing membership of an array: \texttt{in} operator \\ (example:
|
||||
\texttt{"b" in ["a", "b", "c"]} returns \texttt{1})
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
|
||||
Macro-expressions can be used at two places:
|
||||
\begin{itemize}
|
||||
\item inside macro directives, directly
|
||||
\item in the body of the MOD file, between an at-sign and curly braces (like \verb+@{expr}+): the macro processor will substitute the expression with its value
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Define directive}
|
||||
|
||||
The value of a macro-variable can be defined with the \verb+@#define+ directive.
|
||||
|
||||
\begin{block}{Syntax}
|
||||
\verb+@#define +\textit{variable\_name}\verb+ = +\textit{expression}
|
||||
\end{block}
|
||||
|
||||
\begin{block}{Examples}
|
||||
\begin{verbatim}
|
||||
@#define x = 5 // Integer
|
||||
@#define y = "US" // String
|
||||
@#define v = [ 1, 2, 4 ] // Integer array
|
||||
@#define w = [ "US", "EA" ] // String array
|
||||
@#define z = 3 + v[2] // Equals 5
|
||||
@#define t = ("US" in w) // Equals 1 (true)
|
||||
\end{verbatim}
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Expression substitution}
|
||||
\framesubtitle{Dummy example}
|
||||
\begin{block}{Before macro-processing}
|
||||
\begin{verbatim}
|
||||
@#define x = [ "B", "C" ]
|
||||
@#define i = 2
|
||||
|
||||
model;
|
||||
A = @{x[i]};
|
||||
end;
|
||||
\end{verbatim}
|
||||
\end{block}
|
||||
\begin{block}{After macro-processing}
|
||||
\begin{verbatim}
|
||||
model;
|
||||
A = C;
|
||||
end;
|
||||
\end{verbatim}
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Inclusion directive (1/2)}
|
||||
\begin{itemize}
|
||||
\item This directive simply includes the content of another file at the place where it is inserted.
|
||||
\begin{block}{Syntax}
|
||||
\verb+@#include "+\textit{filename}\verb+"+
|
||||
\end{block}
|
||||
\begin{block}{Example}
|
||||
\begin{verbatim}
|
||||
@#include "modelcomponent.mod"
|
||||
\end{verbatim}
|
||||
\end{block}
|
||||
\item Exactly equivalent to a copy/paste of the content of the included file
|
||||
\item Note that it is possible to nest includes (\textit{i.e.} to include a
|
||||
file from an included file)
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Inclusion directive (2/2)}
|
||||
\begin{itemize}
|
||||
\item The filename can be given by a macro-variable (useful in loops):
|
||||
\begin{block}{Example with variable}
|
||||
\begin{verbatim}
|
||||
@#define fname = "modelcomponent.mod"
|
||||
@#include fname
|
||||
\end{verbatim}
|
||||
\end{block}
|
||||
\item Files to include are searched for in current directory. Other directories can
|
||||
be added with
|
||||
\texttt{@includepath} directive, \texttt{-I} command line option or
|
||||
\texttt{[paths]} section in config file.
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Loop directive}
|
||||
\begin{block}{Syntax}
|
||||
\verb+@#for +\textit{variable\_name}\verb+ in +\textit{array\_expr} \\
|
||||
\verb+ +\textit{loop\_body} \\
|
||||
\verb+@#endfor+
|
||||
\end{block}
|
||||
\begin{block}{Example: before macro-processing}
|
||||
\small
|
||||
\begin{verbatim}
|
||||
model;
|
||||
@#for country in [ "home", "foreign" ]
|
||||
GDP_@{country} = A * K_@{country}^a * L_@{country}^(1-a);
|
||||
@#endfor
|
||||
end;
|
||||
\end{verbatim}
|
||||
\normalsize
|
||||
\end{block}
|
||||
|
||||
\begin{block}{Example: after macro-processing}
|
||||
\small
|
||||
\begin{verbatim}
|
||||
model;
|
||||
GDP_home = A * K_home^a * L_home^(1-a);
|
||||
GDP_foreign = A * K_foreign^a * L_foreign^(1-a);
|
||||
end;
|
||||
\end{verbatim}
|
||||
\normalsize
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Conditional inclusion directives (1/2)}
|
||||
|
||||
\begin{columns}[T]
|
||||
\column{0.47\linewidth}
|
||||
\begin{block}{Syntax 1}
|
||||
\verb+@#if +\textit{integer\_expr} \\
|
||||
\verb+ +\textit{body included if expr != 0} \\
|
||||
\verb+@#endif+
|
||||
\end{block}
|
||||
|
||||
\column{0.47\linewidth}
|
||||
\begin{block}{Syntax 2}
|
||||
\verb+@#if +\textit{integer\_expr} \\
|
||||
\verb+ +\textit{body included if expr != 0} \\
|
||||
\verb+@#else+ \\
|
||||
\verb+ +\textit{body included if expr == 0} \\
|
||||
\verb+@#endif+
|
||||
\end{block}
|
||||
\end{columns}
|
||||
|
||||
\begin{block}{Example: alternative monetary policy rules}
|
||||
\scriptsize
|
||||
\begin{verbatim}
|
||||
@#define linear_mon_pol = 0 // or 1
|
||||
...
|
||||
model;
|
||||
@#if linear_mon_pol
|
||||
i = w*i(-1) + (1-w)*i_ss + w2*(pie-piestar);
|
||||
@#else
|
||||
i = i(-1)^w * i_ss^(1-w) * (pie/piestar)^w2;
|
||||
@#endif
|
||||
...
|
||||
end;
|
||||
\end{verbatim}
|
||||
\scriptsize
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Conditional inclusion directives (2/2)}
|
||||
|
||||
\begin{columns}[T]
|
||||
\column{0.47\linewidth}
|
||||
\begin{block}{Syntax 1}
|
||||
\verb+@#ifdef +\textit{variable\_name} \\
|
||||
\verb+ +\textit{body included if variable defined} \\
|
||||
\verb+@#endif+
|
||||
\end{block}
|
||||
|
||||
\column{0.47\linewidth}
|
||||
\begin{block}{Syntax 2}
|
||||
\verb+@#ifdef +\textit{variable\_name} \\
|
||||
\verb+ +\textit{body included if variable defined} \\
|
||||
\verb+@#else+ \\
|
||||
\verb+ +\textit{body included if variable not defined} \\
|
||||
\verb+@#endif+
|
||||
\end{block}
|
||||
\end{columns}
|
||||
|
||||
\bigskip
|
||||
|
||||
There is also \verb+@#ifndef+, which is the opposite of \verb+@#ifdef+
|
||||
(\textit{i.e.} it tests whether a variable is \emph{not} defined).
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Echo and error directives}
|
||||
|
||||
\begin{itemize}
|
||||
\item The echo directive will simply display a message on standard output
|
||||
\item The error directive will display the message and make Dynare stop (only makes sense inside a conditional inclusion directive)
|
||||
\end{itemize}
|
||||
|
||||
\begin{block}{Syntax}
|
||||
\verb+@#echo +\textit{string\_expr} \\
|
||||
\verb+@#error +\textit{string\_expr}
|
||||
\end{block}
|
||||
|
||||
\begin{block}{Examples}
|
||||
\begin{verbatim}
|
||||
@#echo "Information message."
|
||||
@#error "Error message!"
|
||||
\end{verbatim}
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Saving the macro-expanded MOD file}
|
||||
\begin{itemize}
|
||||
\item For \textbf{debugging or learning} purposes, it is possible to save the output of the macro-processor
|
||||
\item This output is a valid MOD file, obtained after processing the macro-commands of the original MOD file
|
||||
% \item Useful to understand how the macro-processor works
|
||||
\item Just add the \texttt{savemacro} option on the Dynare command line (after the name of your MOD file)
|
||||
\item If MOD file is \texttt{filename.mod}, then the macro-expanded version will be saved in \texttt{filename-macroexp.mod}
|
||||
\item You can specify the filename for the macro-expanded version with the syntax \texttt{savemacro=mymacroexp.mod}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
% \begin{frame}
|
||||
% \frametitle{Note on error messages}
|
||||
% \end{frame}
|
||||
|
||||
\section{Typical usages}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Modularization}
|
||||
\begin{itemize}
|
||||
\item The \verb+@#include+ directive can be used to split MOD files into several modular components
|
||||
\item Example setup:
|
||||
\begin{description}
|
||||
\item[\texttt{modeldesc.mod}:] contains variable declarations, model equations and shocks declarations
|
||||
\item[\texttt{simulate.mod}:] includes \texttt{modeldesc.mod}, calibrates parameters and runs stochastic simulations
|
||||
\item[\texttt{estim.mod}:] includes \texttt{modeldesc.mod}, declares priors on parameters and runs bayesian estimation
|
||||
\end{description}
|
||||
\item Dynare can be called on \texttt{simulate.mod} and \texttt{estim.mod}
|
||||
\item But it makes no sense to run it on \texttt{modeldesc.mod}
|
||||
\item Advantage: no need to manually copy/paste the whole model (at the beginning) or changes to the model (during development)
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Indexed sums or products}
|
||||
\framesubtitle{Example: moving average}
|
||||
\begin{columns}[T]
|
||||
\column{0.47\linewidth}
|
||||
\begin{block}{Before macro-processing}
|
||||
\begin{verbatim}
|
||||
@#define window = 2
|
||||
|
||||
var x MA_x;
|
||||
...
|
||||
model;
|
||||
...
|
||||
MA_x = 1/@{2*window+1}*(
|
||||
@#for i in -window:window
|
||||
+x(@{i})
|
||||
@#endfor
|
||||
);
|
||||
...
|
||||
end;
|
||||
\end{verbatim}
|
||||
\end{block}
|
||||
\column{0.47\linewidth}
|
||||
\begin{block}{After macro-processing}
|
||||
\begin{verbatim}
|
||||
var x MA_x;
|
||||
...
|
||||
model;
|
||||
...
|
||||
MA_x = 1/5*(
|
||||
+x(-2)
|
||||
+x(-1)
|
||||
+x(0)
|
||||
+x(1)
|
||||
+x(2)
|
||||
);
|
||||
...
|
||||
end;
|
||||
\end{verbatim}
|
||||
\end{block}
|
||||
\end{columns}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Multi-country models}
|
||||
\framesubtitle{MOD file skeleton example}
|
||||
\scriptsize
|
||||
\begin{verbatim}
|
||||
@#define countries = [ "US", "EA", "AS", "JP", "RC" ]
|
||||
@#define nth_co = "US"
|
||||
|
||||
@#for co in countries
|
||||
var Y_@{co} K_@{co} L_@{co} i_@{co} E_@{co} ...;
|
||||
parameters a_@{co} ...;
|
||||
varexo ...;
|
||||
@#endfor
|
||||
|
||||
model;
|
||||
@#for co in countries
|
||||
Y_@{co} = K_@{co}^a_@{co} * L_@{co}^(1-a_@{co});
|
||||
...
|
||||
@# if co != nth_co
|
||||
(1+i_@{co}) = (1+i_@{nth_co}) * E_@{co}(+1) / E_@{co}; // UIP relation
|
||||
@# else
|
||||
E_@{co} = 1;
|
||||
@# endif
|
||||
@#endfor
|
||||
end;
|
||||
\end{verbatim}
|
||||
\normalsize
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Endogeneizing parameters (1/4)}
|
||||
\begin{itemize}
|
||||
\item When doing the steady-state calibration of the model, it may be useful to consider a parameter as an endogenous (and vice-versa)
|
||||
\item Example:
|
||||
\begin{gather*}
|
||||
y = \left(\alpha^{\frac{1}{\xi}} \ell^{1-\frac{1}{\xi}} + (1-\alpha)^{\frac{1}{\xi}}k^{1-\frac{1}{\xi}}\right)^{\frac{\xi}{\xi - 1}} \\
|
||||
lab\_rat = \frac{w \ell}{p y}
|
||||
\end{gather*}
|
||||
\item In the model, $\alpha$ is a (share) parameter, and $lab\_rat$ is an endogenous variable
|
||||
\item We observe that:
|
||||
\begin{itemize}
|
||||
\item calibrating $\alpha$ is not straigthforward!
|
||||
\item on the contrary, we have real world data for $lab\_rat$
|
||||
\item it is clear that these two variables are economically linked
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Endogeneizing parameters (2/4)}
|
||||
\begin{itemize}
|
||||
\item Therefore, when computing the steady state:
|
||||
\begin{itemize}
|
||||
\item we make $\alpha$ an endogenous variable and $lab\_rat$ a parameter
|
||||
\item we impose an economically relevant value for $lab\_rat$
|
||||
\item the solution algorithm deduces the implied value for $\alpha$
|
||||
\end{itemize}
|
||||
\item We call this method ``variable flipping''
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Endogeneizing parameters (3/4)}
|
||||
\framesubtitle{Example implementation}
|
||||
\begin{itemize}
|
||||
\item File \texttt{modeqs.mod}:
|
||||
\begin{itemize}
|
||||
\item contains variable declarations and model equations
|
||||
\item For declaration of \texttt{alpha} and \texttt{lab\_rat}:
|
||||
\footnotesize
|
||||
\begin{verbatim}
|
||||
@#if steady
|
||||
var alpha;
|
||||
parameter lab_rat;
|
||||
@#else
|
||||
parameter alpha;
|
||||
var lab_rat;
|
||||
@#endif
|
||||
\end{verbatim}
|
||||
\normalsize
|
||||
\end{itemize}
|
||||
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{Endogeneizing parameters (4/4)}
|
||||
\framesubtitle{Example implementation}
|
||||
\begin{itemize}
|
||||
\item File \texttt{steadystate.mod}:
|
||||
\begin{itemize}
|
||||
\item begins with \verb+@#define steady = 1+
|
||||
\item then with \verb+@#include "modeqs.mod"+
|
||||
\item initializes parameters (including \texttt{lab\_rat}, excluding \texttt{alpha})
|
||||
\item computes steady state (using guess values for endogenous, including \texttt{alpha})
|
||||
\item saves values of parameters and endogenous at steady-state in a file, using the \texttt{save\_params\_and\_steady\_state} command
|
||||
\end{itemize}
|
||||
\item File \texttt{simulate.mod}:
|
||||
\begin{itemize}
|
||||
\item begins with \verb+@#define steady = 0+
|
||||
\item then with \verb+@#include "modeqs.mod"+
|
||||
\item loads values of parameters and endogenous at steady-state from file, using the \texttt{load\_params\_and\_steady\_state} command
|
||||
\item computes simulations
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{MATLAB/Octave loops vs macro-processor loops (1/3)}
|
||||
Suppose you have a model with a parameter $\rho$, and you want to make
|
||||
simulations for three values: $\rho = 0.8, 0.9, 1$. There are
|
||||
several ways of doing this:
|
||||
\begin{block}{With a MATLAB/Octave loop}
|
||||
\begin{verbatim}
|
||||
rhos = [ 0.8, 0.9, 1];
|
||||
for i = 1:length(rhos)
|
||||
rho = rhos(i);
|
||||
stoch_simul(order=1);
|
||||
end
|
||||
\end{verbatim}
|
||||
\end{block}
|
||||
\begin{itemize}
|
||||
\item The loop is not unrolled
|
||||
\item MATLAB/Octave manages the iterations
|
||||
\item Interesting when there are a lot of iterations
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{MATLAB/Octave loops vs macro-processor loops (2/3)}
|
||||
\begin{block}{With a macro-processor loop (case 1)}
|
||||
\begin{verbatim}
|
||||
rhos = [ 0.8, 0.9, 1];
|
||||
@#for i in 1:3
|
||||
rho = rhos(@{i});
|
||||
stoch_simul(order=1);
|
||||
@#endfor
|
||||
\end{verbatim}
|
||||
\end{block}
|
||||
\begin{itemize}
|
||||
\item Very similar to previous example
|
||||
\item Loop is unrolled
|
||||
\item Dynare macro-processor manages the loop index but not the data array (\texttt{rhos})
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile=singleslide]
|
||||
\frametitle{MATLAB/Octave loops vs macro-processor loops (3/3)}
|
||||
\begin{block}{With a macro-processor loop (case 2)}
|
||||
\begin{verbatim}
|
||||
@#for rho_val in [ "0.8", "0.9", "1"]
|
||||
rho = @{rho_val};
|
||||
stoch_simul(order=1);
|
||||
@#endfor
|
||||
\end{verbatim}
|
||||
\end{block}
|
||||
\begin{itemize}
|
||||
\item Advantage: shorter syntax, since list of values directly given in the loop construct
|
||||
\item Note that values are given as character strings (the macro-processor does not
|
||||
know floating point values)
|
||||
\item Inconvenient: can not reuse an array stored in a MATLAB/Octave variable
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
% \begin{frame}[fragile=singleslide]
|
||||
% \frametitle{Possible future developments}
|
||||
% \begin{itemize}
|
||||
% \item Find a nicer syntax for indexed sums/products
|
||||
% \item Implement other control structures: \texttt{elsif}, \texttt{switch/case}, \texttt{while/until} loops
|
||||
% \item Implement macro-functions (or templates), with a syntax like:
|
||||
% \small
|
||||
% \verb+@#define QUADRATIC_COST(x, x_ss, phi) = phi/2*(x/x_ss-1)^2+
|
||||
% \normalsize
|
||||
% \end{itemize}
|
||||
% \end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\begin{center}
|
||||
\vfill {\LARGE Thanks for your attention!} \vfill
|
||||
{\LARGE Questions?}
|
||||
\vfill
|
||||
\end{center}
|
||||
\vfill
|
||||
\begin{columns}[T]
|
||||
\column{0.2\textwidth}
|
||||
\column{0.09\textwidth}
|
||||
|
||||
\ccbysa
|
||||
\column{0.71\textwidth}
|
||||
\tiny
|
||||
Copyright © 2008--2017 Dynare Team \\
|
||||
Licence: \href{http://creativecommons.org/licenses/by-sa/4.0/}{Creative
|
||||
Commons Attribution-ShareAlike 4.0}
|
||||
\end{columns}
|
||||
\end{frame}
|
||||
|
||||
|
||||
\end{document}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,346 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="862.10712"
|
||||
height="382.82141"
|
||||
id="svg5540"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.45.1"
|
||||
version="1.0"
|
||||
sodipodi:docbase="K:\Commun\Villemot\Macroprocessor"
|
||||
sodipodi:docname="new-design.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
inkscape:export-filename="K:\Commun\Villemot\Macroprocessor\new-design.png"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-ydpi="90">
|
||||
<defs
|
||||
id="defs5542">
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path3243"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.7"
|
||||
inkscape:cx="488.94636"
|
||||
inkscape:cy="380.52134"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
width="1052.3622px"
|
||||
height="744.09448px"
|
||||
inkscape:window-width="1024"
|
||||
inkscape:window-height="712"
|
||||
inkscape:window-x="-4"
|
||||
inkscape:window-y="-4" />
|
||||
<metadata
|
||||
id="metadata5545">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-78.642861,-39.058769)">
|
||||
<g
|
||||
id="g4418"
|
||||
transform="translate(467.50002,289.64286)">
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="text4420"
|
||||
y="56.6479"
|
||||
x="361.42862"
|
||||
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
|
||||
xml:space="preserve"><tspan
|
||||
id="tspan4422"
|
||||
y="56.6479"
|
||||
x="361.42862"
|
||||
sodipodi:role="line">Matlab files</tspan><tspan
|
||||
id="tspan4424"
|
||||
y="81.6479"
|
||||
x="361.42862"
|
||||
sodipodi:role="line">representing</tspan><tspan
|
||||
id="tspan4426"
|
||||
y="106.6479"
|
||||
x="361.42862"
|
||||
sodipodi:role="line">the model</tspan></text>
|
||||
<path
|
||||
transform="matrix(1.0528522,0,0,1.0682674,-22.862484,-9.0197689)"
|
||||
d="M 431.42857 79.808769 A 66.428574 51.42857 0 1 1 298.57143,79.808769 A 66.428574 51.42857 0 1 1 431.42857 79.808769 z"
|
||||
sodipodi:ry="51.42857"
|
||||
sodipodi:rx="66.428574"
|
||||
sodipodi:cy="79.808769"
|
||||
sodipodi:cx="365"
|
||||
id="path4428"
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
sodipodi:type="arc" />
|
||||
</g>
|
||||
<g
|
||||
id="g4430"
|
||||
transform="translate(-555.35711,282.49999)">
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="text4432"
|
||||
y="65.21933"
|
||||
x="691.42859"
|
||||
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
|
||||
xml:space="preserve"><tspan
|
||||
y="65.21933"
|
||||
x="691.42859"
|
||||
id="tspan4434"
|
||||
sodipodi:role="line">Output:</tspan><tspan
|
||||
id="tspan4436"
|
||||
y="90.21933"
|
||||
x="691.42859"
|
||||
sodipodi:role="line">Results,</tspan><tspan
|
||||
id="tspan4438"
|
||||
y="115.21933"
|
||||
x="691.42859"
|
||||
sodipodi:role="line">Graphics</tspan></text>
|
||||
<path
|
||||
d="M 747.14283 85.523056 A 54.285713 51.42857 0 1 1 638.5714,85.523056 A 54.285713 51.42857 0 1 1 747.14283 85.523056 z"
|
||||
sodipodi:ry="51.42857"
|
||||
sodipodi:rx="54.285713"
|
||||
sodipodi:cy="85.523056"
|
||||
sodipodi:cx="692.85712"
|
||||
id="path4440"
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
sodipodi:type="arc" />
|
||||
</g>
|
||||
<g
|
||||
id="g4452"
|
||||
transform="translate(-25.357118,291.07143)">
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="text4454"
|
||||
y="68.076462"
|
||||
x="525.71436"
|
||||
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
|
||||
xml:space="preserve"><tspan
|
||||
y="68.076462"
|
||||
x="525.71436"
|
||||
id="tspan4456"
|
||||
sodipodi:role="line">Dynare</tspan><tspan
|
||||
id="tspan4458"
|
||||
y="93.076462"
|
||||
x="525.71436"
|
||||
sodipodi:role="line">Matlab routines</tspan></text>
|
||||
<rect
|
||||
y="36.951626"
|
||||
x="448.57144"
|
||||
height="75.714287"
|
||||
width="152.85715"
|
||||
id="rect4460"
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
</g>
|
||||
<path
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 757.92859,365.8802 L 577.07147,365.8802"
|
||||
id="path4466"
|
||||
inkscape:connector-type="polyline"
|
||||
inkscape:connection-end="#g4452"
|
||||
inkscape:connection-start="#g4418" />
|
||||
<path
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 422.21432,366.33835 L 192.78572,367.69591"
|
||||
id="path4468"
|
||||
inkscape:connector-type="polyline"
|
||||
inkscape:connection-start="#g4452"
|
||||
inkscape:connection-end="#g4430" />
|
||||
<g
|
||||
id="g6668">
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="text4470"
|
||||
y="117.30877"
|
||||
x="143.92857"
|
||||
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
|
||||
xml:space="preserve"><tspan
|
||||
y="117.30877"
|
||||
x="143.92857"
|
||||
id="tspan4472"
|
||||
sodipodi:role="line">MOD file</tspan><tspan
|
||||
id="tspan4474"
|
||||
y="142.30877"
|
||||
x="143.92857"
|
||||
sodipodi:role="line">with macro</tspan><tspan
|
||||
id="tspan4482"
|
||||
y="167.30877"
|
||||
x="143.92857"
|
||||
sodipodi:role="line">commands</tspan></text>
|
||||
<path
|
||||
transform="matrix(1.0725676,0,0,0.999374,99.5973,-252.25554)"
|
||||
d="M 98.57143 390.52304 A 58.57143 56.42857 0 1 1 -18.57143,390.52304 A 58.57143 56.42857 0 1 1 98.57143 390.52304 z"
|
||||
sodipodi:ry="56.42857"
|
||||
sodipodi:rx="58.57143"
|
||||
sodipodi:cy="390.52304"
|
||||
sodipodi:cx="40"
|
||||
id="path4504"
|
||||
style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
sodipodi:type="arc" />
|
||||
</g>
|
||||
<g
|
||||
id="g5516"
|
||||
transform="translate(316.78572,-245.35715)">
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="text4476"
|
||||
y="368.38019"
|
||||
x="307.14285"
|
||||
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
|
||||
xml:space="preserve"><tspan
|
||||
y="368.38019"
|
||||
x="307.14285"
|
||||
id="tspan4478"
|
||||
sodipodi:role="line">MOD file</tspan><tspan
|
||||
id="tspan4480"
|
||||
y="393.38019"
|
||||
x="307.14285"
|
||||
sodipodi:role="line">without macro</tspan><tspan
|
||||
id="tspan4484"
|
||||
y="418.38019"
|
||||
x="307.14285"
|
||||
sodipodi:role="line">commands</tspan></text>
|
||||
<path
|
||||
transform="translate(-8.5714286,-4.2857143)"
|
||||
d="M 389.99999 391.95163 A 72.85714 65 0 1 1 244.28571,391.95163 A 72.85714 65 0 1 1 389.99999 391.95163 z"
|
||||
sodipodi:ry="65"
|
||||
sodipodi:rx="72.85714"
|
||||
sodipodi:cy="391.95163"
|
||||
sodipodi:cx="317.14285"
|
||||
id="path5475"
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
sodipodi:type="arc" />
|
||||
</g>
|
||||
<g
|
||||
id="g5510"
|
||||
transform="translate(243.92858,-236.78572)">
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="text4486"
|
||||
y="372.66592"
|
||||
x="165.71428"
|
||||
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
|
||||
xml:space="preserve"><tspan
|
||||
id="tspan4490"
|
||||
y="372.66592"
|
||||
x="165.71428"
|
||||
sodipodi:role="line">Macro</tspan><tspan
|
||||
id="tspan4492"
|
||||
y="397.66592"
|
||||
x="165.71428"
|
||||
sodipodi:role="line">Processor</tspan></text>
|
||||
<rect
|
||||
y="339.80878"
|
||||
x="110"
|
||||
height="72.85714"
|
||||
width="115.71429"
|
||||
id="rect5477"
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
</g>
|
||||
<g
|
||||
id="g5523"
|
||||
transform="translate(372.5,-249.64286)">
|
||||
<text
|
||||
sodipodi:linespacing="125%"
|
||||
id="text4494"
|
||||
y="368.38019"
|
||||
x="455.71426"
|
||||
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
|
||||
xml:space="preserve"><tspan
|
||||
y="368.38019"
|
||||
x="455.71426"
|
||||
id="tspan4496"
|
||||
sodipodi:role="line">Parser,</tspan><tspan
|
||||
id="tspan4498"
|
||||
y="393.38019"
|
||||
x="455.71426"
|
||||
sodipodi:role="line">Analytical</tspan><tspan
|
||||
id="tspan4500"
|
||||
y="418.38019"
|
||||
x="455.71426"
|
||||
sodipodi:role="line">derivator...</tspan></text>
|
||||
<rect
|
||||
y="339.80878"
|
||||
x="395.71429"
|
||||
height="94.285713"
|
||||
width="120"
|
||||
id="rect5479"
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||
</g>
|
||||
<path
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 206.35715,138.3618 L 352.92858,139.13938"
|
||||
id="path5532"
|
||||
inkscape:connector-type="polyline"
|
||||
inkscape:connection-end="#g5510"
|
||||
inkscape:connection-start="#g6668" />
|
||||
<path
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 470.64287,140.23901 L 551.5,141.32071"
|
||||
id="path5534"
|
||||
inkscape:connector-type="polyline"
|
||||
inkscape:connection-start="#g5510"
|
||||
inkscape:connection-end="#g5516" />
|
||||
<path
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 699.21428,140.48835 L 767.21429,138.81229"
|
||||
id="path5536"
|
||||
inkscape:connector-type="polyline"
|
||||
inkscape:connection-start="#g5516"
|
||||
inkscape:connection-end="#g5523" />
|
||||
<path
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:url(#Arrow1Lend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 828.36474,185.45163 L 828.75359,309.8802"
|
||||
id="path5538"
|
||||
inkscape:connector-type="polyline"
|
||||
inkscape:connection-end="#g4418"
|
||||
inkscape:connection-start="#g5523" />
|
||||
<rect
|
||||
style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:1.5, 4.5;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
id="rect5596"
|
||||
width="634.28571"
|
||||
height="201.42857"
|
||||
x="305.71429"
|
||||
y="39.808769" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
|
||||
x="404.28574"
|
||||
y="232.66591"
|
||||
id="text6567"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan6569"
|
||||
x="404.28574"
|
||||
y="232.66591">Dynare preprocessor</tspan></text>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 17 KiB |
|
@ -1,16 +0,0 @@
|
|||
if HAVE_PDFLATEX
|
||||
if HAVE_BEAMER
|
||||
pdf-local: preprocessor.pdf
|
||||
endif
|
||||
endif
|
||||
|
||||
SRC = preprocessor.tex expr.png expr-sharing.png matrices.png overview.png json-preprocessor.png
|
||||
|
||||
EXTRA_DIST = $(SRC)
|
||||
|
||||
preprocessor.pdf: $(SRC)
|
||||
$(PDFLATEX) preprocessor
|
||||
$(PDFLATEX) preprocessor
|
||||
|
||||
clean-local:
|
||||
rm -f *.pdf *.toc *.aux *.log *.nav *.snm *.vrb *.out *~
|
Binary file not shown.
Before Width: | Height: | Size: 11 KiB |
|
@ -1 +0,0 @@
|
|||
<mxfile userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0" version="6.0.1.9" editor="www.draw.io" type="device"><diagram name="Page-1">7VlJc5swFP41HNsB4QUfE2fpoZ3JTA5NjirIoEZGVMg2zq+vhMSOWhI7uPWYgy19T+v3Fp6E5S7X2T2DSfSNBohYwA4yy72xAJiDqfiVwF4BM9tVQMhwoCCnAh7xK9KgrdENDlDaaMgpJRwnTdCncYx83sAgY3TXbLaipDlrAkPUAR59SLrodxzwSKHe1K7wLwiHUTGzY2vJD+i/hIxuYj2fBdxV/ijxGhZj6fZpBAO6q0HureUuGaVcldbZEhFJbUGb6ndnkJbrZijmQzp4qsMWkg0qVjwjout1gLeSdcw1J7NfG7mo6wdJHbDdRQWJUqj/q67vgRKG2tCKio0Invi+tQ4p+JTmlnMl12MnmXlFaQLjErsFludZi3khFOw05BWsJu/APcsUaM9+DkFBY9dAqE0Yv6hc7yLM0WMCfSnZCfcTWMTXRNQcUYRpojxihTMUyL1zRl/QkhLK8qFcO38khZiQGn6XPwIPGQywMKBCFtMYlWuq25Y2ty1iHGU1SNvaPaJrxNleNNFSd67tXseFia7uKicrfCyq+VeBQe3WYTlwZdqioK3b4BqzLqeBcHpd1XvMXVfSdiMJ8uka+7pcoxhlmD9pWJafCzwWa3qqV551q9LNZeUn4nyvYx7ccCogynhEQxpD8pXSRI9gVpxREyndMF/vbqHjJmQhKuOUwuTG/6guhgjkeNuMhgexPz86+46JfftfZR+civ2FMcofGl7N0fIs4xfwmvHLcUYMYN7xA9jnqdGJlOjUblTw2/Aj92RRzDY60gGpC5j0+Rah4RszkbP0uMnshB7njKdu56JsEV5BS9mLEZUNxlP260XZ4iwwOaGy3Y9Qdn+StL8ouyeMj6nsSY+y2yzHwZW8NxI1n8A0lVlTndxG7mMm9u0nw0FZkNdNghYDc6CB/A5OlfQMDxTnPmEI3K7T0pvaje5Vv49qD9S6IACz1kCKg85AuQ2U2x5mFtPRzWL4kfW9ZlHwfrGLd9tFyfTZXFW0jOHvh66ey4tFvxkd/YjV54T/9zXdMdivfRv44BOu+aro6FlwIqg+j9Sokwf1KNmYGpWp0Ph34kV0HkPb4KJr+Xoe7TZDVKvPiOo1WH2qdW9/Aw==</diagram></mxfile>
|
Binary file not shown.
Before Width: | Height: | Size: 9.2 KiB |
|
@ -1 +0,0 @@
|
|||
<mxfile userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0" version="6.0.1.9" editor="www.draw.io" type="device"><diagram name="Page-1">7VhLc5swEP41HNsBKXbwMXGS9tDOZCaHJkcVZFAjIypkG+fXd4XEGzJOnJI2Yw629K0eu98+EHLwcp1/kSSNv4uQcge5Ye7gKwehczSDXw3sDTB3sQEiyUIDeTVwx56oBV2LblhIs9ZAJQRXLG2DgUgSGqgWRqQUu/awleDtXVMS0R5wFxDeR3+wUMUG9WdujX+lLIrLnT3XSn6S4DGSYpPY/RyEV8VjxGtSrmXHZzEJxa4B4WsHL6UQyrTW+ZJyTW1Jm5l3MyKt9JY0UYdM8M2ELeEbWmo85zD1MmRbzTpTlpP5741W6vJWU4dcvKghaEX2v576GiiVtAutBBgCPKl9Rw8t+JQVkXOh9XHTfFyjLCVJhV0jx/edxXkpBHZa8ho2m/fgATUBHbDnGBS1rEbgNgh+6FzuYqboXUoCLdlB+gEWqzWHngdNkqUmI1Ysp6G2XUnxSJeCC1kshd3i0RQyzhv4TfEAHkkSMgigUpaIhFY6balUNB8NN68KYqgNVKypknsYYiegMxv3ti5g293VSVbmWNzIrxIjNq2jauE6tKFho3skNeZ9TkNIetu1Nhapq2m70gQFYs0C225QTHOm7i2s2w8lnoBO983Ogx1Vpbnu/KJK7W3NIxslABJSxSISCeHfhEjtCuOOM5Zo9Z/3A1grNjKwoxa2kBIZ0apwDbtLUk4U27aXP4r98zdn3xtj3/1v2EcTsb8YrfLHltfxavkh65c3a9ev6r0/RQHz376AfZ6NJpER/XNpVJ4QW3mEp6pi7mgiHXF0QWdDucVF9MKTyIfMOIzfMeO86dztnZwN76mOr/0JfY2m8/XTydeoLqbv4Wz8N5w9fEban5w9UMWndPbZgLO7LCfhhb42gl7ASZbpQ1OT3NbRZ5zYl38Yvu4Q5PfPQIth/g/k9+CTkt3hVrAiJ4brNnY7bjO620nN26jOOl7neqDnf2Nxb6EiBCqrD4uK2eRRcfgH65tFhec6p7B4JiygW9+1muH1fTa+/gM=</diagram></mxfile>
|
Binary file not shown.
Before Width: | Height: | Size: 51 KiB |
|
@ -1 +0,0 @@
|
|||
<mxfile userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0" version="6.0.3.0" editor="www.draw.io" type="device"><diagram name="Page-1">7Vxtc5s4EP41/tgMCPPij7ET96bTXDKTm2n7UcaKTYORR8iJc7/+BEgYJNnGiQw4vUxnCosEaPfZZ1cr4YEzWW2/Erhe3uE5igfAmm8Hzs0AANsCFvsvk7wVEm/kFoIFiea80U7wGP2LRE8u3URzlNYaUoxjGq3rwhAnCQppTQYJwa/1Zk84rj91DRdIETyGMFalP6I5XRbSwLV28r9QtFiKJ9sWvzKD4fOC4E3CnzcAzlP+V1xeQXEv3j5dwjl+rYic24EzIRjT4mi1naA4061QW9Fvuudq+d4EJbRJBxAA/iL0TQwezZku+GmCE/bfOB8RyvrY7CzEqyhkxxY7XtJVzMVoG9GfleNfWZMrNztLKHn7yXvkJ7trpQaya78RpW8cDnBDMRNhQpd4gRMYf8d4zW+fUoKf0QTHmOTv7Fj5H7uiKoDrJMUbEvIR8jFTSBaItwK+Uwiz0Vc6crV9RXiF2HuzBgTFkEYvdaRADrhF2W6ndHbA9b7HBsUtXmC84Te9WuF5BtuI2QB4MXvF8YywowUtR1i1Vxwzv8jM9LqMKHpcw3ycr8w16wZStDad2hN7ckhrL4hQtD2oD351yHtwj3c4wF937mMPuWxZcR3hUh9RYKAocAVDgr+g7RrmsAXWJWrU863OVApcrwkvHGEC7v2cC+waE+yI4Re/gWEmqHNWM14QJFBjBtc1zQx512tC4FulwRpHCU0rd37IBBUHA3U4iJgz3dPetuxD7dlB8Qb63o5bf5rv1odTqI13knBVqqQR1OzhYajtzH67k1asayQKNYVbIxjZvooiO+gsvASjVkP82R1bq8h3GQUEXhee7AwlT/b9g54stxdp8r72ABxsX/f893isrwTcyRKFz0z0ANO0QYA9Nax642t7yl5/zAJ4XJHz3NpIuAUWqFvF9dV4CzTxdmgk3p6Yh1ufIQ8XpFgjylFnRDmyTrPBJyVKjVE6IkrXOo0o5fadE6U6M/mHwCR9wmR12WTpeJJl2iVL508ky5HGL63uyLLdwlFfyVJnlG7I0pNd8ghZyu07J8uRQpYTvFpvaJQsLpssXSDNxNsly6BNR7X7QZZCm1W/9Ixnlu/y08A5zU/l9sCzjfodcFutD/QYIMB4jaYTgDicSY0BxGt1XtRngPifAyB80c8YQCwlcv8gLAwz0f2Gsgh+oXHbC7qc5KhFtjtIYzhjHe9DChm4wPTbJo7goFjXapId9XRhS6fXs61sqXNy1mec/xMEcOkKBaNhewr11Lx9FiUwf78LV6PjtYnLofEoa9WiLGinqjGd8jA7h+myfNPs5AFSikiSS4DVeDktcDWRuBeBWCyEcLzwhWJTYVWMu+JYpSsJTxIhwcoey8ItDwz8VISH4uzq6kr0Z4LZzhmPuicDxjo7DDez9/homXhJsXqa/zH5gsB5xCAgrnGsC/FNRFBII5zkl0jmiuO0QObIjOdLhhwCNSAF9pkCvS2Wfip2XjPUZkXiL+kahdET8/HMiLKdCFoTlLJRw1w5wMJPg8vc6lJmACIjGLYYwJgZNY4m6ymZX2cbCzMviGGaZrRbU0+VO2vMt58g91U338GXtRU0Aaij7FjRrntAuaeRqGbjyh7vOrKXRF3eke4zku5TKEG5z+kbbaTnWLXp1cenS0BH7G3gTbstyzASa9VxgcRa6Ob1q77A064XZz2v2U6no7ARZZhj8HxXyc5XAfP5d+26mkTQNl6SaZ6wt1pY7+sKmNYqHS2B2XLB5khhTG7f9RJYqctKZHiAJM1XwC6yhCbtCm+3giYCTVWbmsR6ghM2oLRIoZnjnJpC91Hvjoi80qJRTfG6oGpG8Wrt8mMJzn7S0pc6DjFn893gnia5br4bvJ3sRd6n7ViSAZumL7YtcVsgvYuh7Freli6eY261Si3wGgaf43hec/D5Stw2VRgTldcqPoN+wdOTduSV+8ZOzq4leA5H0o0MwdMTk7NzrbZryuWfFJ5As5G0Z/CUtzG6cvjrOzyNr/WLJZA/AJ6aD0L+h6dheJreaeCr7KlL6b9HM5KvQB5f2niNVjHMZ+oVBFczcz6P12X5h+tux6sbJ+Tz8swTqEuTQLdCIVaCP1bpUEnh5i1h42Gyh2wVAocoTdm4gXW7ReGGwlmjmVMbyk8ZtCmviwDnPNZwVVtYGlsErgFbiE9Udba4yz57rlijD1PXHXiaFw2Of/d8tpqBmPX8WZVV3XfPHX6wegDiEt08Lpl43jvGV0gnhjMUj8sfB5GeZIKSpMqnrTqNH2icpmz4sY9BTvwgp8nelUO/HQDOVAsvc9PGSebJ5fLA07ia25preYprfXu8/3vQ/n4BBdoa1e1Fuy1Xvc64X4Cd7n6Pp8hZdz965Nz+Bw==</diagram></mxfile>
|
Binary file not shown.
Before Width: | Height: | Size: 28 KiB |
|
@ -1 +0,0 @@
|
|||
<mxfile userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0" version="6.0.1.9" editor="www.draw.io" type="device"><diagram name="Page-1">5ZhNj5swEIZ/DXeMycdem/3oYbetlErdPbowMe4aJnLMQvrra2BIQr2pKnXFqoRDYr8e2+PHk1coAV/l9Z0R2+wBU9BBFKZ1wK+DKFouQvfZCPtOWES8E6RRaSexo7BWP4FEmidLlcJuEGgRtVXboZhgUUBiB5owBqth2Ab1cNetkOAJ60RoX/2mUpvRsWbhUf8ISmb9ziykke8ieZYGy4L2CyK+aZ9uOBf9WhS/y0SK1YnEbwK+Moi2a+X1CnSDtsfWzbs9M3rI20Bh/2bCFaVh9/3RIXUkqFtg4b4+tOeBZkboegnmKqF2ZnPtmsw1oVb2keSm/dTrhTX7x9POE0Udzt50foC1eyoEUVp0EhqbocRC6HvELa2wswafYYUaTZsvD9vHjXQnadI/y4KkHZYmoaiIqksYCRTFD/fgyhswB5ezCzGghVUvw9UFFZo8xB1huwbxPnNZ4ZvDZ+fgh/8L/Hgk+LT1i9AlLfogrFG1fyVaO9dpbqLKlIX1VrTZV873hndwHs5GaX2i37aP06URqXJ8+jG6ccoMjIX6zzR9TjQh6g2Y/Le3m+poZmxJWnZiZL3B/QtZ7pG9xwqMk74aJQpZatF0poT7akibsRFxM+YzvCwLj30XmY1l4dGlW/gr8OcjwY89o/mEJhd6YuYSz97TXfilF/jML/DlWO4SX7q1vwJ/MRL8mecu633erOLwTstgfn99GfVtce5h/nworIlxnrN35LzwOH/BnWp/MVF4DRtVOI4TA86iIXAejwh86b+dgBTTBh7PxwPuuse/ydqxk78i+c0v</diagram></mxfile>
|
Binary file not shown.
Before Width: | Height: | Size: 54 KiB |
|
@ -1 +0,0 @@
|
|||
<mxfile userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0" version="6.0.2.15" editor="www.draw.io" type="device"><diagram name="Page-1">7Vtbc9o4FP41PG7HkrGBx0JK9yGZZoadafuo2AJ7a1seWQTor98jW/JNpCWNsYFsJjORjo9uR5/OTcrIXsT7z5ykwQPzaTTClr8f2XcjjJGFLfgjKYeC4rqzgrDhoa+YKsIq/El1S0Xdhj7NGoyCsUiEaZPosSShnmjQCOds12Rbs6g5ako21CCsPBKZ1K+hL4KCOnWsiv43DTeBHhlZ6ssT8X5sONsmarwRttf5T/E5JrovxZ8FxGe7Gsn+NLIXnDFRlOL9gkZStlpsRbvlC1/LeXOaiFMauE7R4plEW7X2u0MCzYH2yGnKmUezjPERdiPocP4kSxtZUvMXBy2zbBfGEUmgNg9EHAERQXHNErFSTBbUvSCM/HtyYFs5v0yAvHRtHjAe/gR+ohvDZy4UOrArewujaMEimI99l7BirLLRSnamhuE0g2aPWg6oJN2TTOipsCgiaRY+5ZOTLDHhmzCZMyFYrJj0qpbmyD7JAuqXU+XsB9UcsO1W/lMKqr4lapeeKRd0XyOpLfpMWUwFPwCL/jpVcDk0j8muwuZYswQ1XNpInwl1HjZl1xUmoKBgcRwiU2xsNfXhtKiqEkaO+VIaHotDT0mwBga6D8W3Wvm7ZPngyFoCs/qmWuSV6lt5RuS3f6kQBwUJshUMSIyLgG1YQqJ7xtI/34+MbbmnVqjWDPjbUMU1sQuaXPwvN43TiIjwualK3rID2DijH2LmS70Wwhb8/mRCb6A45S7tglDQVUryZe5Adzf3xxDacokWaNENiO0Whh0TxGh8BMSa700YNiQYE4+zv+g+JTlssXUDInWc/iQ6cTvXCkoTKL2AGlqhUhLftWIeQCugI2oBOUOpBWTqBTB4WZhsTgDwa2Hrzj+i5bJlgivvphs4O008u0c0BD6C53EXeJ68Rzw7R/A8GQzPpi8aJoJyWHI+XAoeHKwGBmWJiXC27lGJW9Zy2ZVzZ49bhhH3aBgn0/cI+8kR2E8Hg/3EgP0ioBDJQARGsuxGdDma9anMnc5Rffkhi0ZwI2ZBXaM6b/qRc3KoMaQMFHVW6/lREiowjGdNMOBpKyvxG/6p09r9YgIVFsqVnHbizHDgH06SbM14fFunrlcXSmcg3pctmZmnDo8HsyUz05awON2KPCi4ZmQ7uGVP7D6R/R7tiRZmHdk6jT+wPXGnr7MnbX4069agTLtPhlwnPnDnXvQw+MAd46P75MKV4qPz5MIg+HCtTuGhJVWz2l85mGAgfdkKsN43YrP79UaRIaPb90a159k4c1bXZ+7ke6uxgetXJPTIGlhH8o5fOrA50ynO62Uk9RzU9jh6TOphM6P0QEREnqDhF0+QZ6lZZI70vPLs8qZrYjXlafd41XXk9hDazPNfa1WcPmwtr1qe5QOWPgTqmlHqPExIPr8rF+Okz9z97B1aOJ3RbOTuO49KT94CjZg3WTihk48v8F2JjTvm3Z3tQYd9Zuxbv8A+Ggr7ton9ywi4y71vZedeCqhQW2/a3UZU2tv6Hx7DqUbbUI3ly9IH+fjqNW9LLzG6xW0MH3t+da7odtZ9dHv5GSUN5obtx0MBfGp6sbC+4qIFCpTIu8T8Vcpgbw27tPaodSd7xseGUK1ewBfav/o3A/vTfw==</diagram></mxfile>
|
|
@ -1,820 +0,0 @@
|
|||
\documentclass{beamer}
|
||||
%\documentclass[draft]{beamer}
|
||||
%\documentclass[handout]{beamer}
|
||||
|
||||
|
||||
\mode<handout>
|
||||
{
|
||||
\usepackage{pgfpages}
|
||||
\pgfpagesuselayout{4 on 1}[a4paper,border shrink=3mm,landscape]
|
||||
\usetheme{Madrid}
|
||||
\usecolortheme{seagull}
|
||||
}
|
||||
|
||||
\mode<beamer>
|
||||
{
|
||||
\usetheme{Madrid}
|
||||
\setbeamercovered{transparent}
|
||||
}
|
||||
|
||||
|
||||
\usepackage[english]{babel}
|
||||
\usepackage[utf8]{inputenc}
|
||||
|
||||
\usepackage{times}
|
||||
\usepackage[copyright]{ccicons}
|
||||
|
||||
\title{The Dynare Preprocessor}
|
||||
|
||||
\author[S. Villemot, H.Bastani]{Sébastien Villemot \and Houtan Bastani}
|
||||
|
||||
\institute{CEPREMAP}
|
||||
|
||||
\date{1 February 2017}
|
||||
|
||||
\AtBeginSection[]
|
||||
{
|
||||
\begin{frame}{Outline}
|
||||
\tableofcontents[currentsection]
|
||||
\end{frame}
|
||||
}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\begin{frame}
|
||||
\titlepage
|
||||
|
||||
\begin{columns}[T]
|
||||
\column{0.2\textwidth}
|
||||
\column{0.09\textwidth}
|
||||
|
||||
\ccbysa
|
||||
\column{0.71\textwidth}
|
||||
\tiny
|
||||
Copyright © 2007--2017 Dynare Team \\
|
||||
Licence: \href{http://creativecommons.org/licenses/by-sa/4.0/}{Creative
|
||||
Commons Attribution-ShareAlike 4.0}
|
||||
\end{columns}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Overview}
|
||||
\begin{center}
|
||||
\includegraphics[width=11cm]{overview.png}
|
||||
\end{center}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Outline}
|
||||
\tableofcontents
|
||||
\end{frame}
|
||||
|
||||
\section{Invoking the preprocessor}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Calling Dynare}
|
||||
\begin{itemize}
|
||||
\item Dynare is called from the host language platform with the syntax \texttt{dynare <<filename>>.mod}
|
||||
\item This call can be followed by certain options:
|
||||
\begin{itemize}
|
||||
\item Some of these options impact host language platform functionality, \textit{e.g.} \texttt{nograph} prevents graphs from being displayed in Matlab
|
||||
\item Some cause differences in the output created by default, \textit{e.g.} \texttt{notmpterms} prevents temporary terms from being written to the static/dynamic files
|
||||
\item While others impact the functionality of the macroprocessor or the preprocessor, \textit{e.g.} \texttt{nostrict} shuts off certain checks that the preprocessor does by defalut
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\section{Parsing}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Parsing overview}
|
||||
\begin{itemize}
|
||||
\item Parsing is the action of transforming an input text (a \texttt{mod} file in our case) into a data structure suitable for computation
|
||||
\item The parser consists of three components:
|
||||
\begin{itemize}
|
||||
\item the \alert{lexical analyzer}, which recognizes the ``words'' of the \texttt{mod} file (analog to the \textit{vocabulary} of a language)
|
||||
\item the \alert{syntax analyzer}, which recognizes the ``sentences'' of the \texttt{mod} file (analog to the \textit{grammar} of a language)
|
||||
\item the \alert{parsing driver}, which coordinates the whole process and constructs the data structure using the results of the lexical and syntax analyses
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Lexical analysis}
|
||||
\begin{itemize}
|
||||
\item The lexical analyzer recognizes the ``words'' (or \alert{lexemes}) of the language
|
||||
\item Defined in \texttt{DynareFlex.ll}, it is transformed into C++ source code by the program \texttt{flex}
|
||||
\item This file details the list of known lexemes (described by regular expressions) and the associated \alert{token} for each of them
|
||||
\item For punctuation (semicolon, parentheses, \ldots), operators (+, -, \ldots) or fixed keywords (\textit{e.g.} \texttt{model}, \texttt{varexo}, \ldots), the token is simply an integer uniquely identifying the lexeme
|
||||
\item For variable names or numbers, the token also contains the associated string for further processing
|
||||
%\item \textit{Note:} the list of tokens can be found at the beginning of \texttt{DynareBison.yy}
|
||||
\item When invoked, the lexical analyzer reads the next characters of the input, tries to recognize a lexeme, and either produces an error or returns the associated token
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Lexical analysis}
|
||||
\framesubtitle{An example}
|
||||
\begin{itemize}
|
||||
\item Suppose the \texttt{mod} file contains the following:
|
||||
\begin{verbatim}
|
||||
model;
|
||||
x = log(3.5);
|
||||
end;
|
||||
\end{verbatim}
|
||||
\item Before lexical analysis, it is only a sequence of characters
|
||||
\item The lexical analysis produces the following stream of tokens:
|
||||
|
||||
\begin{footnotesize}
|
||||
\begin{verbatim}
|
||||
MODEL
|
||||
SEMICOLON
|
||||
NAME "x"
|
||||
EQUAL
|
||||
LOG
|
||||
LEFT_PARENTHESIS
|
||||
FLOAT_NUMBER "3.5"
|
||||
RIGHT_PARENTHESIS
|
||||
SEMICOLON
|
||||
END
|
||||
SEMICOLON
|
||||
\end{verbatim}
|
||||
\end{footnotesize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Syntax analysis}
|
||||
\framesubtitle{In Dynare}
|
||||
\begin{itemize}
|
||||
\item The \texttt{mod} file grammar is described in \texttt{DynareBison.yy}, which is transformed into C++ source code by the program \texttt{bison}
|
||||
\item The grammar tells a story which looks like:
|
||||
\begin{itemize}
|
||||
\item A \texttt{mod} file is a list of statements
|
||||
\item A statement can be a \texttt{var} statement, a \texttt{varexo} statement, a \texttt{model} block, an \texttt{initval} block, \ldots
|
||||
\item A \texttt{var} statement begins with the token \texttt{VAR}, then a list of \texttt{NAME}s, then a semicolon
|
||||
\item A \texttt{model} block begins with the token \texttt{MODEL}, then a semicolon, then a list of equations separated by semicolons, then an \texttt{END} token
|
||||
\item An equation can be either an expression, or an expression followed by an \texttt{EQUAL} token and another expression
|
||||
\item An expression can be a \texttt{NAME}, or a \texttt{FLOAT\_NUMBER}, or an expression followed by a \texttt{PLUS} and another expression, \ldots
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Syntax analysis}
|
||||
Using the list of tokens produced by lexical analysis, the syntax analyzer determines which ``sentences'' are valid in the language, according to a \alert{grammar} composed of \alert{rules}.
|
||||
\begin{block}{A grammar for lists of additive and multiplicative expressions}
|
||||
\begin{footnotesize}
|
||||
\begin{verbatim}
|
||||
%start expression_list;
|
||||
|
||||
expression_list := expression SEMICOLON
|
||||
| expression_list expression SEMICOLON;
|
||||
|
||||
expression := expression PLUS expression
|
||||
| expression TIMES expression
|
||||
| LEFT_PAREN expression RIGHT_PAREN
|
||||
| INT_NUMBER;
|
||||
\end{verbatim}
|
||||
\end{footnotesize}
|
||||
\end{block}
|
||||
\begin{itemize}
|
||||
\item \texttt{(1+3)*2; 4+5;} will pass the syntax analysis without error
|
||||
\item \texttt{1++2;} will fail the syntax analysis, even though it has passed the lexical analysis
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Semantic actions}
|
||||
\begin{itemize}
|
||||
\item So far we have only described how to accept valid \texttt{mod} files and to reject others
|
||||
\item But validating is not enough: one needs to do something with the parsed \texttt{mod} file
|
||||
\item Every grammar rule can have a \alert{semantic action} associated with it: C/C++ code enclosed by curly braces
|
||||
\item Every rule can return a semantic value (referenced by \texttt{\$\$} in the action)
|
||||
\item In the action, it is possible to refer to semantic values returned by components of the rule (using \texttt{\$1}, \texttt{\$2}, \ldots)
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Semantic actions}
|
||||
\framesubtitle{An example}
|
||||
\begin{block}{A simple calculator which prints its results}
|
||||
\begin{footnotesize}
|
||||
\begin{verbatim}
|
||||
%start expression_list
|
||||
%type <int> expression
|
||||
|
||||
expression_list := expression SEMICOLON
|
||||
{ cout << $1 << endl; }
|
||||
| expression_list expression SEMICOLON
|
||||
{ cout << $2 << endl; };
|
||||
|
||||
expression := expression PLUS expression
|
||||
{ $$ = $1 + $3; }
|
||||
| expression TIMES expression
|
||||
{ $$ = $1 * $3; }
|
||||
| LEFT_PAREN expression RIGHT_PAREN
|
||||
{ $$ = $2; }
|
||||
| INT_NUMBER
|
||||
{ $$ = $1; };
|
||||
\end{verbatim}
|
||||
\end{footnotesize}
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Parsing driver}
|
||||
|
||||
The class \texttt{ParsingDriver} has the following roles:
|
||||
\begin{itemize}
|
||||
\item It opens the \texttt{mod} file and launches the lexical and syntaxic analyzers on it
|
||||
\item It implements most of the semantic actions of the grammar
|
||||
\item By doing so, it creates an object of type \texttt{ModFile}, which is the data structure representing the \texttt{mod} file
|
||||
\item Or, if there is a parsing error (unknown keyword, undeclared symbol, syntax error), it displays the line and column numbers where the error occurred and exits
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\section{Data structure representing a \texttt{mod} file}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{The \texttt{ModFile} class}
|
||||
\begin{itemize}
|
||||
\item This class is the internal data structure used to store all the information contained in a \texttt{mod} file
|
||||
\item One instance of the class represents one \texttt{mod} file
|
||||
\item The class contains the following elements (as class members):
|
||||
\begin{itemize}
|
||||
\item a symbol table, numerical constants table, external functions table
|
||||
\item trees of expressions: dynamic model, static model, original model, ramsey dynamic model, steady state model, trend dynamic model, \ldots
|
||||
\item the list of the statements (parameter initializations, \texttt{shocks} block, \texttt{check}, \texttt{steady}, \texttt{simul}, \ldots)
|
||||
\item model-specification and user-preference variables: \texttt{block}, \texttt{bytecode}, \texttt{use\_dll}, \texttt{no\_static}, \ldots
|
||||
\item an evaluation context (containing \texttt{initval} and parameter values)
|
||||
\end{itemize}
|
||||
\item An instance of \texttt{ModFile} is the output of the parsing process (return value of \texttt{ParsingDriver::parse()})
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{The symbol table (1/3)}
|
||||
\begin{itemize}
|
||||
\item A \alert{symbol} is simply the name of a variable (endogenous, exogenous, local, auxiliary, etc), parameter, external function, \ldots basically everything that is not recognized as a Dynare keyword
|
||||
\item \alert{SymbolTable} is a simple class used to maintain the list of the symbols used in the \texttt{mod} file
|
||||
\item For each symbol, it stores:
|
||||
\begin{itemize}
|
||||
\item its name, tex\_name, and long\_name (strings, some of which can be empty)
|
||||
\item its type (an enumerator defined in \texttt{CodeInterpreter.hh})
|
||||
\item a unique integer identifier (also has a unique identifier by type)
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{The symbol table (2/3)}
|
||||
Existing types of symbols:
|
||||
\begin{itemize}
|
||||
\item Endogenous variables
|
||||
\item Exogenous variables
|
||||
\item Exogenous deterministic variables
|
||||
\item Parameters
|
||||
\item Local variables inside model: declared with a pound sign (\#) construction
|
||||
\item Local variables outside model: no declaration needed (\textit{e.g.} lhs symbols in equations from \texttt{steady\_state\_model} block, expression outside of model block, \ldots)
|
||||
\item External functions
|
||||
\item Trend variables
|
||||
\item Log Trend variables
|
||||
\item Unused Endogenous variables (created when \texttt{nostrict} option is passed)
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{The symbol table (3/3)}
|
||||
\begin{itemize}
|
||||
\item Symbol table filled in:
|
||||
\begin{itemize}
|
||||
\item using the \texttt{var}, \texttt{varexo}, \texttt{varexo\_det}, \texttt{parameter}, \texttt{external\_function}, \texttt{trend\_var}, and \texttt{log\_trend\_var} declarations
|
||||
\item using pound sign (\#) constructions in the model block
|
||||
\item on the fly during parsing: local variables outside models or unknown functions when an undeclared symbol is encountered
|
||||
\item during the creation of auxiliary variables in the transform pass
|
||||
\end{itemize}
|
||||
\item Roles of the symbol table:
|
||||
\begin{itemize}
|
||||
\item permits parcimonious and more efficient representation of expressions (no need to duplicate or compare strings, only handle a pair of integers)
|
||||
\item ensures that a given symbol is used with only one type
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Expression trees (1/3)}
|
||||
\begin{itemize}
|
||||
\item The data structure used to store expressions is essentially a \alert{tree}
|
||||
\item Graphically, the tree representation of $(1+z)*\log(y)$ is:
|
||||
\begin{center}
|
||||
\includegraphics[width=6cm]{expr.png}
|
||||
\end{center}
|
||||
\item No need to store parentheses
|
||||
\item Each circle represents a \alert{node}
|
||||
\item A non external function node has at most one parent and at most three children (an external function node has as many children as arguments)
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Expression trees (2/3)}
|
||||
\begin{itemize}
|
||||
\item A tree node is represented by an instance of the abstract class \texttt{ExprNode}
|
||||
\item This class has 5 sub-classes, corresponding to the 5 types of non-external-function nodes:
|
||||
\begin{itemize}
|
||||
\item \texttt{NumConstNode} for constant nodes: contains the identifier of the numerical constants it represents
|
||||
\item \texttt{VariableNode} for variable/parameters nodes: contains the identifier of the variable or parameter it represents
|
||||
\item \texttt{UnaryOpNode} for unary operators (\textit{e.g.} unary minus, $\log$, $\sin$): contains an enumerator representing the operator, and a pointer to its child
|
||||
\item \texttt{BinaryOpNode} for binary operators (\textit{e.g.} $+$, $*$, pow): contains an enumerator representing the operator, and pointers to its two children
|
||||
\item \texttt{TrinaryOpNode} for trinary operators (\textit{e.g.} $normcdf$, $normpdf$): contains an enumerator representing the operator and pointers to its three children
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Expression trees (3/3)}
|
||||
\begin{itemize}
|
||||
\item The abstract class \texttt{ExprNode} has an abstract sub-class called \texttt{AbstractExternalFunctionNode}
|
||||
\item This abstract sub-class has 3 sub-classes, corresponding to the 3 types of external function nodes:
|
||||
\begin{itemize}
|
||||
\item \texttt{ExternalFunctionNode} for external functions. Contains the identifier of the external function and a vector of its arguments
|
||||
\item \texttt{FirstDerivExternalFunctionNode} for the first derivative of an external function. In addition to the information contained in \texttt{ExternalFunctionNode}, contains the index w.r.t. which this node is the derivative.
|
||||
\item \texttt{SecondDerivExternalFunctionNode} for the second derivative of an external function. In addition to the information contained in \texttt{FirstDerivExternalFunctionNode}, contains the index w.r.t. which this node is the second derivative.
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Classes \texttt{DataTree} and \texttt{ModelTree}}
|
||||
\begin{itemize}
|
||||
\item Class \texttt{DataTree} is a container for storing a set of expression trees
|
||||
\item Class \texttt{ModelTree} is a sub-class container of \texttt{DataTree}, specialized for storing a set of model equations.
|
||||
\item In the code, we use \texttt{ModelTree}-derived classes: \texttt{DynamicModel} (the model with lags) and \texttt{StaticModel} (the model without lags)
|
||||
\item Class \texttt{ModFile} contains:
|
||||
\begin{itemize}
|
||||
\item one instance of \texttt{DataTree} for storing all expressions outside model block
|
||||
\item several instances of \texttt{DynamicModel}, one each for storing the equations of the model block for the original model, modified model, original Ramsey model, the Ramsey FOCs, etc.
|
||||
\item one instance of \texttt{StaticModel} for storing the equations of model block without lags
|
||||
\end{itemize}
|
||||
\item Expression storage is optimized through three mechanisms:
|
||||
\begin{itemize}
|
||||
\item symbolic simplification rules
|
||||
\item sub-expression sharing
|
||||
\item pre-computing of numerical constants
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Constructing expression trees}
|
||||
\begin{itemize}
|
||||
\item Class \texttt{DataTree} contains a set of methods for constructing expression trees
|
||||
\item Construction is done bottom-up, node by node:
|
||||
\begin{itemize}
|
||||
\item one method for adding a constant node (\texttt{AddPossiblyNegativeConstant(double)})
|
||||
\item one method for a log node (\texttt{AddLog(arg)})
|
||||
\item one method for a plus node (\texttt{AddPlus(arg1, arg2)})
|
||||
\end{itemize}
|
||||
\item These methods take pointers to \texttt{ExprNode}, allocate the memory for the node, construct it, and return its pointer
|
||||
\item These methods are called:
|
||||
\begin{itemize}
|
||||
\item from \texttt{ParsingDriver} in the semantic actions associated to the parsing of expressions
|
||||
\item during symbolic derivation, to create derivatives expressions
|
||||
\item when creating the static model from the dynamic model
|
||||
\item \ldots
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Reduction of constants and symbolic simplifications}
|
||||
\begin{itemize}
|
||||
\item The construction methods compute constants whenever possible
|
||||
\begin{itemize}
|
||||
\item Suppose you ask to construct the node $1+1$
|
||||
\item The \texttt{AddPlus()} method will return a pointer to a constant node containing 2
|
||||
\end{itemize}
|
||||
\item The construction methods also apply a set of simplification rules, such as:
|
||||
\begin{itemize}
|
||||
\item $0+0=0$
|
||||
\item $x+0 = x$
|
||||
\item $0-x = -x$
|
||||
\item $-(-x) = x$
|
||||
\item $x*0 = 0$
|
||||
\item $x/1 = x$
|
||||
\item $x^0 = 1$
|
||||
\end{itemize}
|
||||
\item When a simplification rule applies, no new node is created
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Sub-expression sharing (1/2)}
|
||||
\begin{itemize}
|
||||
\item Consider the two following expressions: $(1+z)*\log(y)$ and $2^{(1+z)}$
|
||||
\item Expressions share a common sub-expression: $1+z$
|
||||
\item The internal representation of these expressions is:
|
||||
\begin{center}
|
||||
\includegraphics[width=7cm]{expr-sharing.png}
|
||||
\end{center}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Sub-expression sharing (2/2)}
|
||||
\begin{itemize}
|
||||
\item Construction methods implement a simple algorithm which achieves maximal expression sharing
|
||||
\item Algorithm uses the fact that each node has a unique memory address (pointer to the corresponding instance of \texttt{ExprNode})
|
||||
\item It maintains 9 tables which keep track of the already-constructed nodes: one table by type of node (constants, variables, unary ops, binary ops, trinary ops, external functions, first deriv of external functions, second deriv of external functions, local variables)
|
||||
\item Suppose you want to create the node $e_1+e_2$ (where $e_1$ and $e_2$ are sub-expressions):
|
||||
\begin{itemize}
|
||||
\item the algorithm searches the binary ops table for the tuple equal to (address of $e_1$, address of $e_2$, op code of +) (it is the \alert{search key})
|
||||
\item if the tuple is found in the table, the node already exists and its memory address is returned
|
||||
\item otherwise, the node is created and is added to the table with its search key
|
||||
\end{itemize}
|
||||
\item Maximum sharing is achieved because expression trees are constructed bottom-up
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Final remarks about expressions}
|
||||
\begin{itemize}
|
||||
\item Storage of negative constants
|
||||
\begin{itemize}
|
||||
\item class \texttt{NumConstNode} only accepts positive constants
|
||||
\item a negative constant is stored as a unary minus applied to a positive constant
|
||||
\item this is a kind of identification constraint to avoid having two ways of representing negative constants: $(-2)$ and $-(2)$
|
||||
\end{itemize}
|
||||
\item Widely used constants
|
||||
\begin{itemize}
|
||||
\item class \texttt{DataTree} has attributes containing pointers to constants: $0$, $1$, $2$, $-1$, \texttt{NaN}, $\infty$, $-\infty$, and $\pi$
|
||||
\item these constants are used in many places (in simplification rules, in derivation algorithm\ldots)
|
||||
\item sub-expression sharing algorithm ensures that these constants will never be duplicated
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{List of statements}
|
||||
\begin{itemize}
|
||||
\item A statement is represented by an instance of a subclass of the abstract class \texttt{Statement}
|
||||
\item Three groups of statements:
|
||||
\begin{itemize}
|
||||
\item initialization statements (parameter initialization with $p = \ldots$, \texttt{initval}, \texttt{histval}, or \texttt{endval} block)
|
||||
\item shocks blocks (\texttt{shocks}, \texttt{mshocks}, \ldots)
|
||||
\item computing tasks (\texttt{steady}, \texttt{check}, \texttt{simul}, \ldots)
|
||||
\end{itemize}
|
||||
\item Each type of statement has its own class (\textit{e.g.} \texttt{InitValStatement}, \texttt{SimulStatement}, \ldots)
|
||||
\item The class \texttt{ModFile} stores a list of pointers of type \texttt{Statement*}, corresponding to the statements of the \texttt{mod} file, in their order of declaration
|
||||
\item Heavy use of polymorphism in the check pass, computing pass, and when writing outputs: abstract class \texttt{Statement} provides a virtual method for these 3 actions
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Evaluation context}
|
||||
\begin{itemize}
|
||||
\item The \texttt{ModFile} class contains an \alert{evaluation context}
|
||||
\item It is a map associating a numerical value to some symbols
|
||||
\item Filled in with \texttt{initval} block values and parameter initializations
|
||||
\item Used during equation normalization (in the block decomposition), for finding non-zero entries in the jacobian
|
||||
\item Used in testing that trends are compatible with a balanced growth path, for finding non-zero cross partials of equations with respect to trend variables and endogenous varibales
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\section{Check pass}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Error checking during parsing}
|
||||
\begin{itemize}
|
||||
\item Some errors in the \texttt{mod} file can be detected during parsing:
|
||||
\begin{itemize}
|
||||
\item syntax errors
|
||||
\item use of undeclared symbols in model block, initval block\ldots
|
||||
\item use of a symbol incompatible with its type (\textit{e.g.} parameter in initval, local variable used both in model and outside model)
|
||||
\item multiple shock declarations for the same variable
|
||||
\end{itemize}
|
||||
\item But some other checks can only be done when parsing is completed\ldots
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Check pass}
|
||||
\begin{itemize}
|
||||
\item The check pass is implemented through the method \texttt{ModFile::checkPass()}
|
||||
\item Performs many checks. Examples include:
|
||||
\begin{itemize}
|
||||
\item check there is at least one equation in the model (except if doing a standalone BVAR estimation)
|
||||
\item checks for coherence in statements (\textit{e.g.} options passed to statements do not conflict with each other, required options have been passed)
|
||||
\item checks for coherence among statements (\textit{e.g.} if \texttt{osr} statement is present, ensure \texttt{osr\_params} and \texttt{optim\_weights} statements are present)
|
||||
\item checks for coherence between statements and attributes of \texttt{mod} file (\textit{e.g.} \texttt{use\_dll} is not used with \texttt{block} or \texttt{bytecode})
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\section{Transform pass}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Transform pass (1/2)}
|
||||
\begin{itemize}
|
||||
\item The transform pass is implemented through the method \texttt{ModFile::transformPass(bool nostrict)}
|
||||
\item It makes necessary transformations (notably to the dynamic model, symbol table, and statements list) preparing the \texttt{ModFile} object for the computing pass. Examples of transformations include:
|
||||
\begin{itemize}
|
||||
\item creation of auxiliary variables and equations for leads, lags, expectation operator, differentiated forward variables, etc.
|
||||
\item detrending of model equations if nonstationary variables are present
|
||||
\item decreasing leads/lags of predetermined variables by one period
|
||||
\item addition of FOCs of Langrangian for Ramsey problem
|
||||
\item addition of \texttt{dsge\_prior\_weight} initialization before all other statements if estimating a DSGE-VAR where the weight of the DSGE prior of the VAR is calibrated
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Transform pass (2/2)}
|
||||
\begin{itemize}
|
||||
\item It then freezes the symbol table, meaning that no more symbols can be created on the \texttt{ModFile} object
|
||||
\item Finally checks are performed on the transformed model. Examples include:
|
||||
\begin{itemize}
|
||||
\item same number of endogenous varibables as equations (not done in certain situations, \textit{e.g.} Ramsey, discretionary policy, etc.)
|
||||
\item correspondence among variables and statements, \textit{e.g.} Ramsey policy, identification, perfect foresight solver, and simul are incompatible with deterministic exogenous variables
|
||||
\item correspondence among statements, \textit{e.g.} for DSGE-VAR without \texttt{bayesian\_irf} option, the number of shocks must be greater than or equal to the number of observed variables
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
|
||||
\section{Computing pass}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Overview of the computing pass}
|
||||
\begin{itemize}
|
||||
\item Computing pass implemented in \texttt{ModFile::computingPass()}
|
||||
\item Creates Static model from Dynamic (by removing leads/lags)
|
||||
\item Determines which derivatives to compute
|
||||
\item Then calls \texttt{DynamicModel::computingPass()} which computes:
|
||||
\begin{itemize}
|
||||
\item leag/lag variable incidence matrix
|
||||
\item symbolic derivatives w.r.t. endogenous, exogenous, and parameters, if needed
|
||||
\item equation normalization + block decomposition
|
||||
\item temporary terms
|
||||
\item computes equation cross references, if desired
|
||||
\end{itemize}
|
||||
\item NB: analagous operations for Static model are performed by \texttt{StaticModel::computingPass()}
|
||||
\item Asserts that equations declared linear are indeed linear (by checking that Hessian == 0)
|
||||
\item Finally, calls \texttt{Statement::computingPass()} on all statements
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Model Variables}
|
||||
\begin{itemize}
|
||||
\item In the context of class \texttt{ModelTree}, a \alert{variable} is a pair (symbol, lag)
|
||||
\item The symbol must correspond to a variable of type endogenous, exogenous, deterministic exogenous variable, or parameter
|
||||
\item The \texttt{SymbolTable} class keeps track of valid symbols while the \texttt{variable\_node\_map} keeps track of model variables (symbol, lag pairs stored in \texttt{VariableNode} objects)
|
||||
\item After the computing pass, the \texttt{DynamicModel} class writes the leag/lag incidence matrix:
|
||||
\begin{itemize}
|
||||
\item three rows: the first row indicates $t-1$, the second row $t$, and the third row $t+1$
|
||||
\item one column for every endogenous symbol in order of declaration; NB: includes endogenous auxiliary variables created during the transform pass
|
||||
\item elements of the matrix are either 0 (if the variable does not appear in the model) or correspond to the variable's column in the Jacobian of the dynamic model
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Static versus dynamic model}
|
||||
\begin{itemize}
|
||||
\item The static model is simply the dynamic model without leads and lags
|
||||
\item Static model used to characterize the steady state
|
||||
\item The jacobian of the static model is used in the (Matlab) solver for determining the steady state
|
||||
\end{itemize}
|
||||
\begin{block}{Example}
|
||||
\begin{itemize}
|
||||
\item suppose dynamic model is $2x_t \cdot x_{t-1} = 0$
|
||||
\item static model is $2x^2 = 0$, whose derivative w.r.t. $x$ is $4x$
|
||||
\item dynamic derivative w.r.t. $x_t$ is $2x_{t-1}$, and w.r.t. $x_{t-1}$ is $2x_t$
|
||||
\item removing leads/lags from dynamic derivatives and summing over the two partial derivatives w.r.t. $x_t$ and $x_{t-1}$ gives $4x$
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Which derivatives to compute?}
|
||||
\begin{itemize}
|
||||
\item In deterministic mode:
|
||||
\begin{itemize}
|
||||
\item static jacobian w.r.t. endogenous variables only
|
||||
\item dynamic jacobian w.r.t. endogenous variables only
|
||||
\end{itemize}
|
||||
\item In stochastic mode:
|
||||
\begin{itemize}
|
||||
\item static jacobian w.r.t. endogenous variables only
|
||||
\item dynamic jacobian w.r.t. endogenous, exogenous, and deterministic exogenous variables
|
||||
\item dynamic hessian w.r.t. endogenous, exogenous, and deterministic exogenous variables
|
||||
\item possibly dynamic 3rd derivatives (if \texttt{order} option $\geq 3$)
|
||||
\item possibly dynamic jacobian and/or hessian w.r.t. parameters (if \texttt{identification} or analytic derivs needed for \texttt{estimation} and \texttt{params\_derivs\_order} $>0$)
|
||||
\end{itemize}
|
||||
\item For Ramsey policy: the same as above, but with one further order of derivation than declared by the user with \texttt{order} option (the derivation order is determined in the check pass, see \texttt{RamseyPolicyStatement::checkPass()})
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Derivation algorithm (1/2)}
|
||||
\begin{itemize}
|
||||
\item Derivation of the model implemented in \texttt{ModelTree::computeJacobian()}, \texttt{ModelTree::computeHessian()}, \texttt{ModelTree::computeThirdDerivatives()}, and \texttt{ModelTree::computeParamsDerivatives()}
|
||||
\item Simply call \texttt{ExprNode::getDerivative(deriv\_id)} on each equation node
|
||||
\item Use of polymorphism:
|
||||
\begin{itemize}
|
||||
\item for a constant or variable node, derivative is straightforward ($0$ or $1$)
|
||||
\item for a unary, binary, trinary op nodes and external function nodes, recursively calls method \texttt{computeDerivative()} on children to construct derivative
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Derivation algorithm (2/2)}
|
||||
\framesubtitle{Optimizations}
|
||||
\begin{itemize}
|
||||
\item Caching of derivation results
|
||||
\begin{itemize}
|
||||
\item method \texttt{ExprNode::getDerivative(deriv\_id)} memorizes its result in a member attribute (\texttt{derivatives}) the first time it is called
|
||||
\item the second time it is called (with the same argument), it simply returns the cached value without recomputation
|
||||
\item caching is useful because of sub-expression sharing
|
||||
\end{itemize}
|
||||
\item Efficiently finds symbolic derivatives equal to $0$
|
||||
\begin{itemize}
|
||||
\item consider the expression $x+y^2$
|
||||
\item without any computation, you know its derivative w.r.t. $z$ is zero
|
||||
\item each node stores in an attribute (\texttt{non\_null\_derivatives}) the set of variables which appear in the expression it represents ($\{x,y\}$ in the example)
|
||||
\item this set is computed in \texttt{prepareForDerivation()}
|
||||
\item when \texttt{getDerivative(deriv\_id)} is called, immediately returns zero if \texttt{deriv\_id} is not in that set
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Temporary terms (1/2)}
|
||||
\begin{itemize}
|
||||
\item When the preprocessor writes equations and derivatives in its outputs, it takes advantage of sub-expression sharing
|
||||
\item In Matlab static and dynamic output files, equations are preceded by a list of \alert{temporary terms}
|
||||
\item These terms are variables containing expressions shared by several equations or derivatives
|
||||
\item Using these terms greatly enhances the computing speed of the model residual, jacobian, hessian, or third derivative
|
||||
\end{itemize}
|
||||
\begin{block}{Example}
|
||||
\begin{columns}[t]
|
||||
\begin{column}{6cm}
|
||||
The equations:
|
||||
\begin{verbatim}
|
||||
residual(0)=x+y^2-z^3;
|
||||
residual(1)=3*(x+y^2)+1;
|
||||
\end{verbatim}
|
||||
\end{column}
|
||||
\begin{column}{4.8cm}
|
||||
Can be optimized in:
|
||||
\begin{verbatim}
|
||||
T1=x+y^2;
|
||||
residual(0)=T1-z^3;
|
||||
residual(1)=3*T1+1;
|
||||
\end{verbatim}
|
||||
\end{column}
|
||||
\end{columns}
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Temporary terms (2/2)}
|
||||
\begin{itemize}
|
||||
\item Expression storage in the preprocessor implements maximal sharing but this is not optimal for the Matlab output files, because creating a temporary variable also has a cost (in terms of CPU and of memory)
|
||||
\item Computation of temporary terms implements a trade-off between:
|
||||
\begin{itemize}
|
||||
\item cost of duplicating sub-expressions
|
||||
\item cost of creating new variables
|
||||
\end{itemize}
|
||||
\item Algorithm uses a recursive cost calculation, which marks some nodes as being ``temporary''
|
||||
\item \textit{Problem}: redundant with optimizations done by the C/C++ compiler (when Dynare is in DLL mode) $\Rightarrow$ compilation very slow on big models
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{The special case of Ramsey policy}
|
||||
\begin{itemize}
|
||||
\item For most statements, the method \texttt{computingPass()} is a no-op\ldots
|
||||
\item \ldots except for \texttt{planner\_objective} statement, which serves to declare planner objective when doing optimal policy under commitment
|
||||
\item Class \texttt{PlannerObjectiveStatement} contains an instance of \texttt{ModelTree}, which stores the objective function (\texttt{i.e.} only one equation in the tree)
|
||||
\item During the computing pass, triggers the computation of the first and second order (static) derivatives of the objective
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\section{Writing outputs}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Output overview}
|
||||
\begin{itemize}
|
||||
\item Implemented in \texttt{ModFile::writeOutputFiles()}
|
||||
\item If \texttt{mod} file is \texttt{model.mod}, all created filenames will begin with \texttt{model}
|
||||
\item Main output file is \texttt{model.m}, containing:
|
||||
\begin{itemize}
|
||||
\item general initialization commands
|
||||
\item symbol table output (from \texttt{SymbolTable::writeOutput()})
|
||||
\item lead/lag incidence matrix (from \texttt{DynamicModel::writeDynamicMFile()})
|
||||
\item call to Matlab functions corresponding to the statements of the \texttt{mod} file (written by calling \texttt{Statement::writeOutput()} on all statements through polymorphism)
|
||||
\end{itemize}
|
||||
\item Subsidiary output files:
|
||||
\begin{itemize}
|
||||
\item one for the static model
|
||||
\item one for the dynamic model
|
||||
\item one for the auxiliary variables
|
||||
\item one for the steady state file (if relevant)
|
||||
\item one for the planner objective (if relevant)
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Model output files}
|
||||
Three possible output types:
|
||||
\begin{itemize}
|
||||
\item Matlab/Octave mode: static and dynamic files in Matlab
|
||||
\item Julia mode: static and dynamic files in Julia
|
||||
\item DLL mode:
|
||||
\begin{itemize}
|
||||
\item static and dynamic files in C++ source code (with corresponding headers)
|
||||
\item compiled through \texttt{mex} to allow execution from within Matlab
|
||||
\end{itemize}
|
||||
\item Sparse DLL mode:
|
||||
\begin{itemize}
|
||||
\item static file in Matlab
|
||||
\item two possibilities for dynamic file:
|
||||
\begin{itemize}
|
||||
\item by default, a C++ source file (with header) and a binary file, to be read from the C++ code
|
||||
\item or, with \texttt{no\_compiler} option, a binary file in custom format, executed from Matlab through \texttt{simulate} DLL
|
||||
\item the second option serves to bypass compilation of C++ file which can be very slow
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\section{Proposed Changes}
|
||||
|
||||
\newcounter{sauvegardeenumi}
|
||||
\newcommand{\asuivre}{\setcounter{sauvegardeenumi}{\theenumi}}
|
||||
\newcommand{\suite}{\setcounter{enumi}{\thesauvegardeenumi}}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Proposed changes with addition of Julia support (1/2)}
|
||||
\begin{enumerate}
|
||||
\item Julia output is provided upon parsing of \texttt{mod} file, everything else done in Julia
|
||||
\begin{itemize}
|
||||
\item Pros: very few changes to the preprocessor
|
||||
\item Cons: repeated code (same checks, transformations, computations done in preprocessor and Julia); potential code divergence/two parallel projects
|
||||
\end{itemize}
|
||||
\item Dump preprocessor altogether: do everything with Julia
|
||||
\begin{itemize}
|
||||
\item Pros: simple to distribute, move away from C++ (no contributions, requires more expertise)
|
||||
\item Cons: Matlab/Octave users must also download Julia, a big project, speed (?)
|
||||
\end{itemize}
|
||||
\asuivre
|
||||
\end{enumerate}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Proposed changes with addition of Julia support (2/2)}
|
||||
\begin{enumerate}
|
||||
\suite
|
||||
\item Create libraries out of the preprocessor
|
||||
\begin{itemize}
|
||||
\item Pros: Dynare interaction similar across HLPs, preprocessor used as is
|
||||
\item Cons: difficult for outsiders to contribute, big project, not much benefit in speed when compared to\ldots
|
||||
\end{itemize}
|
||||
\item Write \texttt{mod} file from HLP then call preprocessor; option to output JSON file representing \texttt{ModFile} object at every step of the preprocessor
|
||||
\begin{itemize}
|
||||
\item Pros: Dynare interaction similar across HLPs, preprocessor used as is, minimal amount of work, easy incremental step, allows users to support any given HPL given the JSON output
|
||||
\item Cons: unnecessary processing when certain changes made in host language, keeps defaults of current preprocessor, speed (?)
|
||||
\end{itemize}
|
||||
\item Other ideas?
|
||||
\end{enumerate}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Using HLP \texttt{mod} file objects (1/2)}
|
||||
\begin{center}
|
||||
\includegraphics[width=11cm]{json-preprocessor.png}
|
||||
\end{center}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Using HLP \texttt{mod} file objects (2/2)}
|
||||
\begin{itemize}
|
||||
\item Allows interactivity for all HLPs; requires only
|
||||
\begin{itemize}
|
||||
\item A definition of a mod file class in the HLP
|
||||
\item A library function that converts an HLP mod file object to a \texttt{mod} file
|
||||
\end{itemize}
|
||||
\item Allows users to use Dynare with any HPL. Standard JSON output can be read in any HPL; user can use it construct desired HPL objects and work with model in their language of preference
|
||||
\item Easy first step
|
||||
\item No divergence of codebase: don't need to repeat code (checks, transformations, etc.) across platforms
|
||||
\item Creates \texttt{mod} files that can be used on other host language platforms
|
||||
\item Adds one more HLP library to distribute
|
||||
\item Need to design/implement classes that will store processed dynare \texttt{mod} file in various HLPs
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\end{document}
|
|
@ -1,2 +0,0 @@
|
|||
NB: .png files made on https://www.draw.io. They can be edited by loading the .xml file with the same name
|
||||
|
|
@ -1 +1 @@
|
|||
Subproject commit 97765c1ae4cce5752e4d6fb663124499baa22d2e
|
||||
Subproject commit c2923b038386b2143f1af6518aea2a8c49a9a014
|
Loading…
Reference in New Issue