diff --git a/Makefile.am b/Makefile.am index ce8c90a7d..404e051a3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -11,7 +11,6 @@ ACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = \ matlab \ - dynare++ \ contrib \ NEWS.md \ license.txt \ diff --git a/doc/Makefile.am b/doc/Makefile.am index f16874bbb..925ed8cf0 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -2,7 +2,7 @@ SUBDIRS = parallel internals gsa dseries-and-reporting if ENABLE_DOC SUBDIRS += manual -pdf-local: guide.pdf bvar-a-la-sims.pdf dr.pdf +pdf-local: guide.pdf bvar-a-la-sims.pdf dr.pdf sylvester.pdf tl.pdf endif EXTRA_DIST = guide.tex guide.bbl bibmad.sty bvar-a-la-sims.tex dr.tex dr.bib dynare.plots @@ -21,6 +21,14 @@ dr.pdf: dr.tex $(PDFLATEX) dr $(PDFLATEX) dr +sylvester.pdf: sylvester.tex + $(PDFLATEX) sylvester + $(PDFLATEX) sylvester + +tl.pdf: tl.tex + $(PDFLATEX) tl + $(PDFLATEX) tl + clean-local: # Do not delete guide.bbl which is not autogenerated rm -f *~ *.pdf *.log *.aux *.out *.blg dr.bbl diff --git a/doc/dr.tex b/doc/dr.tex index 65559c68f..71abf27f3 100644 --- a/doc/dr.tex +++ b/doc/dr.tex @@ -650,7 +650,7 @@ equation is: In the general case, this equation is a specialized Sylvester equation, which can be solved using the algorithm proposed by \citet{kamenik:2004}\footnote{This paper is distributed with Dynare, in the - \texttt{sylvester.pdf} file under the Dynare++ documentation directory.}. + \texttt{sylvester.pdf} file under the documentation directory.}. \bibliographystyle{elsarticle-harv} \bibliography{dr} diff --git a/dynare++/doc/sylvester.tex b/doc/sylvester.tex similarity index 100% rename from dynare++/doc/sylvester.tex rename to doc/sylvester.tex diff --git a/dynare++/doc/tl.tex b/doc/tl.tex similarity index 100% rename from dynare++/doc/tl.tex rename to doc/tl.tex diff --git a/dynare++/Makefile.am b/dynare++/Makefile.am deleted file mode 100644 index 806c55dbe..000000000 --- a/dynare++/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -SUBDIRS = utils/cc sylv parser/cc tl doc integ kord src tests - -EXTRA_DIST = dynare_simul - -install-exec-local: - $(MKDIR_P) $(DESTDIR)$(pkglibdir)/dynare++ - cp -r dynare_simul/* $(DESTDIR)$(pkglibdir)/dynare++ - -uninstall-local: - rm -rf $(DESTDIR)$(pkglibdir)/dynare++ - diff --git a/dynare++/doc/Makefile.am b/dynare++/doc/Makefile.am deleted file mode 100644 index 9d787d9b0..000000000 --- a/dynare++/doc/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -EXTRA_DIST = \ - dynare++-ramsey.tex \ - dynare++-tutorial.tex \ - sylvester.tex \ - tl.tex \ - changelog-old.html \ - changelog-sylv-old.html - -if ENABLE_DOC -pdf-local: dynare++-ramsey.pdf dynare++-tutorial.pdf sylvester.pdf tl.pdf -endif - -%.pdf: %.tex - $(PDFLATEX) $< - $(PDFLATEX) $< - $(PDFLATEX) $< - -CLEANFILES = *.pdf *.log *.aux *.out *.toc - - diff --git a/dynare++/doc/changelog-old.html b/dynare++/doc/changelog-old.html deleted file mode 100644 index d7a4c4923..000000000 --- a/dynare++/doc/changelog-old.html +++ /dev/null @@ -1,280 +0,0 @@ - - -Dynare++ Change Log - - - - - - - - - - - - - - - - - - - - - - - - - -
Revision Version Date Description of changes
-1.3.7 -2008/01/15 - - -
Corrected a serious bug in centralizing a -decision rule. This bug implies that all results based on simulations -of the decision rule were wrong. However results based on stochastic -fix points were correct. Thanks to Wouter J. den Haan and Joris de Wind! - -
Added options --centralize and --no-centralize. - -
Corrected an error of a wrong -variance-covariance matrix in real-time simulations (thanks to Pawel -Zabzcyk). - -
Corrected a bug of integer overflow in refined -faa Di Bruno formula if one of refinements is empty. This bug appeared -when solving models without forward looking variables. - -
Corrected a bug in the Sylvester equation -formerly working only for models with forward looking variables. - -
Corrected a bug in global check printout. - -
Added generating a dump file. - -
Fixed a bug of forgetting repeated assignments -(for example in parameter settings and initval). - -
Added a diff operator to the parser. - -
1539 -1.3.6 -2008/01/03 - - -
Corrected a bug of segmentation faults for long -names and path names. - -
Changed a way how random numbers are -generated. Dynare++ uses a separate instance of Mersenne twister for -each simulation, this corrects a flaw of additional randomness caused -by operating system scheduler. This also corrects a strange behaviour -of random generator on Windows, where each simulation was getting the -same sequence of random numbers. - -
Added calculation of conditional distributions -controlled by --condper and --condsim. - -
Dropped creating unfoled version of decision -rule at the end. This might consume a lot of memory. However, -simulations might be slower for some models. - -
1368 -1.3.5 -2007/07/11 - - -
Corrected a bug of useless storing all derivative -indices in a parser. This consumed a lot of memory for large models. - -
Added an option --ss-tol controlling a -tolerance used for convergence of a non-linear solver. - -
Corrected buggy interaction of optimal policy -and forward looking variables with more than one period. - -
Variance matrices can be positive -semidefinite. This corrects a bug of throwing an error if estimating -approximation errors on ellipse of the state space with a -deterministic variable. - -
Implemented simulations with statistics -calculated in real-time. Options --rtsim and --rtper. - -
1282 -1.3.4 -2007/05/15 - - -
Corrected a bug of wrong representation of NaN in generated M-files. - -
Corrected a bug of occassionaly wrong evaluation of higher order derivatives of integer powers. - -
Implemented automatic handling of terms involving multiple leads. - -
Corrected a bug in the numerical integration, i.e. checking of the precision of the solution. - -
1090 -1.3.3 -2006/11/20 - - -
Corrected a bug of non-registering an auxiliary variable in initval assignments. - -
988 -1.3.2 -2006/10/11 - - -
Corrected a few not-serious bugs: segfault on -some exception, error in parsing large files, error in parsing -matrices with comments, a bug in dynare_simul.m - -
Added posibility to specify a list of shocks for -which IRFs are calculated - -
Added --order command line switch - -
Added writing two MATLAB files for steady state -calcs - -
Implemented optimal policy using keyword -planner_objective and planner_discount - -
Implemented an R interface to Dynare++ algorithms -(Tamas Papp) - -
Highlevel code reengineered to allow for -different model inputs - -
799 -1.3.1 -2006/06/13 - - -
Corrected few bugs: in error functions, in linear algebra module. - -
Updated dynare_simul. - -
Updated the tutorial. - -
Corrected an error in summing up tensors where -setting up the decision rule derivatives. Thanks to Michel -Juillard. The previous version was making deterministic effects of -future volatility smaller than they should be. - -
766 -1.3.0 -2006/05/22 - - -
The non-linear solver replaced with a new one. - -
The parser and derivator replaced with a new -code. Now it is possible to put expressions in parameters and initval -sections. - -
752 -1.2.2 -2006/05/22 - - -
Added an option triggering/suppressing IRF calcs.. - -
Newton algortihm is now used for fix-point calculations. - -
Vertical narrowing of tensors in Faa Di Bruno -formula to avoid multiplication with zeros.. - -
436 -1.2.1 -2005/08/17 - - -
Faa Di Bruno for sparse matrices optimized. The -implementation now accommodates vertical refinement of function stack -in order to fit a corresponding slice to available memory. In -addition, zero slices are identified. For some problems, this implies -significant speedup. - -
Analytic derivator speedup. - -
Corrected a bug in the threading code. The bug -stayed concealed in Linux 2.4.* kernels, and exhibited in Linux 2.6.*, -which has a different scheduling. This correction also allows using -detached threads on Windows. - -
410 -1.2 -2005/07/29 - - -
Added Dynare++ tutorial. - -
Changed and enriched contents of MAT-4 output -file. - -
Corrected a bug of wrong variable indexation -resulting in an exception. The error occurred if a variable appeared -at time t-1 or t+1 and not at t. - -
Added MATLAB interface, which allows simulation -of a decision rule in MATLAB. - -
Got rid of Matrix Template Library. - -
Added checking of model residuals by the -numerical integration. Three methods: checking along simulation path, -checking along shocks, and on ellipse of states. - -
Corrected a bug in calculation of higher moments -of Normal dist. - -
Corrected a bug of wrong drawing from Normal dist -with non-zero covariances. - -
-Added numerical integration module. Product and Smolyak -quadratures over Gauss-Hermite and Gauss-Legendre, and quasi Monte -Carlo. - -
152 -1.1 -2005/04/22 - - -
-Added a calculation of approximation at a stochastic steady state -(still experimental). - -
-Corrected a bug in Cholesky decomposition of variance-covariance -matrix with off-diagonal elements. - -
89 -1.01 -2005/02/23 - - -
-Added version printout. - -
-Corrected the bug of multithreading support for P4 HT processors running on Win32. - -
-Enhanced Kronecker product code resulting in approx. 20% speedup. - -
-Implemented vertical stack container refinement, and another -method for sparse folded Faa Di Bruno (both not used yet). - -
5 -1.0 -2005/02/23 -The first released version. - -
- - diff --git a/dynare++/doc/changelog-sylv-old.html b/dynare++/doc/changelog-sylv-old.html deleted file mode 100644 index 39571f73a..000000000 --- a/dynare++/doc/changelog-sylv-old.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - -Sylvester Solver Change Log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Tag Date Description/Changes
2003/09/10Initial version solving triangular system put to repository
Implemented solution of general case.
Implemented a memory pool (Paris).
Implemented MEX interface to the routine (Paris).
Implemented QuasiTriangularZero (Paris) (not fully used yet).
rel-12003/10-02Version sent to Michel.
Inheritance streamlined, QuasiTriangular inherits from GeneralMatrix.
Implemented block diagonalization algorithm.
Solution routines rewritten so that the output rewrites input, -considerable memory improvement.
MEX interface now links with LAPACK library from MATLAB.
Added a hack to MEX library loading in order to avoid MATLAB crash in Wins.
rel-22003/10/15Version sent to Michel.
KronUtils now rewrite input by output using less memory.
Added iterative solution algorithm (doubling).
Introduced abstraction for set of parameters (SylvParams).
Algorithm enabled to solve problems with singular C.
Implemented a class chooser chossing between QuasiTriangularZero, -and QuasiTriangular (padded with zero) depending on size of the -problem. Full use of QuasiTriangularZero.
Reimplemented QuasiTriangular::solve, offdiagonal elements are -eleiminated by gauss with partial pivoting, not by transformation of -complex eigenvalues. More stable for ill conditioned eigenvalues.
Reimplemented calculation of eliminating vectors, much more -numerically stable now.
Implemented algorithm for ordering of eigenvalues (not used now, -no numerical improvements).
rel-32003/12/4Version sent to Michel.
GeneralMatrix separated for use outside, in sylv module we use -its subclass SylvMatrix. Implemented ConstGeneralMatrix (useful outside). -
rel-42004/6/4Version, which was moved to pythie.cepremap.cnrs.fr repository.
- - diff --git a/dynare++/doc/dynare++-ramsey.tex b/dynare++/doc/dynare++-ramsey.tex deleted file mode 100644 index 00b73ce8f..000000000 --- a/dynare++/doc/dynare++-ramsey.tex +++ /dev/null @@ -1,157 +0,0 @@ -\documentclass[10pt]{article} -\usepackage{array,natbib,times} -\usepackage{amsmath, amsthm, amssymb} - -%\usepackage[pdftex,colorlinks]{hyperref} - -\begin{document} - -\title{Implementation of Ramsey Optimal Policy in Dynare++, Timeless Perspective} - -\author{Ondra Kamen\'\i k} - -\date{June 2006} -\maketitle - -\textbf{Abstract:} This document provides a derivation of Ramsey -optimal policy from timeless perspective and describes its -implementation in Dynare++. - -\section{Derivation of the First Order Conditions} - -Let us start with an economy populated by agents who take a number of -variables exogenously, or given. These may include taxes or interest -rates for example. These variables can be understood as decision (or control) -variables of the timeless Ramsey policy (or social planner). The agent's -information set at time $t$ includes mass-point distributions of these -variables for all times after $t$. If $i_t$ denotes an interest rate -for example, then the information set $I_t$ includes -$i_{t|t},i_{t+1|t},\ldots,i_{t+k|t},\ldots$ as numbers. In addition -the information set includes all realizations of past exogenous -innovations $u_\tau$ for $\tau=t,t-1,\ldots$ and distibutions -$u_\tau\sim N(0,\Sigma)$ for $\tau=t+1,\ldots$. These information sets will be denoted $I_t$. - -An information set including only the information on past realizations -of $u_\tau$ and future distributions of $u_\tau\sim N(0\sigma)$ will -be denoted $J_t$. We will use the following notation for expectations -through these sets: -\begin{eqnarray*} -E^I_t[X] &=& E(X|I_t)\\ -E^J_t[X] &=& E(X|J_t) -\end{eqnarray*} - -The agents optimize taking the decision variables of the social -planner at $t$ and future as given. This means that all expectations -they form are conditioned on the set $I_t$. Let $y_t$ denote a vector -of all endogenous variables including the planer's decision -variables. Let the number of endogenous variables be $n$. The economy -can be described by $m$ equations including the first order conditions -and transition equations: -\begin{equation}\label{constr} -E_t^I\left[f(y_{t-1},y_t,y_{t+1},u_t)\right] = 0. -\end{equation} -This lefts $n-m$ -the planner's control variables. The solution of this problem is a -decision rule of the form: -\begin{equation}\label{agent_dr} -y_t=g(y_{t-1},u_t,c_{t|t},c_{t+1|t},\ldots,c_{t+k|t},\ldots), -\end{equation} -where $c$ is a vector of planner's control variables. - -Each period the social planner chooses the vector $c_t$ to maximize -his objective such that \eqref{agent_dr} holds for all times following -$t$. This would lead to $n-m$ first order conditions with respect to -$c_t$. These first order conditions would contain unknown derivatives -of endogenous variables with respect to $c$, which would have to be -retrieved from the implicit constraints \eqref{constr} since the -explicit form \eqref{agent_dr} is not known. - -The other way to proceed is to assume that the planner is so dumb that -he is not sure what are his control variables. So he optimizes with -respect to all $y_t$ given the constraints \eqref{constr}. If the -planner's objective is $b(y_{t-1},y_t,y_{t+1},u_t)$ with a discount rate -$\beta$, then the optimization problem looks as follows: -\begin{align} -\max_{\left\{y_\tau\right\}^\infty_t}&E_t^J -\left[\sum_{\tau=t}^\infty\beta^{\tau-t}b(y_{\tau-1},y_\tau,y_{\tau+1},u_\tau)\right]\notag\\ -&\rm{s.t.}\label{planner_optim}\\ -&\hskip1cm E^I_\tau\left[f(y_{\tau-1},y_\tau,y_{\tau+1},u_\tau)\right]=0\quad\rm{for\ } -\tau=\ldots,t-1,t,t+1,\ldots\notag -\end{align} -Note two things: First, each constraint \eqref{constr} in -\eqref{planner_optim} is conditioned on $I_\tau$ not $I_t$. This is -very important, since the behaviour of agents at period $\tau=t+k$ is -governed by the constraint using expectations conditioned on $t+k$, -not $t$. The social planner knows that at $t+k$ the agents will use -all information available at $t+k$. Second, the constraints for the -planner's decision made at $t$ include also constraints for agent's -behaviour prior to $t$. This is because the agent's decision rules are -given in the implicit form \eqref{constr} and not in the explicit form -\eqref{agent_dr}. - -Using Lagrange multipliers, this can be rewritten as -\begin{align} -\max_{y_t}E_t^J&\left[\sum_{\tau=t}^\infty\beta^{\tau-t}b(y_{\tau-1},y_\tau,y_{\tau+1},u_\tau)\right.\notag\\ -&\left.+\sum_{\tau=-\infty}^{\infty}\beta^{\tau-t}\lambda^T_\tau E_\tau^I\left[f(y_{\tau-1},y_\tau,y_{\tau+1},u_\tau)\right]\right], -\label{planner_optim_l} -\end{align} -where $\lambda_t$ is a vector of Lagrange multipliers corresponding to -constraints \eqref{constr}. Note that the multipliers are multiplied -by powers of $\beta$ in order to make them stationary. Taking a -derivative wrt $y_t$ and putting it to zero yields the first order -conditions of the planner's problem: -\begin{align} -E^J_t\left[\vphantom{\frac{\int^(_)}{\int^(\_)}}\right.&\frac{\partial}{\partial y_t}b(y_{t-1},y_t,y_{t+1},u_t)+ -\beta L^{+1}\frac{\partial}{\partial y_{t-1}}b(y_{t-1},y_t,y_{t+1},u_t)\notag\\ -&+\beta^{-1}\lambda_{t-1}^TE^I_{t-1}\left[L^{-1}\frac{\partial}{\partial y_{t+1}}f(y_{t-1},y_t,y_{t+1},u_t)\right]\notag\\ -&+\lambda_t^TE^I_t\left[\frac{\partial}{\partial y_{t}}f(y_{t-1},y_t,y_{t+1},u_t)\right]\notag\\ -&+\beta\lambda_{t+1}^TE^I_{t+1}\left[L^{+1}\frac{\partial}{\partial y_{t-1}}f(y_{t-1},y_t,y_{t+1},u_t)\right] -\left.\vphantom{\frac{\int^(_)}{\int^(\_)}}\right] - = 0,\label{planner_optim_foc} -\end{align} -where $L^{+1}$ and $L^{-1}$ are one period lead and lag operators respectively. - -Now we have to make a few assertions concerning expectations -conditioned on the different information sets to simplify -\eqref{planner_optim_foc}. Recall the formula for integration through -information on which another expectation is conditioned, this is: -$$E\left[E\left[u|v\right]\right] = E[u],$$ -where the outer expectation integrates through $v$. Since $J_t\subset -I_t$, by easy application of the above formula we obtain -\begin{eqnarray} -E^J_t\left[E^I_t\left[X\right]\right] &=& E^J_t\left[X\right]\quad\rm{and}\notag\\ -E^J_t\left[E^I_{t-1}\left[X\right]\right] &=& E^J_t\left[X\right]\label{e_iden}\\ -E^J_t\left[E^I_{t+1}\left[X\right]\right] &=& E^J_{t+1}\left[X\right]\notag -\end{eqnarray} -Now, the last term of \eqref{planner_optim_foc} needs a special -attention. It is equal to -$E^J_t\left[\beta\lambda^T_{t+1}E^I_{t+1}[X]\right]$. If we assume -that the problem \eqref{planner_optim} has a solution, then there is a -deterministic function from $J_{t+1}$ to $\lambda_{t+1}$ and so -$\lambda_{t+1}\in J_{t+1}\subset I_{t+1}$. And the last term is equal -to $E^J_{t}\left[E^I_{t+1}[\beta\lambda^T_{t+1}X]\right]$, which is -$E^J_{t+1}\left[\beta\lambda^T_{t+1}X\right]$. This term can be -equivalently written as -$E^J_{t}\left[\beta\lambda^T_{t+1}E^J_{t+1}[X]\right]$. The reason why -we write the term in this way will be clear later. All in all, we have -\begin{align} -E^J_t\left[\vphantom{\frac{\int^(_)}{\int^(\_)}}\right.&\frac{\partial}{\partial y_t}b(y_{t-1},y_t,y_{t+1},u_t)+ -\beta L^{+1}\frac{\partial}{\partial y_{t-1}}b(y_{t-1},y_t,y_{t+1},u_t)\notag\\ -&+\beta^{-1}\lambda_{t-1}^TL^{-1}\frac{\partial}{\partial y_{t+1}}f(y_{t-1},y_t,y_{t+1},u_t)\notag\\ -&+\lambda_t^T\frac{\partial}{\partial y_{t}}f(y_{t-1},y_t,y_{t+1},u_t)\notag\\ -&+\beta\lambda_{t+1}^TE^J_{t+1}\left[L^{+1}\frac{\partial}{\partial y_{t-1}}f(y_{t-1},y_t,y_{t+1},u_t)\right] -\left.\vphantom{\frac{\int^(_)}{\int^(\_)}}\right] - = 0.\label{planner_optim_foc2} -\end{align} -Note that we have not proved that \eqref{planner_optim_foc} and -\eqref{planner_optim_foc2} are equivalent. We proved only that if -\eqref{planner_optim_foc} has a solution, then -\eqref{planner_optim_foc2} is equivalent (and has the same solution). - -%%- \section{Implementation} -%%- -%%- The user inputs $b(y_{t-1},y_t,y_{t+1},u_t)$, $\beta$, and agent's -%%- first order conditions \eqref{constr}. The algorithm has to produce -%%- \eqref{planner_optim_foc2}. -%%- -\end{document} diff --git a/dynare++/doc/dynare++-tutorial.tex b/dynare++/doc/dynare++-tutorial.tex deleted file mode 100644 index d94475a2a..000000000 --- a/dynare++/doc/dynare++-tutorial.tex +++ /dev/null @@ -1,1512 +0,0 @@ -\documentclass[10pt]{article} -\usepackage{array,natbib} -\usepackage{amsmath, amsthm, amssymb} - -\usepackage[pdftex,colorlinks]{hyperref} - -\begin{document} - -\title{DSGE Models with Dynare++. A Tutorial.} - -\author{Ondra Kamen\'\i k} - -\date{First version: February 2011 \\ This version: September 2020} -\maketitle - -\tableofcontents - -\section{Setup} - -The Dynare++ setup procedure is pretty straightforward as Dynare++ is included in the Dynare installation -packages which can be downloaded from \url{https://www.dynare.org}. Take the following steps: -\begin{enumerate} -\item Add the {\tt dynare++} subdirectory of the root Dynare installation directory to the your -operating system path. This ensures that your OS will find the {\tt dynare++} executable. -\item If you have MATLAB and want to run custom simulations (see \ref{custom}), - then you need to add to your MATLAB path the {\tt dynare++} subdirectory of - the root Dynare installation directory, and also directory containing the - \texttt{dynare\_simul\_} MEX file (note the trailing underscore). The easiest - way to add the latter is to run Dynare once in your MATLAB session (even - without giving it any MOD file). -\end{enumerate} - -\section{Sample Session} - -As an example, let us take a simple DSGE model with time to build, whose dynamic -equilibrium is described by the following first order conditions: - -\begin{align*} -&c_t\theta h_t^{1+\psi} = (1-\alpha)y_t\cr -&\beta E_t\left[\frac{\exp(b_t)c_t}{\exp(b_{t+1})c_{t+1}} -\left(\exp(b_{t+1})\alpha\frac{y_{t+1}}{k_{t+1}}+1-\delta\right)\right]=1\cr -&y_t=\exp(a_t)k_t^\alpha h_t^{1-\alpha}\cr -&k_{t}=\exp(b_{t-1})(y_{t-1}-c_{t-1})+(1-\delta)k_{t-1}\cr -&a_t=\rho a_{t-1}+\tau b_{t-1}+\epsilon_t\cr -&b_t=\tau a_{t-1}+\rho b_{t-1}+\nu_t -\end{align*} - -\label{timing} -The convention is that the timing of a variable reflects when this variable -is decided. Dynare++ therefore uses a ``stock at the end of the -period'' notation for predetermined state variables (see the Dynare manual for details). - -The timing of this model is that the exogenous shocks $\epsilon_t$, -and $\nu_t$ are observed by agents in the beginning of period $t$ and -before the end of period $t$ all endogenous variables with index $t$ -are decided. The expectation operator $E_t$ works over the information -accumulated just before the end of the period $t$ (this includes -$\epsilon_t$, $\nu_t$ and all endogenous variables with index $t$). - -The exogenous shocks $\epsilon_t$ and $\nu_t$ are supposed to be -serially uncorrelated with zero means and time-invariant -variance-covariance matrix. In Dynare++, these variables are called -exogenous; all other variables are endogenous. Now we are prepared to -start writing a model file for Dynare++, which is an ordinary text -file and could be created with any text editor. - -The model file starts with a preamble declaring endogenous and -exogenous variables, parameters, and setting values of the -parameters. Note that one can put expression on right hand sides. The -preamble follows: - -{\small -\begin{verbatim} -var Y, C, K, A, H, B; -varexo EPS, NU; - -parameters beta, rho, alpha, delta, theta, psi, tau; -alpha = 0.36; -rho = 0.95; -tau = 0.025; -beta = 1/(1.03^0.25); -delta = 0.025; -psi = 0; -theta = 2.95; -\end{verbatim} -} - -The section setting values of the parameters is terminated by a -beginning of the {\tt model} section, which states all the dynamic -equations. A timing convention of a Dynare++ model is the same as the -timing of our example model, so we may proceed with writing the model -equations. The time indexes of $c_{t-1}$, $c_t$, and $c_{t+1}$ are -written as {\tt C(-1)}, {\tt C}, and {\tt C(1)} resp. The {\tt model} -section looks as follows: - -{\small -\begin{verbatim} -model; -C*theta*H^(1+psi) = (1-alpha)*Y; -beta*exp(B)*C/exp(B(1))/C(1)* - (exp(B(1))*alpha*Y(1)/K(1)+1-delta) = 1; -Y = exp(A)*K^alpha*H^(1-alpha); -K = exp(B(-1))*(Y(-1)-C(-1)) + (1-delta)*K(-1); -A = rho*A(-1) + tau*B(-1) + EPS; -B = tau*A(-1) + rho*B(-1) + NU; -end; -\end{verbatim} -} - -At this point, almost all information that Dynare++ needs has been -provided. Only three things remain to be specified: initial values of -endogenous variables for non-linear solver, variance-covariance matrix -of the exogenous shocks and order of the Taylor approximation. Since -the model is very simple, there is a closed form solution for the -deterministic steady state. We use it as initial values for the -non-linear solver. Note that the expressions on the right hand-sides in -{\tt initval} section can reference values previously calculated. The -remaining portion of the model file looks as follows: - -{\small -\begin{verbatim} -initval; -A = 0; -B = 0; -H = ((1-alpha)/(theta*(1-(delta*alpha) - /(1/beta-1+delta))))^(1/(1+psi)); -Y = (alpha/(1/beta-1+delta))^(alpha/(1-alpha))*H; -K = alpha/(1/beta-1+delta)*Y; -C = Y - delta*K; -end; - -vcov = [ - 0.0002 0.00005; - 0.00005 0.0001 -]; - -order = 7; -\end{verbatim} -} - -Note that the order of rows/columns of the variance-covariance matrix -corresponds to the ordering of exogenous variables in the {\tt varexo} -declaration. Since the {\tt EPS} was declared first, its variance is -$0.0002$, and the variance of {\tt NU} is $0.0001$. - -Let the model file be saved as {\tt example1.mod}. Now we are prepared -to solve the model. At the operating system command -prompt\footnote{Under Windows it is a {\tt cmd} program, under Unix it -is any shell} we issue a command: - -{\small -\begin{verbatim} -dynare++ example1.mod -\end{verbatim} -} - -When the program is finished, it produces two output files: a journal -file {\tt example1.jnl} and a MATLAB MAT-4 {\tt example1.mat}. The -journal file contains information about time, memory and processor -resources needed for all steps of solution. The output file is more -interesting. It contains various simulation results. It can be loaded -into MATLAB or Octave and examined. - -Let us first examine the contents of the MAT file: -{\small -\begin{verbatim} ->> load example1.mat ->> who - -Your variables are: - -dyn_g_1 dyn_i_Y dyn_npred -dyn_g_2 dyn_irfm_EPS_mean dyn_nstat -dyn_g_3 dyn_irfm_EPS_var dyn_shocks -dyn_g_4 dyn_irfm_NU_mean dyn_ss -dyn_g_5 dyn_irfm_NU_var dyn_state_vars -dyn_i_A dyn_irfp_EPS_mean dyn_steady_states -dyn_i_B dyn_irfp_EPS_var dyn_vars -dyn_i_C dyn_irfp_NU_mean dyn_vcov -dyn_i_EPS dyn_irfp_NU_var dyn_vcov_exo -dyn_i_H dyn_mean -dyn_i_K dyn_nboth -dyn_i_NU dyn_nforw -\end{verbatim} -} - -All the variables coming from one MAT file have a common prefix. In -this case it is {\tt dyn}, which is Dynare++ default. The prefix can -be changed, so that the multiple results could be loaded into one MATLAB -session. - -In the default setup, Dynare++ solves the Taylor approximation to the -decision rule and calculates unconditional mean and covariance of the -endogenous variables, and generates impulse response functions. The -mean and covariance are stored in {\tt dyn\_mean} and {\tt -dyn\_vcov}. The ordering of the endogenous variables is given by {\tt -dyn\_vars}. - -In our example, the ordering is - -{\small -\begin{verbatim} ->> dyn_vars -dyn_vars = -H -A -Y -C -K -B -\end{verbatim} -} - -and unconditional mean and covariance are - -{\small -\begin{verbatim} ->> dyn_mean -dyn_mean = - 0.2924 - 0.0019 - 1.0930 - 0.8095 - 11.2549 - 0.0011 ->> dyn_vcov -dyn_vcov = - 0.0003 0.0006 0.0016 0.0004 0.0060 0.0004 - 0.0006 0.0024 0.0059 0.0026 0.0504 0.0012 - 0.0016 0.0059 0.0155 0.0069 0.1438 0.0037 - 0.0004 0.0026 0.0069 0.0040 0.0896 0.0016 - 0.0060 0.0504 0.1438 0.0896 2.1209 0.0405 - 0.0004 0.0012 0.0037 0.0016 0.0405 0.0014 -\end{verbatim} -} - -The ordering of the variables is also given by indexes starting with -{\tt dyn\_i\_}. Thus the mean of capital can be retrieved as - -{\small -\begin{verbatim} ->> dyn_mean(dyn_i_K) -ans = - 11.2549 -\end{verbatim} -} - -\noindent and covariance of labor and capital by - -{\small -\begin{verbatim} ->> dyn_vcov(dyn_i_K,dyn_i_H) -ans = - 0.0060 -\end{verbatim} -} - -The impulse response functions are stored in matrices as follows -\begin{center} -\begin{tabular}{|l|l|} -\hline -matrix& response to\\ -\hline -{\tt dyn\_irfp\_EPS\_mean}& positive impulse to {\tt EPS}\\ -{\tt dyn\_irfm\_EPS\_mean}& negative impulse to {\tt EPS}\\ -{\tt dyn\_irfp\_NU\_mean}& positive impulse to {\tt NU}\\ -{\tt dyn\_irfm\_NU\_mean}& negative impulse to {\tt NU}\\ -\hline -\end{tabular} -\end{center} -All shocks sizes are one standard error. Rows of the matrices -correspond to endogenous variables, columns correspond to -periods. Thus capital response to a positive shock to {\tt EPS} can be -plotted as - -{\small -\begin{verbatim} -plot(dyn_irfp_EPS_mean(dyn_i_K,:)); -\end{verbatim} -} - -The data is in units of the respective variables, so in order to plot -the capital response in percentage changes from the decision rule's -fix point (which is a vector {\tt dyn\_ss}), one has to issue the -commands: - -{\small -\begin{verbatim} -Kss=dyn_ss(dyn_i_K); -plot(100*dyn_irfp_EPS_mean(dyn_i_K,:)/Kss); -\end{verbatim} -} - -The plotted impulse response shows that the model is pretty persistent -and that the Dynare++ default for a number of simulated periods is not -sufficient. In addition, the model persistence puts in doubt also a -number of simulations. The Dynare++ defaults can be changed when -calling Dynare++, in operating system's command prompt, we issue a -command: - -{\small -\begin{verbatim} -dynare++ --per 300 --sim 150 example1.mod -\end{verbatim} -} - -\noindent This sets the number of simulations to $150$ and the number -of periods to $300$ for each simulation giving $45000$ total simulated -periods. - -\section{Sample Optimal Policy Session} -\label{optim_tut} - -Suppose that one wants to solve the following optimal policy problem -with timeless perspective.\footnote{See \ref{ramsey} on how to solve -Ramsey optimality problem within this framework} The following -optimization problem is how to choose capital taxes financing public -good to maximize agent's utility from consumption good and public -good. The problem takes the form: -\begin{align*} -\max_{\{\tau_t\}_{t_0}^\infty} -E_{t_0}\sum_{t=t_0}^\infty &\beta^{t-t_0}\left(u(c_t)+av(g_t)\right)\\ -\hbox{subject\ to}&\\ -u'(c_t) &= -\beta E_t\left[u'(c_{t+1})\left(1-\delta+f'(k_{t+1})(1-\alpha\tau_{t+1})\right)\right]\\ -K_t &= (1-\delta)K_{t-1} + (f(K_{t-1}) - c_{t-1} - g_{t-1})\\ -g_t &= \tau_t\alpha f(K_t),\\ -\hbox{where\ } t & = \ldots,t_0-1,t_0,t_0+1,\ldots -\end{align*} -$u(c_t)$ is utility from consuming the consumption good, $v(g_t)$ is -utility from consuming the public good, $f(K_t)$ is a production -function $f(K_t) = Z_tK_t^\alpha$. $Z_t$ is a technology shock modeled -as AR(1) process. The three constraints come from the first order -conditions of a representative agent. We suppose that it pursues a -different objective, namely lifetime utility involving only -consumption $c_t$. The representative agents chooses between -consumption and investment. It rents the capital to firms and supplies -constant amount of labour. All output is paid back to consumer in form -of wage and capital rent. Only the latter is taxed. We suppose that -the optimal choice has been taking place from infinite past and will -be taking place for ever. Further we suppose the same about the -constraints. - -Let us choose the following functional forms: -\begin{eqnarray*} -u(c_t) &=& \frac{c_t^{1-\eta}}{1-\eta}\\ -v(g_t) &=& \frac{g_t^{1-\phi}}{1-\phi}\\ -f(K_t) &=& K_t^\alpha -\end{eqnarray*} - -Then the problem can be coded into Dynare++ as follows. We start with -a preamble which states all the variables, shocks and parameters: -{\small -\begin{verbatim} -var C G K TAU Z; - -varexo EPS; - -parameters eta beta alpha delta phi a rho; - -eta = 2; -beta = 0.99; -alpha = 0.3; -delta = 0.10; -phi = 2.5; -a = 0.1; -rho = 0.7; -\end{verbatim} -} - -Then we specify the planner's objective and the discount factor in the -objective. The objective is an expression (possibly including also -variable leads and lags), and the discount factor must be one single -declared parameter: -{\small -\begin{verbatim} -planner_objective C^(1-eta)/(1-eta) + a*G^(1-phi)/(1-phi); - -planner_discount beta; -\end{verbatim} -} - -The model section will contain only the constraints of the social -planner. These are capital accumulation, identity for the public -product, AR(1) process for $Z_t$ and the first order condition of the -representative agent (with different objective). -{\small -\begin{verbatim} -model; -K = (1-delta)*K(-1) + (exp(Z(-1))*K(-1)^alpha - C(-1) - G(-1)); -G = TAU*alpha*K^alpha; -Z = rho*Z(-1) + EPS; -C^(-eta) = beta*C(+1)^(-eta)*(1-delta + - exp(Z(+1))*alpha*K(+1)^(alpha-1)*(1-alpha*TAU(+1))); -end; -\end{verbatim} -} - -Now we have to provide a good guess for non-linear solver calculating -the deterministic steady state. The model's steady state has a closed -form solution if the taxes are known. So we provide a guess for -taxation {\tt TAU} and then use the closed form solution for capital, -public good and consumption:\footnote{Initial guess for Lagrange -multipliers and some auxiliary variables is calculated automatically. See -\ref{opt_init} for more details.} -{\small -\begin{verbatim} -initval; -TAU = 0.70; -K = ((delta+1/beta-1)/(alpha*(1-alpha*TAU)))^(1/(alpha-1)); -G = TAU*alpha*K^alpha; -C = K^alpha - delta*K - G; -Z = 0; -\end{verbatim} -} - -Finally, we have to provide the order of approximation, and the -variance-covariance matrix of the shocks (in our case we have only one -shock): -{\small -\begin{verbatim} -order = 4; - -vcov = [ - 0.01 -]; -\end{verbatim} -} - -After this model file has been run, we can load the resulting MAT-file -into the MATLAB and examine its contents: -{\small -\begin{verbatim} ->> load kp1980_2.mat ->> who - -Your variables are: - -dyn_g_1 dyn_i_MULT1 dyn_nforw -dyn_g_2 dyn_i_MULT2 dyn_npred -dyn_g_3 dyn_i_MULT3 dyn_nstat -dyn_g_4 dyn_i_TAU dyn_shocks -dyn_i_AUX_3_0_1 dyn_i_Z dyn_ss -dyn_i_AUX_4_0_1 dyn_irfm_EPS_mean dyn_state_vars -dyn_i_C dyn_irfm_EPS_var dyn_steady_states -dyn_i_EPS dyn_irfp_EPS_mean dyn_vars -dyn_i_G dyn_irfp_EPS_var dyn_vcov -dyn_i_K dyn_mean dyn_vcov_exo -dyn_i_MULT0 dyn_nboth -\end{verbatim} -} - -The data dumped into the MAT-file have the same structure as in the -previous example of this tutorial. The only difference is that -Dynare++ added a few more variables. Indeed: -{\small -\begin{verbatim} ->> dyn_vars -dyn_vars = -MULT1 -G -MULT3 -C -K -Z -TAU -AUX_3_0_1 -AUX_4_0_1 -MULT0 -MULT2 -\end{verbatim} -} -Besides the five variables declared in the model ({\tt C}, {\tt G}, -{\tt K}, {\tt TAU}, and {\tt Z}), Dy\-na\-re++ added 6 more, four as Lagrange -multipliers of the four constraints, two as auxiliary variables for -shifting in time. See \ref{aux_var} for more details. - -The structure and the logic of the MAT-file is the same as these new 6 -variables were declared in the model file and the file is examined in -the same way. - -For instance, let us examine the Lagrange multiplier of the optimal -policy associated with the consumption first order condition. Recall -that the consumers' objective is different from the policy -objective. Therefore, the constraint will be binding and the -multiplier will be non-zero. Indeed, its deterministic steady state, -fix point and mean are as follows: -{\small -\begin{verbatim} ->> dyn_steady_states(dyn_i_MULT3,1) -ans = - -1.3400 ->> dyn_ss(dyn_i_MULT3) -ans = - -1.3035 ->> dyn_mean(dyn_i_MULT3) -ans = - -1.3422 -\end{verbatim} -} - -\section{What Dynare++ Calculates} -\label{dynpp_calc} - -Dynare++ solves first order conditions of a DSGE model in the recursive form: -\begin{equation}\label{focs} -E_t[f(y^{**}_{t+1},y_t,y^*_{t-1},u_t)]=0, -\end{equation} -where $y$ is a vector of endogenous variables, and $u$ a vector of -exogenous variables. Some of elements of $y$ can occur at time $t+1$, -these are $y^{**}$. Elements of $y$ occurring at time $t-1$ are denoted -$y^*$. The exogenous shocks are supposed to be serially independent -and normally distributed $u_t\sim N(0,\Sigma)$. - -The solution of this dynamic system is a decision rule -\[ -y_t=g(y^*_{t-1},u_t) -\] -Dynare++ calculates a Taylor approximation of this decision rule of a -given order. The approximation takes into account deterministic -effects of future volatility, so a point about which the Taylor -approximation is done will be different from the fix point $y$ of the rule -yielding $y=g(y^*,0)$. - -The fix point of a rule corresponding to a model with $\Sigma=0$ is -called {\it deterministic steady state} denoted as $\bar y$. In -contrast to deterministic steady state, there is no consensus in -literature how to call a fix point of the rule corresponding to a -model with non-zero $\Sigma$. I am tempted to call it {\it stochastic - steady state}, however, it might be confused with unconditional mean -or with steady distribution. So I will use a term {\it fix point} to -avoid a confusion. - -By default, Dynare++ solves the Taylor approximation about the -deterministic steady state. Alternatively, Dynare++ can split the -uncertainty to a few steps and take smaller steps when calculating the -fix points. This is controlled by an option {\tt --steps}. For the -brief description of the second method, see \ref{multistep_alg}. - -\subsection{Decision Rule Form} -\label{dr_form} - -In case of default solution algorithm (approximation about the -deterministic steady state $\bar y$), Dynare++ calculates the higher -order derivatives of the equilibrium rule to get a decision rule of -the following form. In Einstein notation, it is: -\[ -y_t-\bar y = \sum_{i=0}^k\frac{1}{i!}\left[g_{(y^*u)^i}\right] -_{\alpha_1\ldots\alpha_i} -\prod_{j=1}^i\left[\begin{array}{c} y^*_{t-1}-\bar y^*\\ u_t \end{array}\right] -^{\alpha_j} -\] - -Note that the ergodic mean will be different from the deterministic -steady state $\bar y$ and thus deviations $y^*_{t-1}-\bar y^*$ will -not be zero in average. This implies that in average we will commit -larger round off errors than if we used the decision rule expressed in -deviations from a point closer to the ergodic mean. Therefore, by -default, Dynare++ recalculates this rule and expresses it in -deviations from the stochastic fix point $y$. -\[ -y_t-y = \sum_{i=1}^k\frac{1}{i!}\left[\tilde g_{(y^*u)^i}\right] -_{\alpha_1\ldots\alpha_i} -\prod_{j=1}^i\left[\begin{array}{c} y^*_{t-1}-y^*\\ u_t \end{array}\right] -^{\alpha_j} -\] -Note that since the rule is centralized around its fix point, the -first term (for $i=0$) drops out. - -Also note, that this rule mathematically equivalent to the rule -expressed in deviations from the deterministic steady state, and still -it is an approximation about the deterministic steady state. The fact -that it is expressed in deviations from a different point should not -be confused with the algorithm in \ref{multistep_alg}. - -This centralization can be avoided by invoking {\tt --no-centralize} -command line option. - -\subsection{Taking Steps in Volatility Dimension} -\label{multistep_alg} - -For models, where volatility of the exogenous shocks plays a big -role, the approximation about deterministic steady state can be poor, -since the equilibrium dynamics can be very different from the dynamics -in the vicinity of the perfect foresight (deterministic steady state). - -Therefore, Dynare++ has on option {\tt --steps} triggering a multistep -algorithm. The algorithm splits the volatility to a given number of -steps. Dynare++ attempts to calculate approximations about fix points -corresponding to these levels of volatility. The problem is that if we -want to calculate higher order approximations about fix points -corresponding to volatilities different from zero (as in the case of -deterministic steady state), then the derivatives of lower orders -depend on derivatives of higher orders with respect to forward looking -variables. The multistep algorithm in each step approximates the -missing higher order derivatives with extrapolations based on the -previous step. - -In this way, the approximation of the stochastic fix point and the -derivatives about this fix point are obtained. It is difficult to a -priori decide whether this algorithm yields a better decision -rule. Nothing is guaranteed, and the resulted decision rule should be -checked with a numerical integration. See \ref{checks}. - -\subsection{Simulating the Decision Rule} - -After some form of a decision rule is calculated, it is simulated to -obtain draws from ergodic (unconditional) distribution of endogenous -variables. The mean and the covariance are reported. There are two -ways how to calculate the mean and the covariance. The first one is to -store all simulated samples and calculate the sample mean and -covariance. The second one is to calculate mean and the covariance in -the real-time not storing the simulated sample. The latter case is -described below (see \ref{rt_simul}). - -The stored simulated samples are then used for impulse response -function calculations. For each shock, the realized shocks in these -simulated samples (control simulations) are taken and an impulse is -added and the new realization of shocks is simulated. Then the control -simulation is subtracted from the simulation with the impulse. This is -done for all control simulations and the results are averaged. As the -result, we get an expectation of difference between paths with impulse -and without impulse. In addition, the sample variances are -reported. They might be useful for confidence interval calculations. - -For each shock, Dynare++ calculates IRF for two impulses, positive and -negative. Size of an impulse is one standard error of a respective -shock.\footnote{Note that if the exogenous shocks are correlated, Dynare++ will - ignore the correlation when computing the IRFs, and simulate the impulse on - each shock independently of the others. Note that Dynare behaves differently - in this case, and computes IRFs after performing an orthogonalization of the - shocks (via a Cholesky decomposition of the variance-covariance matrix).} - -The rest of this subsection is divided to three parts giving account -on real-time simulations, conditional simulations, and on the way how -random numbers are generated resp. - -\subsubsection{Simulations With Real-Time Statistics} -\label{rt_simul} - -When one needs to simulate large samples to get a good estimate of -unconditional mean, simulating the decision rule with statistics -calculated in real-time comes handy. The main reason is that the -storing of all simulated samples may not fit into the available -memory. - -The real-time statistics proceed as follows: We model the ergodic -distribution as having normal distribution $y\sim N(\mu,\Sigma)$. Further, -the parameters $\mu$ and $\Sigma$ are modelled as: -\begin{eqnarray*} - \Sigma &\sim& {\rm InvWishart}_\nu(\Lambda)\\ - \mu|\Sigma &\sim& N(\bar\mu,\Sigma/\kappa) \\ -\end{eqnarray*} -This model of $p(\mu,\Sigma)$ has an advantage of conjugacy, i.e. a -prior distribution has the same form as posterior. This property is -used in the calculation of real-time estimates of $\mu$ and $\Sigma$, -since it suffices to maintain only the parameters of $p(\mu,\Sigma)$ -conditional observed draws so far. The parameters are: $\nu$, -$\Lambda$, $\kappa$, and $\bar\mu$. - -The mean of $\mu,\Sigma|Y$, where $Y$ are all the draws (simulated -periods) is reported. - -\subsubsection{Conditional Distributions} -\label{cond_dist} - -Starting with version 1.3.6, Dynare++ calculates variable -distributions $y_t$ conditional on $y_0=\bar y$, where $\bar y$ is the -deterministic steady state. If triggered, Dynare++ simulates a given -number of samples with a given number of periods all starting at -the deterministic steady state. Then for each time $t$, mean -$E[y_t|y_0=\bar y]$ and variances $E[(y_t-E[y_t|y_0=\bar -y])(y_t-E[y_t|y_0=\bar y])^T|y_0=\bar y]$ are reported. - -\subsubsection{Random Numbers} -\label{random_numbers} - -For generating of the pseudo random numbers, Dynare++ uses Mersenne -twister by Makoto Matsumoto and Takuji Nishimura. Because of the -parallel nature of Dynare++ simulations, each simulated sample gets -its own instance of the twister. Each such instance is seeded before -the simulations are started. This is to prevent additional randomness -implied by the operating system's thread scheduler to interfere with -the pseudo random numbers. - -For seeding the individual instances of the Mersenne twister assigned -to each simulated sample the system (C library) random generator is -used. These random generators do not have usually very good -properties, but we use them only to seed the Mersenne twister -instances. The user can set the initial seed of the system random -generator and in this way deterministically choose the seeds of all -instances of the Mersenne twister. - -In this way, it is guaranteed that two runs of Dynare++ -with the same seed will yield the same results regardless the -operating system's scheduler. The only difference may be caused by a -different round-off errors committed when the same set of samples are -summed in the different order (due to the operating system's scheduler). - -\subsection{Numerical Approximation Checks} -\label{checks} - -Optionally, Dynare++ can run three kinds of checks for Taylor -approximation errors. All three methods numerically calculate -the residual of the DSGE equations -\[ -E[f(g^{**}(g^*(y^*,u),u'),g(y^*,u),y^*,u)|y^*,u] -\] -which must be ideally zero for all $y^*$ and $u$. This integral is -evaluated by either product or Smolyak rule applied to one dimensional -Gauss--Hermite quadrature. The user does not need to care about the -decision. An algorithm yielding higher quadrature level and less -number of evaluations less than a user given maximum is selected. - -The three methods differ only by a set of $y^*$ and $u$ where the -residuals are evaluated. These are: -\begin{itemize} -\item The first method calculates the residuals along the shocks for -fixed $y^*$ equal to the fix point. We let all elements of $u$ be -fixed at $0$ but one element, which varies from $-\mu\sigma$ to -$\mu\sigma$, where $\sigma$ is a standard error of the element and -$\mu$ is the user given multiplier. In this way we can see how the -approximation error grows if the fix point is disturbed by a shock of -varying size. -\item The second method calculates the residuals along a simulation -path. A random simulation is run, and at each point the residuals are -reported. -\item The third method calculates the errors on an ellipse of the -state variables $y^*$. The shocks $u$ are always zero. The ellipse is -defined as -\[\{Ax|\; \Vert x\Vert_2=\mu\},\] -where $\mu$ is a user given multiplier, and $AA^T=V$ for $V$ being a -covariance of endogenous variables based on the first order -approximation. The method calculates the residuals at low discrepancy -sequence of points on the ellipse. Both the residuals and the points -are reported. -\end{itemize} - -\section{Optimal Policy with Dynare++} -\label{optim} - -Starting with version 1.3.2, Dynare++ is able to automatically -generate and then solve the first order conditions for a given -objective and (possibly) forward looking constraints. Since the -constraints can be forward looking, the use of this feature will -mainly be in optimal policy or control. - -The only extra thing which needs to be added to the model file is a -specification of the policy's objective. This is done by two keywords, -placed not before parameter settings. If the objective is to maximize -$$E_{t_0}\sum_{t=t_0}^\infty\beta^{t-t_0}\left[\frac{c_t^{1-\eta}}{1-\eta}+ -a\frac{g_t^{1-\phi}}{1-\phi}\right],$$ -then the keywords will be: -{\small -\begin{verbatim} -planner_objective C^(1-eta)/(1-eta) + a*G^(1-phi)/(1-phi); - -planner_discount beta; -\end{verbatim} -} - -Dynare++ parses the file and if the two keywords are present, it -automatically derives the first order conditions for the problem. The -first order conditions are put to the form \eqref{focs} and solved. In -this case, the equations in the {\tt model} section are understood as -the constraints (they might come as the first order conditions from -optimizations of other agents) and their number must be less than the -number of endogenous variables. - -This section further describes how the optimal policy first order -conditions look like, then discusses some issues with the initial -guess for deterministic steady state, and finally describes how to -simulate Ramsey policy within this framework. - -\subsection{First Order Conditions} - -Mathematically, the optimization problem looks as follows: -\begin{align} -\max_{\left\{y_\tau\right\}^\infty_t}&E_t -\left[\sum_{\tau=t}^\infty\beta^{\tau-t}b(y_{\tau-1},y_\tau,y_{\tau+1},u_\tau)\right]\notag\\ -&\rm{s.t.}\label{planner_optim}\\ -&\hskip1cm E^I_\tau\left[f(y_{\tau-1},y_\tau,y_{\tau+1},u_\tau)\right]=0\quad\rm{for\ } -\tau=\ldots,t-1,t,t+1,\ldots\notag -\end{align} -where $E^I$ is an expectation operator over an information set including, -besides all the past, all future realizations of policy's control -variables and distributions of future shocks $u_t\sim -N(0,\Sigma)$. The expectation operator $E$ integrates over an -information including only distributions of $u_t$ (besides the past). - -Note that the constraints $f$ take place at all times, and they are -conditioned at the running $\tau$ since the policy knows that the -agents at time $\tau$ will use all the information available at -$\tau$. - -The maximization problem can be rewritten using Lagrange multipliers as: -\begin{align} -\max_{y_t}E_t&\left[\sum_{\tau=t}^\infty\beta^{\tau-t}b(y_{\tau-1},y_\tau,y_{\tau+1},u_\tau)\right.\notag\\ -&\left.+\sum_{\tau=-\infty}^{\infty}\beta^{\tau-t}\lambda^T_\tau E_\tau^I\left[f(y_{\tau-1},y_\tau,y_{\tau+1},u_\tau)\right]\right], -\label{planner_optim_l} -\end{align} -where $\lambda_t$ is a column vector of Lagrange multipliers. - -After some manipulations with compounded expectations over different -information sets, one gets the following first order conditions: -\begin{align} -E_t\left[\vphantom{\frac{\int^(_)}{\int^(\_)}}\right.&\frac{\partial}{\partial y_t}b(y_{t-1},y_t,y_{t+1},u_t)+ -\beta L^{+1}\frac{\partial}{\partial y_{t-1}}b(y_{t-1},y_t,y_{t+1},u_t)\notag\\ -&+\beta^{-1}\lambda_{t-1}^TL^{-1}\frac{\partial}{\partial y_{t+1}}f(y_{t-1},y_t,y_{t+1},u_t)\notag\\ -&+\lambda_t^T\frac{\partial}{\partial y_{t}}f(y_{t-1},y_t,y_{t+1},u_t)\notag\\ -&+\beta\lambda_{t+1}^TE_{t+1}\left[L^{+1}\frac{\partial}{\partial y_{t-1}}f(y_{t-1},y_t,y_{t+1},u_t)\right] -\left.\vphantom{\frac{\int^(_)}{\int^(\_)}}\right] - = 0,\label{planner_optim_foc2} -\end{align} -where $L^{+1}$ is one period lead operator, and $L^{-1}$ is one period lag operator. - -Dynare++ takes input corresponding to \eqref{planner_optim}, -introduces the Lagrange multipliers according to -\eqref{planner_optim_l}, and using its symbolic derivator it compiles -\eqref{planner_optim_foc2}. The system \eqref{planner_optim_foc2} with -the constraints from \eqref{planner_optim_l} is then solved in the -same way as the normal input \eqref{focs}. - -\subsection{Initial Guess for Deterministic Steady State} -\label{opt_init} - -Solving deterministic steady state of non-linear dynamic systems is -not trivial and the first order conditions for optimal policy add -significant complexity. The {\tt initval} section allows to input the -initial guess of the non-linear solver. It requires that all user -declared endogenous variables be initialized. However, in most cases, -we have no idea what are good initial guesses for the Lagrange -multipliers. - -For this reason, Dynare++ calculates an initial guess of Lagrange -multipliers using user provided initial guesses of all other -endogenous variables. It uses the linearity of the Lagrange -multipliers in the \eqref{planner_optim_foc2}. In its static form, -\eqref{planner_optim_foc2} looks as follows: -\begin{align} -&\frac{\partial}{\partial y_t}b(y,y,y,0)+ -\beta\frac{\partial}{\partial y_{t-1}}b(y,y,y,0)\notag\\ -&+\lambda^T\left[\beta^{-1}\frac{\partial}{\partial y_{t+1}}f(y,y,y,0) - +\frac{\partial}{\partial y_{t}}f(y,y,y,0) - +\beta\frac{\partial}{\partial y_{t-1}}f(y,y,y,0)\right] - = 0\label{planner_optim_static} -\end{align} - -The user is required to provide an initial guess of all declared -variables (all $y$). Then \eqref{planner_optim_static} becomes an -overdetermined linear system in $\lambda$, which is solved by means of -the least squares. The closer the initial guess of $y$ is to the exact -solution, the closer are the Lagrange multipliers $\lambda$. - -The calculated Lagrange multipliers by the least squares are not used, -if they are set in the {\tt initval} section. In other words, if a -multiplier has been given a value in the {\tt initval} section, then -the value is used, otherwise the calculated value is taken. - -For even more difficult problems, Dynare++ generates two MATLAB files -calculating a residual of the static system and its derivative. These -can be used in MATLAB's {\tt fsolve} or other algorithm to get an -exact solution of the deterministic steady state. See -\ref{output_matlab_scripts} for more details. - -Finally, Dynare++ might generate a few auxiliary variables. These are -simple transformations of other variables. They are initialized -automatically and the user usually does not need to care about it. - -\subsection{Optimal Ramsey Policy} -\label{ramsey} - -Dynare++ solves the optimal policy problem with timeless -perspective. This means that it assumes that the constraints in -\eqref{planner_optim} are valid from the infinite past to infinite -future. Dynare++ calculation of ergodic distribution then assumes that -the policy has been taking place from infinite past. - -If some constraints in \eqref{planner_optim} are forward looking, this -will result in some backward looking Lagrange multipliers. Such -multipliers imply possibly time inconsistent policy in the states of -the ``original'' economy, since these backward looking multipliers add -new states to the ``optimized'' economy. In this respect, the timeless -perspective means that there is no fixed initial distribution of such -multipliers, instead, their ergodic distribution is taken. - -In contrast, Ramsey optimal policy is started at $t=0$. This means -that the first order conditions at $t=0$ are different than the first -order conditions at $t\geq 1$, which are -\eqref{planner_optim_foc2}. However, it is not difficult to assert -that the first order conditions at $t=0$ are in the form of -\eqref{planner_optim_foc2} if all the backward looking Lagrange -multipliers are set to zeros at period $-1$, i.e. $\lambda_{-1}=0$. - -All in all, the solution of \eqref{planner_optim_foc2} calculated by -Dynare++ can be used as a Ramsey optimal policy solution provided that -all the backward looking Lagrange multipliers were set to zeros prior -to the first simulation period. This can be done by setting the -initial state of a simulation path in {\tt dynare\_simul.m}. If this -is applied on the example from \ref{optim_tut}, then we may do the -following in the command prompt: -{\small -\begin{verbatim} ->> load kp1980_2.mat ->> shocks = zeros(1,100); ->> ystart = dyn_ss; ->> ystart(dyn_i_MULT3) = 0; ->> r=dynare_simul('kp1980_2.mat',shocks,ystart); -\end{verbatim} -} -This will simulate the economy if the policy was introduced in the -beginning and no shocks happened. - -More information on custom simulations can be obtained by typing: -{\small -\begin{verbatim} -help dynare_simul -\end{verbatim} -} - - -\section{Running Dynare++} - -This section deals with Dynare++ input. The first subsection -\ref{dynpp_opts} provides a list of command line options, next -subsection \ref{dynpp_mod} deals with a format of Dynare++ model file, -and the last subsection discusses incompatibilities between Dynare -and Dynare++. - -\subsection{Command Line Options} -\label{dynpp_opts} - -The calling syntax of the Dynare++ is - -{\small -\begin{verbatim} -dynare++ [--help] [--version] [options] -\end{verbatim} -} - -\noindent where the model file must be given as the last token and -must include its extension. The model file may include path, in this -case, the path is taken relative to the current directory. Note that -the current directory can be different from the location of {\tt -dynare++} binary. - -The options are as follows: - -\def\desc#1{\rlap{#1}\kern4cm} - -\begin{description} -\item[\desc{\tt --help}] This prints a help message and exits. - -\item[\desc{\tt --version}] This prints a version information and -exits. - -\item[\desc{\tt --per \it num}] This sets a number of simulated -periods to {\it num} in addition to the burn-in periods. This number -is used when calculating unconditional mean and covariance and for -IRFs. Default is 100. - -\item[\desc{\tt --burn \it num}] This sets a number of initial periods -which should be ignored from the statistics. The burn-in periods are -used to eliminate the influence of the starting point when -calculating ergodic distributions or/and impulse response -functions. The number of simulated period given by {\tt --per \it - num} option does not include the number of burn-in -periods. Default is 0. - -\item[\desc{\tt --sim \it num}] This sets a number of stochastic -simulations. This number is used when calculating unconditional mean -and covariance and for IRFs. The total sample size for unconditional -mean and covariance is the number of periods times the number of -successful simulations. Note that if a simulation results in {\tt NaN} -or {\tt +-Inf}, then it is thrown away and is not considered for the -mean nor the variance. The same is valid for IRF. Default is 80. - -\item[\desc{\tt --rtsim \it num}] This sets a number of stochastic -simulations whose statistics are calculated in the real-time. This -number excludes the burn-in periods set by {\tt --burn \it num} -option. See \ref{rt_simul} for more details. Default is 0, no -simulations. - -\item[\desc{\tt --rtper \it num}] This sets a number of simulated -periods per one simulation with real-time statistics to {\it num}. See -\ref{rt_simul} for more details. Default is 0, no simulations. - -\item[\desc{\tt --condsim \it num}] This sets a number of stochastic -conditional simulations. See \ref{cond_dist} for more details. Default -is 0, no simulations. - -\item[\desc{\tt --condper \it num}] This sets a number of simulated -periods per one conditional simulation. See \ref{cond_dist} for more -details. Default is 0, no simulations. - -\item[\desc{\tt --steps \it num}] If the number {\it num} is greater -than 0, this option invokes a multi-step algorithm (see section -\ref{dynpp_calc}), which in the given number of steps calculates fix -points and approximations of the decision rule for increasing -uncertainty. Default is 0, which invokes a standard algorithm for -approximation about deterministic steady state. For more details, -see \ref{multistep_alg}. - -\item[\desc{\tt --centralize}] This option causes that the resulting -decision rule is centralized about (in other words: expressed in the -deviations from) the stochastic fix point. The centralized decision -rule is mathematically equivalent but has an advantage of yielding -less numerical errors in average than not centralized decision -rule. By default, the rule is centralized. For more details, see -\ref{dr_form}. - -\item[\desc{\tt --no-centralize}] This option causes that the -resulting decision rule is not centralized about (in other words: -expressed in the deviations from) the stochastic fix point. By -default, the rule is centralized. For more details, see -\ref{dr_form}. - -This option has no effect if the number of steps given by {\tt ---steps} is greater than 0. In this case, the rule is always -centralized. - -\item[\desc{\tt --prefix \it string}] This sets a common prefix of -variables in the output MAT file. Default is {\tt dyn}. - -\item[\desc{\tt --seed \it num}] This sets an initial seed for the -random generator providing seed to generators for each sample. See -\ref{random_numbers} for more details. Default is 934098. - -\item[\desc{\tt --order \it num}] This sets the order of approximation -and overrides the {\tt order} statement in the model file. There is no -default. - -\item[\desc{\tt --threads \it num}] This sets a number of parallel -threads. Complex evaluations of Faa Di Bruno formulas, simulations and -numerical integration can be parallelized, Dynare++ exploits this -advantage. You have to have a hardware support for this, otherwise -there is no gain from the parallelization. The default value is the number of -logical processors present on the machine, divided by 2. - -\item[\desc{\tt --ss-tol \it float}] This sets the tolerance of the -non-linear solver of deterministic steady state to {\it float}. It is -in $\Vert\cdot\Vert_\infty$ norm, i.e. the algorithm is considered as -converged when a maximum absolute residual is less than the -tolerance. Default is $10^{-13}$. - -\item[\desc{\tt --check \it pPeEsS}] This selects types of residual -checking to be performed. See section \ref{checks} for details. The -string consisting of the letters ``pPeEsS'' governs the selection. The -upper-case letters switch a check on, the lower-case letters -off. ``P'' stands for checking along a simulation path, ``E'' stands -for checking on ellipse, and finally ``S'' stands for checking along -the shocks. It is possible to choose more than one type of check. The -default behavior is that no checking is performed. - -\item[\desc{\tt --check-evals \it num}] This sets a maximum number of -evaluations per one re\-sidual. The actual value depends on the selected -algorithm for the integral evaluation. The algorithm can be either -product or Smolyak quadrature and is chosen so that the actual number -of evaluations would be minimal with maximal level of -quadrature. Default is 1000. - -\item[\desc{\tt --check-num \it num}] This sets a number of checked -points in a residual check. One input value $num$ is used for all -three types of checks in the following way: -\begin{itemize} -\item For checks along the simulation, the number of simulated periods -is $10\cdot num$ -\item For checks on ellipse, the number of points on ellipse is $10\cdot num$ -\item For checks along the shocks, the number of checked points -corresponding to shocks from $0$ to $\mu\sigma$ (see \ref{checks}) is -$num$. -\end{itemize} -Default is 10. - -\item[\desc{\tt --check-scale \it float}] This sets the scaling factor -$\mu$ for checking on ellipse to $0.5\cdot float$ and scaling factor -$\mu$ for checking along shocks to $float$. See section -\ref{checks}. Default is 2.0. - -\item[\desc{\tt --no-irfs}] This suppresses IRF calculations. Default -is to calculate IRFs for all shocks. - -\item[\desc{\tt --irfs}] This triggers IRF calculations. If there are -no shock names following the {\tt --irfs} option, then IRFs for all -shocks are calculated, otherwise see below. Default is to calculate -IRFs for all shocks. - -\item[\desc{\tt --irfs \it shocklist}] This triggers IRF calculations -only for the listed shocks. The {\it shocklist} is a space separated -list of exogenous variables for which the IRFs will be -calculated. Default is to calculate IRFs for all shocks. -\end{description} - -The following are a few examples: -{\small -\begin{verbatim} -dynare++ --sim 300 --per 50 blah.mod -dynare++ --check PE --check-num 15 --check-evals 500 blah.dyn -dynare++ --steps 5 --check S --check-scale 3 blahblah.mod -\end{verbatim} -} -The first one sets the number of periods for IRF to 50, and sets a sample -size for unconditional mean and covariance calculations to 6000. The -second one checks the decision rule along a simulation path having 150 -periods and on ellipse at 150 points performing at most 500 evaluations -per one residual. The third one solves the model in five steps and -checks the rule along all the shocks from $-3\sigma$ to $3\sigma$ in -$2*10+1$ steps (10 for negative, 10 for positive and 1 for at zero). - -\subsection{Dynare++ Model File} -\label{dynpp_mod} - -In its strictest form, Dynare++ solves the following mathematical problem: -\begin{equation}\label{basic_form} -E_t[f(y^{**}_{t+1},y_t,y^*_{t-1},u_t)]=0 -\end{equation} -This problem is input either directly, or it is an output of Dynare++ -routines calculating first order conditions of the optimal policy -problem. In either case, Dynare++ performs necessary and -mathematically correct substitutions to put the user specified problem -to the \eqref{basic_form} form, which goes to Dynare++ solver. The -following discusses a few timing issues: -\begin{itemize} -\item Endogenous variables can occur, starting from version 1.3.4, at -times after $t+1$. If so, an equation containing such occurrence is -broken to non-linear parts, and new equations and new auxiliary -variables are automatically generated only for the non-linear terms -containing the occurrence. Note that shifting such terms to time $t+1$ -may add occurrences of some other variables (involved in the terms) at -times before $t-1$ implying addition of auxiliary variables to bring -those variables to $t-1$. -\item Variables declared as shocks may occur also at arbitrary -times. If before $t$, additional endogenous variables are used to -bring them to time $t$. If after $t$, then similar method is used as -for endogenous variables occurring after $t+1$. -\item There is no constraint on variables occurring at both times -$t+1$ (or later) and $t-1$ (or earlier). Virtually, all variables can -occur at arbitrary times. -\item Endogenous variables can occur at times before $t-1$. If so, -additional endogenous variables are added for all lags between the -variable and $t-1$. -\item Dynare++ applies the operator $E_t$ to all occurrences at time -$t+1$. The realization of $u_t$ is included in the information set of -$E_t$. See an explanation of Dynare++ timing on page \pageref{timing}. -\end{itemize} - -The model equations are formulated in the same way as in -Dynare. The time indexes different from $t$ are put to round -parenthesis in this way: {\tt C(-1)}, {\tt C}, {\tt C(+1)}. - -The mathematical expressions can use the following functions and operators: -\begin{itemize} -\item binary {\tt + - * / \verb|^|} -\item unary plus and minus minus as in {\tt a = -3;} and {\tt a = +3;} resp. -\item unary mathematical functions: {\tt log exp sin cos tan -sqrt}, whe\-re the logarithm has a natural base -\item symbolic differentiation operator {\tt diff(expr,symbol)}, where -{\tt expr} is a mathematical expression and {\tt symbol} is a unary -symbol (a variable or a parameter); for example {\tt - diff(A*K(-1)\verb|^|alpha*L\verb|^|(1-alpha),K(-1))} is internally expanded as -{\tt A*alpha*K(-1)\verb|^|(alpha-1)*L\verb|^|(1-alpha)} -\item unary error function and complementary error function: {\tt erf} -and {\tt erfc} defined as -\begin{eqnarray*} -erf(x) &= \frac{2}{\sqrt{\pi}}\int_0^x e^{-t^2}{\rm d}t\\ -erfc(x)&= \frac{2}{\sqrt{\pi}}\int_x^\infty e^{-t^2}{\rm d}t -\end{eqnarray*} -\end{itemize} - -The model file can contain user comments. Their usage can be -understood from the following piece of the model file: - -{\small -\begin{verbatim} -P*C^(-gamma) = // line continues until semicolon - beta*C(+1)^(-gamma)*(P(+1)+Y(+1)); // asset price -// choose dividend process: (un)comment what you want -Y/Y_SS = (Y(-1)/Y_SS)^rho*exp(EPS); -/* -Y-Y_SS = rho*(Y(-1)-Y_SS)+EPS; -*/ -\end{verbatim} -} - -\subsection{Incompatibilities with Dynare} - -This section provides a list of incompatibilities between a model file -for Dy\-na\-re++ and for Dynare. These must be considered when a model -file for Dynare is being migrated to Dynare++. The list is the -following: -\begin{itemize} -\item There is no {\tt periods} keyword. -\item The parameters cannot be lagged or leaded; Dynare -allows it, though the semantics is the same (parameter is a -constant). -\item There are no commands like {\tt steady}, {\tt check}, {\tt -simul}, {\tt stoch\_simul}, etc. -\item There are no sections like {\tt estimated\_params}, {\tt -var\_obs}, etc. -\item The variance-covariance matrix of endogenous shocks is given by -{\tt vcov} matrix in Dynare++. An example follows. Starting from -version 1.3.5, it is possible for vcov to be positive semi-definite -matrix. -{\small -\begin{verbatim} -vcov = [ -0.05 0 0 0; -0 0.025 0 0; -0 0 0.05 0; -0 0 0 0.025 -]; -\end{verbatim} -} - -\end{itemize} - -\section{Dynare++ Output} - -There are three output files; a data file in MAT-4 format containing -the output data (\ref{matfile}), a journal text file containing an -information about the Dynare++ run (\ref{journalfile}), and a dump -file (\ref{dumpfile}). Further, Dynare++ generates two MATLAB script -files, which calculate a residual and the first derivative of the -residual of the static system (\ref{output_matlab_scripts}). These are -useful when calculating the deterministic steady state outside -Dynare++. - -Note that all output files are created in the current directory of -the Dynare++ process. This can be different from the directory where -the Dynare++ binary is located and different from the directory where -the model file is located. - -Before all, we need to understand what variables are automatically -generated in Dynare++. - -\subsection{Auxiliary Variables} -\label{aux_var} - -Besides the endogenous variables declared in {\tt var} section, -Dynare++ might automatically add the following endogenous variables: - -\halign{\vrule width0pt height14pt{\tt #}\hfil & \kern 3mm% -\vtop{\rightskip=0pt plus 5mm\noindent\hsize=9.5cm #}\cr -MULT{\it n}& A Lagrange multiplier of the optimal policy problem -associated with a constraint number {\it n} starting from zero.\cr -AUX\_{\it n1}\_{\it n2}\_{\it n3}& An auxiliary variable associated -with the last term in equation \eqref{planner_optim_foc2}. Since the -term is under $E_{t+k}$, we need the auxiliary variable be put back -in time. {\it n1} is a variable number starting from 0 in the declared -order with respect to which the term was differentiated, {\it n2} is a -number of constraint starting from 0, and finally {\it n3} is $k$ -(time shift of the term).\cr -{\it endovar}\_p{\it K}& An auxiliary variable for bringing an -endogenous variable {\it endovar} back in time by $K$ periods. The -semantics of this variables is {\tt {\it endovar}\_p{\it K} = {\it -endovar}(+{\it K})}.\cr -{\it endovar}\_m{\it K}& An auxiliary variable for bringing an -endogenous variable {\it endovar} forward in time by $K$ periods. The -semantics of this variables is {\tt {\it endovar}\_m{\it K} = {\it -endovar}(-{\it K})}.\cr -{\it exovar}\_e& An auxiliary endogenous variable made equal to the -exogenous variable to allow for a semantical occurrence of the -exogenous variable at time other than $t$. The semantics of this -variables is {\tt {\it exovar}\_e = {\it exovar}}.\cr -AUXLD\_{\it n1}\_{\it n2}\_{\it n3}& An auxiliary variable for -bringing a non-linear term containing an occurrence of a variable -after $t+1$ to time $t+1$. {\it n1} is an equation number starting -from 0, {\it n2} is the non-linear sub-term number in the equation -starting from 0. {\it n3} is a time shift. For example, if the first -equation is the following: -\begin{verbatim} -X - Y*W(+1) + W(+2)*Z(+4) = 0; -\end{verbatim} -then it will be expanded as: -\begin{verbatim} -X - Y*W(+1) + AUXLD_0_2_3(+1) = 0; -AUXLD_0_2_1 = W(-1)*Z(+1); -AUXLD_0_2_2 = AUXLD_0_2_1(+1); -AUXLD_0_2_3 = AUXLD_0_2_2(+1); -\end{verbatim} -\cr -} - -\subsection{MAT File} -\label{matfile} - -The contents of the data file is depicted below. We -assume that the prefix is {\tt dyn}. - -\halign{\vrule width0pt height14pt{\tt #}\hfil & \kern 3mm% -\vtop{\rightskip=0pt plus 5mm\noindent\hsize=7.5cm #}\cr -dyn\_nstat& Scalar. A number of static variables -(those occurring only at time $t$).\cr -dyn\_npred & Scalar. A number of variables occurring -at time $t-1$ and not at $t+1$.\cr -dyn\_nboth & Scalar. A number of variables occurring -at $t+1$ and $t-1$.\cr -dyn\_nforw & Scalar. A number of variables occurring -at $t+1$ and not at $t-1$.\cr -dyn\_vars & Column vector of endogenous variable -names in Dy\-na\-re++ internal ordering.\cr -dyn\_i\_{\it endovar} & Scalar. Index of a variable -named {\it endovar} in the {\tt dyn\_vars}.\cr -dyn\_shocks & Column vector of exogenous variable -names.\cr -dyn\_i\_{\it exovar} & Scalar. Index of a shock -named {\it exovar} in the {\tt dyn\_shocks}.\cr -dyn\_state\_vars & Column vector of state variables, -these are stacked variables counted by {\tt dyn\_\-npred}, {\tt -dyn\_\-nboth} and shocks.\cr -dyn\_vcov\_exo & Matrix $nexo\times nexo$. The -variance-covariance matrix of exogenous shocks as input in the model -file. The ordering is given by {\tt dyn\_shocks}.\cr -dyn\_mean & Column vector $nendo\times 1$. The -unconditional mean of endogenous variables. The ordering is given by -{\tt dyn\_vars}.\cr -dyn\_vcov & Matrix $nendo\times nendo$. The -unconditional covariance of endogenous variables. The ordering is given -by {\tt dyn\_vars}.\cr -dyn\_rt\_mean & Column vector $nendo\times 1$. The unconditional mean -of endogenous variables estimated in real-time. See -\ref{rt_simul}. The ordering is given by {\tt dyn\_vars}.\cr -dyn\_rt\_vcov & Matrix $nendo\times nendo$. The unconditional -covariance of endogenous variables estimated in real-time. See \ref{rt_simul}. The -ordering is given by {\tt dyn\_vars}.\cr -dyn\_cond\_mean & Matrix $nendo\times nper$. The rows correspond to -endogenous variables in the ordering of {\tt dyn\_vars}, the columns -to periods. If $t$ is a period (starting with 1), then $t$-th column -is $E[y_t|y_0=\bar y]$. See \ref{cond_dist}.\cr -dyn\_cond\_variance & Matrix $nendo\times nper$. The rows correspond -to endogenous variables in the ordering of {\tt dyn\_vars}, the -columns to periods. If $t$ is a period (starting with 1), then $t$-th -column are the variances of $y_t|y_0=\bar y$. See \ref{cond_dist}.\cr -dyn\_ss & Column vector $nendo\times 1$. The fix -point of the resulting approximation of the decision rule.\cr -dyn\_g\_{\it order} & Matrix $nendo\times ?$. A -derivative of the decision rule of the {\it order} multiplied by -$1/order!$. The rows correspond to endogenous variables in the -ordering of {\tt dyn\_vars}. The columns correspond to a -multidimensional index going through {\tt dyn\_state\_vars}. The data -is folded (all symmetrical derivatives are stored only once).\cr -dyn\_steady\_states & Matrix $nendo\times -nsteps+1$. A list of fix points at which the multi-step algorithm -calculated approximations. The rows correspond to endogenous variables -and are ordered by {\tt dyn\_vars}, the columns correspond to the -steps. The first column is always the deterministic steady state.\cr -dyn\_irfp\_{\it exovar}\_mean & Matrix -$nendo\times nper$. Positive impulse response to a shock named {\it -exovar}. The row ordering is given by {\tt dyn\_vars}. The columns -correspond to periods.\cr -dyn\_irfp\_{\it exovar}\_var & Matrix -$nendo\times nper$. The variances of positive impulse response -functions.\cr -dyn\_irfm\_{\it exovar}\_mean & Same as {\tt -dyn\_irfp\_}{\it exovar}{\tt \_mean} but for negative impulse.\cr -dyn\_irfp\_{\it exovar}\_var & Same as {\tt -dyn\_irfp\_}{\it exovar}{\tt \_var} but for negative impulse.\cr -dyn\_simul\_points & A simulation path along which the check was -done. Rows correspond to endogenous variables, columns to -periods. Appears only if {\tt --check P}.\cr -dyn\_simul\_errors & Errors along {\tt -dyn\_simul\_points}. The rows correspond to equations as stated in the -model file, the columns to the periods. Appears only if {\tt --check -P}\cr -dyn\_ellipse\_points & A set of points on the ellipse at which the -approximation was checked. Rows correspond to state endogenous -variables (the upper part of {\tt dyn\_state\_vars}, this means -without shocks), and columns correspond to periods. Appears only if -{\tt --check E}.\cr -dyn\_ellipse\_errors & Errors on the ellipse points {\tt -dyn\_ellipse\_points}. The rows correspond to the equations as stated -in the model file, columns to periods. Appears only if {\tt --check -E}.\cr -dyn\_shock\_{\it exovar}\_errors& Errors along a shock named {\it -exovar}. The rows correspond to the equations as stated in the model -file. There are $2m+1$ columns, the middle column is the error at zero -shock. The columns to the left correspond to negative values, columns -to the right to positive. Appears only if {\tt --check S}.\cr -} - -\subsection{Journal File} -\label{journalfile} - -The journal file provides information on resources usage during the -run and gives some informative messages. The journal file is a text -file, it is organized in single line records. The format of records is -documented in a header of the journal file. - -The journal file should be consulted in the following circumstances: -\begin{itemize} -\item Something goes wrong. For example, if a model is not -Blanchard--Kahn stable, then the eigenvalues are dumped to the journal -file. - -If the unconditional covariance matrix {\tt dyn\_vcov} is NaN, then -from the journal file you will know that all the simulations had to be -thrown away due to occurrence of NaN or Inf. This is caused by -non-stationarity of the resulting decision rule. - -If Dynare++ crashes, the journal file can be helpful for guessing a -point where it crashed. - -\item You are impatient. You might be looking at the journal file -during the run in order to have a better estimate about the time when -the calculations are finished. In Unix, I use a command {\tt tail -f -blah.jnl}.\footnote{This helps to develop one of the three -programmer's virtues: {\it impatience}. The other two are {\it -laziness} and {\it hubris}; according to Larry Wall.} - -\item Heavy swapping. If the physical memory is not -sufficient, an operating system starts swapping memory pages with a -disk. If this is the case, the journal file can be consulted for -information on memory consumption and swapping activity. - -\item Not sure what Dynare++ is doing. If so, read the journal file, -which contains a detailed record on what was calculated, simulated -etc. -\end{itemize} - -\subsection{Dump File} -\label{dumpfile} - -The dump file is always created with the suffix {\tt .dump}. It is a -text file which takes a form of a model file. It sets the parameter -values which were used, it has the initval section setting the values -which were finally used, and mainly it has a model section of all -equations with all substitutions and formed the first order conditions -of the planner. - -The dump file serves for debugging purposes, since it contains the -mathematical problem which is being solved by dynare++. - -\subsection{MATLAB Scripts for Steady State Calculations} -\label{output_matlab_scripts} - -This section describes two MATLAB scripts, which are useful when -calculating the deterministic steady state outside Dynare++. The -scripts are created by Dynare++ as soon as an input file is parsed, -that is before any calculations. - -The first MATLAB script having a name {\tt {\it modname}\_f.m} for -given parameters values and given all endogenous variables $y$ -calculates a residual of the static system. Supposing the model is in -the form of \eqref{focs}, the script calculates a vector: -\[ -f(y,y,y,0) -\] - -The second script having a name {\tt {\it modname}\_ff.m} calculates a matrix: -\[ -\frac{\partial}{\partial y}f(y,y,y,0) -\] - -Both scripts take two arguments. The first is a vector of parameter -values ordered in the same ordering as declared in the model file. The -second is a vector of all endogenous variables at which the evaluation -is performed. These endogenous variables also include auxiliary -variables automatically added by Dynare++ and Lagrange multipliers if -an optimal policy problem is solved. If no endogenous variable has not -been added by Dynare++, then the ordering is the same as the ordering -in declaration in the model file. If some endogenous variables have -been added, then the ordering can be read from comments close to the -top of either two files. - -For example, if we want to calculate the deterministic steady state of -the {\tt kp1980.dyn} model, we need to do the following: -\begin{enumerate} -\item Run Dynare++ with {\tt kp1980.dyn}, no matter if the calculation -has not been finished, important output are the two MATLAB scripts -created just in the beginning. -\item Consult file {\tt kp1980\_f.m}\ to get the ordering of parameters -and all endogenous variables. -\item Create a vector {\tt p} with the parameter values in the ordering -\item Create a vector {\tt init\_y} with the initial guess for the -MATLAB solver {\tt fsolve} -\item Create a simple MATLAB function called {\tt kp1980\_fsolve.m}\ -returning the residual and Jacobian: -{\small -\begin{verbatim} -function [r, J] = kp1980_fsolve(p, y) - r = kp1980_f(p, y); - J = kp1980_ff(p, y); -\end{verbatim} -} -\item In the MATLAB prompt, run the following: -{\small -\begin{verbatim} -opt=optimset('Jacobian','on','Display','iter'); -y=fsolve(@(y) kp1980_fsolve(p,y), init_y, opt); -\end{verbatim} -} -\end{enumerate} - - -\subsection{Custom Simulations} -\label{custom} - -When Dynare++ run is finished it dumps the derivatives of the -calculated decision rule to the MAT file. The derivatives can be used -for a construction of the decision rule and custom simulations can be -run. This is done by {\tt dynare\_simul.m} M-file in MATLAB. It reads -the derivatives and simulates the decision rule with provided -realization of shocks. - -All the necessary documentation can be viewed by the command: -{\small -\begin{verbatim} -help dynare_simul -\end{verbatim} -} - -\end{document} diff --git a/dynare++/dynare_simul/dynare_simul.m b/dynare++/dynare_simul/dynare_simul.m deleted file mode 100644 index 293d3a732..000000000 --- a/dynare++/dynare_simul/dynare_simul.m +++ /dev/null @@ -1,176 +0,0 @@ -% -% SYNOPSIS -% -% r = dynare_simul(name, shocks) -% r = dynare_simul(name, prefix, shocks) -% r = dynare_simul(name, shocks, start) -% r = dynare_simul(name, prefix, shocks, start) -% -% name name of MAT-file produced by dynare++ -% prefix prefix of variables in the MAT-file -% shocks matrix of shocks -% start zero period value -% -% Note that this file requires the dynare_simul_ DLL to be in the path. -% This DLL is distributed with Dynare, under the mex/matlab or mex/octave -% subdirectory. -% -% SEMANTICS -% -% The command reads a decision rule from the MAT-file having the given -% prefix. Then it starts simulating the decision rule with zero time value -% equal to the given start. It uses the given shocks for the simulation. If -% the start is not given, the state about which the decision rule is -% centralized is taken (called fix point, or stochastic steady state, take -% your pick). -% -% prefix Use the prefix with which you called dynare++, the default -% prefix in dynare++ is 'dyn'. -% shocks Number of rows must be a number of exogenous shocks, -% number of columns gives the number of simulated -% periods. NaNs and Infs in the matrix are substitued by -% draws from the normal distribution using the covariance -% matrix given in the model file. -% start Vector of endogenous variables in the ordering given by -% _vars. -% -% Seed for random generator is derived from calling rand(1,1). Therefore, -% seeding can be controlled with rand('state') and rand('state',some_seed). -% -% EXAMPLES -% -% All examples suppose that the prefix is 'dyn' and that your_model.mat -% has been loaded into Matlab. -% -% 1. response to permanent negative shock to the third exo var EPS3 for -% 100 periods -% -% shocks = zeros(4,100); % 4 exogenous variables in the model -% shocks(dyn_i_EPS3,:) = -0.1; % the permanent shock to EPS3 -% r = dynare_simul('your_model.mat',shocks); -% -% 2. one stochastic simulation for 100 periods -% -% shocks = zeros(4,100)./0; % put NaNs everywhere -% r = dynare_simul('your_model.mat',shocks); -% -% 3. one stochastic simulation starting at 75% undercapitalized economy -% -% shocks = zeros(4,100)./0; % put NaNs everywhere -% ystart = dyn_ss; % get copy of DR fix point -% ystart(dyn_i_K) = 0.75*dyn_ss(dyn_i_K); % scale down the capital -% r = dynare_simul('your_model.mat',shocks,ystart); -% -% -% SEE ALSO -% -% "DSGE Models with Dynare++. A Tutorial.", Ondra Kamenik, 2005 - -% Copyright © 2005-2011, Ondra Kamenik -% Copyright © 2020, Dynare Team - - -function r = dynare_simul(varargin) - -if ~exist('dynare_simul_','file') - error('Can''t find dynare_simul_ DLL in the path. The simplest way to add it is to run Dynare once in this session.') -end - -% get the file name and load data -fname = varargin{1}; -load(fname); - -% set prefix, shocks, ystart -if ischar(varargin{2}) - prefix = varargin{2}; - if length(varargin) == 3 - shocks = varargin{3}; - ystart = NaN; - elseif length(varargin) == 4 - shocks = varargin{3}; - ystart = varargin{4}; - else - error('Wrong number of parameters.'); - end -else - prefix = 'dyn'; - if length(varargin) == 2 - shocks = varargin{2}; - ystart = NaN; - elseif length(varargin) == 3 - shocks = varargin{2}; - ystart = varargin{3}; - else - error('Wrong number of parameters.'); - end -end - -% load all needed variables but prefix_g_* -if exist([prefix '_nstat'],'var') - nstat = eval([prefix '_nstat']); -else - error(['Could not find variable ' prefix '_nstat in workspace']); -end -if exist([prefix '_npred'],'var') - npred = eval([prefix '_npred']); -else - error(['Could not find variable ' prefix '_npred in workspace']); -end -if exist([prefix '_nboth'],'var') - nboth = eval([prefix '_nboth']); -else - error(['Could not find variable ' prefix '_nboth in workspace']); -end -if exist([prefix '_nforw'],'var') - nforw = eval([prefix '_nforw']); -else - error(['Could not find variable ' prefix '_nforw in workspace']); -end -if exist([prefix '_ss'],'var') - ss = eval([prefix '_ss']); -else - error(['Could not find variable ' prefix '_ss in workspace']); -end -if exist([prefix '_vcov_exo'],'var') - vcov_exo = eval([prefix '_vcov_exo']); -else - error(['Could not find variable ' prefix '_vcov_exo in workspace']); -end -nexog = size(vcov_exo,1); - -if isnan(ystart) - ystart = ss; -end - -% newer version of dynare++ doesn't return prefix_g_0, we make it here if -% it does not exist in workspace -g_zero = [prefix '_g_0']; -if ~exist(g_zero,'var') - dr.g_0=zeros(nstat+npred+nboth+nforw,1); -else - dr.g_0=eval(g_zero); -end - -% make derstr a string of comma seperated existing prefix_g_* -order = 1; -cont = 1; -while cont == 1 - g_ord = [prefix '_g_' num2str(order)]; - if exist(g_ord,'var') - dr.(['g_' num2str(order)])=eval(g_ord); - order = order + 1; - else - cont = 0; - end -end - -% set seed -seed = ceil(10000*rand(1,1)); - -% call dynare_simul_ -[err,r]=dynare_simul_(order-1,nstat,npred,nboth,nforw,... - nexog,ystart,shocks,vcov_exo,seed,ss,dr); - -if err - error('Simulation failed') -end \ No newline at end of file diff --git a/dynare++/integ/Makefile.am b/dynare++/integ/Makefile.am deleted file mode 100644 index 24104f1e7..000000000 --- a/dynare++/integ/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = cc src testing diff --git a/dynare++/integ/cc/Makefile.am b/dynare++/integ/cc/Makefile.am deleted file mode 100644 index 4e98a7640..000000000 --- a/dynare++/integ/cc/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -noinst_LIBRARIES = libinteg.a - -libinteg_a_SOURCES = \ - quadrature.cc \ - quadrature.hh \ - quasi_mcarlo.cc \ - quasi_mcarlo.hh \ - product.cc \ - product.hh \ - smolyak.cc \ - smolyak.hh \ - vector_function.cc \ - vector_function.hh \ - precalc_quadrature.hh -libinteg_a_CPPFLAGS = -I../../sylv/cc -I../../utils/cc -I../../tl/cc -I$(top_srcdir)/mex/sources diff --git a/dynare++/integ/src/Makefile.am b/dynare++/integ/src/Makefile.am deleted file mode 100644 index 6eec5e1b4..000000000 --- a/dynare++/integ/src/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -noinst_PROGRAMS = quadrature-points - -quadrature_points_SOURCES = quadrature-points.cc -quadrature_points_CPPFLAGS = -I../.. -I../../sylv/cc -I../../integ/cc -I../../tl/cc -I../../utils/cc -quadrature_points_LDADD = ../cc/libinteg.a ../../tl/cc/libtl.a ../../parser/cc/libparser.a ../../sylv/cc/libsylv.a ../../utils/cc/libutils.a $(LAPACK_LIBS) $(BLAS_LIBS) $(LIBS) $(FLIBS) diff --git a/dynare++/integ/src/quadrature-points.cc b/dynare++/integ/src/quadrature-points.cc deleted file mode 100644 index b4ed5206b..000000000 --- a/dynare++/integ/src/quadrature-points.cc +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright © 2008-2011 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "parser/cc/matrix_parser.hh" -#include "utils/cc/exception.hh" -#include "sylv/cc/GeneralMatrix.hh" -#include "sylv/cc/Vector.hh" -#include "sylv/cc/SymSchurDecomp.hh" -#include "sylv/cc/SylvException.hh" -#include "integ/cc/quadrature.hh" -#include "integ/cc/smolyak.hh" -#include "integ/cc/product.hh" - -#include - -#include -#include -#include -#include -#include -#include -#include - -struct QuadParams -{ - std::string outname; - std::string vcovname; - int max_level{3}; - double discard_weight{0.0}; - QuadParams(int argc, char **argv); - void check_consistency() const; -private: - enum class opt { max_level, discard_weight, vcov }; -}; - -QuadParams::QuadParams(int argc, char **argv) -{ - if (argc == 1) - { - // Print the help and exit - std::cerr << "Usage: " << argv[0] << " [--max-level INTEGER] [--discard-weight FLOAT] [--vcov FILENAME] OUTPUT_FILENAME" << std::endl; - std::exit(EXIT_FAILURE); - } - - outname = argv[argc-1]; - argc--; - - struct option const opts[] = { - {"max-level", required_argument, nullptr, static_cast(opt::max_level)}, - {"discard-weight", required_argument, nullptr, static_cast(opt::discard_weight)}, - {"vcov", required_argument, nullptr, static_cast(opt::vcov)}, - {nullptr, 0, nullptr, 0} - }; - - int ret; - int index; - while (-1 != (ret = getopt_long(argc, argv, "", opts, &index))) - { - if (ret == '?') - { - std::cerr << "Unknown option, ignored\n"; - continue; - } - - switch (static_cast(ret)) - { - case opt::max_level: - try - { - max_level = std::stoi(optarg); - } - catch (const std::invalid_argument &e) - { - std::cerr << "Couldn't parse integer " << optarg << ", ignored" << std::endl; - } - break; - case opt::discard_weight: - try - { - discard_weight = std::stod(optarg); - } - catch (const std::invalid_argument &e) - { - std::cerr << "Couldn't parse float " << optarg << ", ignored" << std::endl; - } - break; - case opt::vcov: - vcovname = optarg; - break; - } - } - - check_consistency(); -} - -void -QuadParams::check_consistency() const -{ - if (outname.empty()) - { - std::cerr << "Error: output name not set" << std::endl; - std::exit(EXIT_FAILURE); - } - - if (vcovname.empty()) - { - std::cerr << "Error: vcov file name not set" << std::endl; - std::exit(EXIT_FAILURE); - } -} - -int -main(int argc, char **argv) -{ - QuadParams params(argc, argv); - - // Open output file for writing - std::ofstream fout{params.outname, std::ios::out | std::ios::trunc}; - if (fout.fail()) - { - std::cerr << "Could not open " << params.outname << " for writing" << std::endl; - std::exit(EXIT_FAILURE); - } - - try - { - std::ifstream f{params.vcovname}; - std::ostringstream buffer; - buffer << f.rdbuf(); - std::string contents{buffer.str()}; - - // Parse the vcov matrix - ogp::MatrixParser mp; - mp.parse(contents); - if (mp.nrows() != mp.ncols()) - throw ogu::Exception(__FILE__, __LINE__, - "VCOV matrix not square"); - // And put to the GeneralMatrix - GeneralMatrix vcov(mp.nrows(), mp.ncols()); - vcov.zeros(); - for (ogp::MPIterator it = mp.begin(); it != mp.end(); ++it) - vcov.get(it.row(), it.col()) = *it; - - // Calculate the factor A of vcov, so that A·Aᵀ=VCOV - GeneralMatrix A(vcov.nrows(), vcov.nrows()); - SymSchurDecomp ssd(vcov); - ssd.getFactor(A); - - // Construct Gauss-Hermite quadrature - GaussHermite ghq; - // Construct Smolyak quadrature - int level = params.max_level; - SmolyakQuadrature sq(vcov.nrows(), level, ghq); - - std::cout << "Dimension: " << vcov.nrows() << std::endl - << "Maximum level: " << level << std::endl - << "Total number of nodes: " << sq.numEvals(level) << std::endl; - - // Put the points to the vector - std::vector> points; - for (smolpit qit = sq.start(level); qit != sq.end(level); ++qit) - points.push_back(std::make_unique(const_cast(qit.point()))); - // Sort and uniq - std::sort(points.begin(), points.end(), [](auto &a, auto &b) { return a.get() < b.get(); }); - auto new_end = std::unique(points.begin(), points.end()); - points.erase(new_end, points.end()); - - std::cout << "Duplicit nodes removed: " << static_cast(sq.numEvals(level)-points.size()) - << std::endl; - - // Calculate weights and mass - double mass = 0.0; - std::vector weights; - for (auto &point : points) - { - weights.push_back(std::exp(-point->dot(*point))); - mass += weights.back(); - } - - // Calculate discarded mass - double discard_mass = 0.0; - for (double weight : weights) - if (weight/mass < params.discard_weight) - discard_mass += weight; - - std::cout << "Total mass discarded: " << std::fixed << discard_mass/mass << std::endl; - - // Dump the results - int npoints = 0; - double upscale_weight = 1/(mass-discard_mass); - Vector x(vcov.nrows()); - fout << std::setprecision(16); - for (int i = 0; i < static_cast(weights.size()); i++) - if (weights[i]/mass >= params.discard_weight) - { - // Print the upscaled weight - fout << std::setw(20) << upscale_weight*weights[i]; - // Multiply point with the factor A and √2 - A.multVec(0.0, x, std::sqrt(2.), *(points[i])); - // Print the coordinates - for (int j = 0; j < x.length(); j++) - fout << ' ' << std::setw(20) << x[j]; - fout << std::endl; - npoints++; - } - - std::cout << "Final number of points: " << npoints << std::endl; - - fout.close(); - } - catch (const SylvException &e) - { - e.printMessage(); - return EXIT_FAILURE; - } - catch (const ogu::Exception &e) - { - e.print(); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} diff --git a/dynare++/kord/Makefile.am b/dynare++/kord/Makefile.am deleted file mode 100644 index 2779a7544..000000000 --- a/dynare++/kord/Makefile.am +++ /dev/null @@ -1,40 +0,0 @@ -noinst_LIBRARIES = libkord.a - -libkord_a_SOURCES = \ - approximation.cc \ - approximation.hh \ - decision_rule.cc \ - decision_rule.hh \ - dynamic_model.cc \ - dynamic_model.hh \ - faa_di_bruno.cc \ - faa_di_bruno.hh \ - first_order.cc \ - first_order.hh \ - global_check.cc \ - global_check.hh \ - kord_exception.hh \ - korder.cc \ - korder.hh \ - korder_stoch.cc \ - korder_stoch.hh \ - journal.cc \ - journal.hh \ - normal_conjugate.cc \ - normal_conjugate.hh \ - seed_generator.cc \ - seed_generator.hh - -libkord_a_CPPFLAGS = -I../sylv/cc -I../tl/cc -I../integ/cc -I../utils/cc -I$(top_srcdir)/mex/sources $(CPPFLAGS_MATIO) -DDYNVERSION=\"$(PACKAGE_VERSION)\" - -check_PROGRAMS = tests - -tests_SOURCES = tests.cc -tests_CPPFLAGS = -I../sylv/cc -I../tl/cc -I../integ/cc -I../utils/cc -I$(top_srcdir)/mex/sources -tests_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_MATIO) -tests_LDADD = libkord.a ../tl/cc/libtl.a ../sylv/cc/libsylv.a ../utils/cc/libutils.a $(LAPACK_LIBS) $(BLAS_LIBS) $(LIBS) $(FLIBS) $(LIBADD_MATIO) - -check-local: - ./tests - -CLEANFILES = out.txt diff --git a/dynare++/parser/cc/Makefile.am b/dynare++/parser/cc/Makefile.am deleted file mode 100644 index 6294c1cf3..000000000 --- a/dynare++/parser/cc/Makefile.am +++ /dev/null @@ -1,43 +0,0 @@ -noinst_LIBRARIES = libparser.a - -GENERATED_FILES = assign_tab.cc formula_tab.cc matrix_tab.cc assign_tab.hh formula_tab.hh matrix_tab.hh assign_ll.cc formula_ll.cc matrix_ll.cc - -libparser_a_SOURCES = \ - location.hh \ - atom_assignings.cc \ - atom_assignings.hh \ - atom_substitutions.cc \ - atom_substitutions.hh \ - dynamic_atoms.cc \ - dynamic_atoms.hh \ - fine_atoms.cc \ - fine_atoms.hh \ - formula_parser.cc \ - formula_parser.hh \ - matrix_parser.cc \ - matrix_parser.hh \ - parser_exception.cc \ - parser_exception.hh \ - static_atoms.cc \ - static_atoms.hh \ - static_fine_atoms.cc \ - static_fine_atoms.hh \ - tree.cc \ - tree.hh \ - $(GENERATED_FILES) - -libparser_a_CPPFLAGS = -I../.. $(BOOST_CPPFLAGS) - -BUILT_SOURCES = $(GENERATED_FILES) - -EXTRA_DIST = assign.yy formula.yy matrix.yy assign.ll formula.ll matrix.ll - -%_tab.cc %_tab.hh: %.yy - $(YACC) -W -o$*_tab.cc $< - -%_tab.$(OBJEXT): CXXFLAGS += -Wno-old-style-cast - -%_ll.cc: %.ll - $(LEX) -i -o$@ $< - -%_ll.$(OBJEXT): CXXFLAGS += -Wno-old-style-cast diff --git a/dynare++/parser/cc/assign.ll b/dynare++/parser/cc/assign.ll deleted file mode 100644 index 64d756ffe..000000000 --- a/dynare++/parser/cc/assign.ll +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- C++ -*- */ -/* - * Copyright © 2004-2011 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ -%{ -#include "location.hh" -#include "assign_tab.hh" - -#define YY_USER_ACTION SET_LLOC(asgn_); -%} - -%option nounput -%option noyy_top_state -%option stack -%option yylineno -%option prefix="asgn_" -%option never-interactive -%x CMT - -%% - - /* comments */ -<*>"/*" {yy_push_state(CMT);} -[^*\n]* -"*"+[^*/\n]* -"*"+"/" {yy_pop_state();} -[\n] -"//".*\n - - /* spaces */ -[ \t\r\n] {return BLANK;} - - /* names */ -[A-Za-z_][A-Za-z0-9_]* { - asgn_lval.string = asgn_text; - return NAME; -} - -; {return SEMICOLON;} -= {return EQUAL_SIGN;} -. { - asgn_lval.character = asgn_text[0]; - return CHARACTER; -} - -%% - -int -asgn_wrap() -{ - return 1; -} - -void -asgn__destroy_buffer(void* p) -{ - asgn__delete_buffer(static_cast(p)); -} diff --git a/dynare++/parser/cc/assign.yy b/dynare++/parser/cc/assign.yy deleted file mode 100644 index 167063c60..000000000 --- a/dynare++/parser/cc/assign.yy +++ /dev/null @@ -1,76 +0,0 @@ -// -*- C++ -*- -/* - * Copyright © 2006-2011 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -%code requires -{ -#include "location.hh" -#define ASGN_LTYPE ogp::location_type -} - -%code -{ -#include "atom_assignings.hh" -#include - -void asgn_error(std::string); -int asgn_lex(); -extern ogp::AtomAssignings* aparser; -} - -%union -{ - int integer; - char *string; - char character; -} - -%token EQUAL_SIGN SEMICOLON CHARACTER BLANK -%token NAME; - -%define api.prefix {asgn_} - -%locations -%defines -%define parse.error verbose - -%% - -root : assignments | %empty; - -assignments : assignments BLANK | assignments assignment | assignment | BLANK; - -assignment : NAME EQUAL_SIGN material SEMICOLON { - aparser->add_assignment(@1.off, $1, @1.ll, @3.off-@1.off, @3.ll + @4.ll);} - | NAME space EQUAL_SIGN material SEMICOLON { - aparser->add_assignment(@1.off, $1, @1.ll, @4.off-@1.off, @4.ll + @5.ll);} - ; - -material : material CHARACTER | material NAME | material BLANK | NAME | CHARACTER | BLANK; - -space : space BLANK | BLANK; - -%% - -void -asgn_error(std::string mes) -{ - aparser->error(std::move(mes)); -} diff --git a/dynare++/parser/cc/atom_assignings.cc b/dynare++/parser/cc/atom_assignings.cc deleted file mode 100644 index dc4b99550..000000000 --- a/dynare++/parser/cc/atom_assignings.cc +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "atom_assignings.hh" -#include "location.hh" -#include "parser_exception.hh" - -#include "utils/cc/exception.hh" - -#include -#include -#include -#include - -using namespace ogp; - -AtomAssignings::AtomAssignings(const AtomAssignings &aa, ogp::StaticAtoms &a) - : atoms(a), expr(aa.expr, atoms), left_names(aa.left_names), - lname2expr(aa.lname2expr), order(aa.order) -{ -} - -/** A global symbol for passing info to the AtomAssignings from - * asgn_parse(). */ -AtomAssignings *aparser; - -/** The declaration of functions defined in asgn_ll.cc and asgn_tab.cc - * generated from assign.lex assign.y */ -void *asgn__scan_string(const char *); -void asgn__destroy_buffer(void *); -void asgn_parse(); -extern location_type asgn_lloc; - -void -AtomAssignings::parse(const string &stream) -{ - asgn_lloc.off = 0; - asgn_lloc.ll = 0; - void *p = asgn__scan_string(stream.c_str()); - aparser = this; - asgn_parse(); - asgn__destroy_buffer(p); -} - -void -AtomAssignings::error(string mes) -{ - throw ParserException(std::move(mes), asgn_lloc.off); -} - -void -AtomAssignings::add_assignment_to_double(string name, double val) -{ - // if left hand side is a registered atom, insert it to tree - int t; - try - { - if (atoms.check(name)) - t = expr.add_nulary(name); - else - t = -1; - } - catch (const ParserException &e) - { - t = -1; - } - // register left hand side in order - order.push_back(t); - - // add the double to the tree - std::ostringstream buf; - buf << std::setprecision(std::numeric_limits::max_digits10) - << val; - try - { - expr.parse(buf.str()); - } - catch (const ParserException &e) - { - // should never happen - throw ParserException("Error parsing double "+buf.str()+": "+e.message(), 0); - } - - // register name of the left hand side and put to lname2expr - left_names.insert(name); - lname2expr.emplace(std::move(name), order.size()-1); -} - -void -AtomAssignings::add_assignment(int asgn_off, const string &str, int name_len, - int right_off, int right_len) -{ - // the order of doing things here is important: since the - // FormulaParser requires that all references from the i-th tree - // refere to trees with index lass than i, so to capture also a - // nulary term for the left hand side, it must be inserted to the - // expression tree before the expression is parsed. - - // find the name in the atoms - string name = str.substr(0, name_len); - - // if left hand side is a registered atom, insert it to tree - int t; - try - { - t = atoms.check(name); - if (t == -1) - t = expr.add_nulary(name); - } - catch (const ParserException &e) - { - atoms.register_name(name); - t = expr.add_nulary(name); - } - // register left hand side in order - order.push_back(t); - - // parse expression on the right - try - { - expr.parse(str.substr(right_off, right_len)); - } - catch (const ParserException &e) - { - throw ParserException(e, asgn_off+right_off); - } - - // register name of the left hand side and put to lname2expr - left_names.insert(name); - if (lname2expr.find(name) != lname2expr.end()) - { - // Prevent the occurrence of #415 - std::cerr << "Changing the value of " << name << " through a second assignment (e.g. in initval) is not supported. Aborting." << std::endl; - exit(EXIT_FAILURE); - } - lname2expr[name] = order.size()-1; -} - -void -AtomAssignings::apply_subst(const AtomSubstitutions::Toldnamemap &mm) -{ - // go through all old variables and see what are their derived new - // variables - for (const auto &it : mm) - { - const string &oldname = it.first; - const AtomSubstitutions::Tshiftnameset &sset = it.second; - if (!sset.empty()) - { - int told = atoms.index(oldname); - if (told < 0 && !atoms.get_name_storage().query(oldname)) - atoms.register_name(oldname); - if (told == -1) - told = expr.add_nulary(oldname); - // at least one substitution here, so make an expression - expr.add_formula(told); - // say that this expression is not assigned to any atom - order.push_back(-1); - // now go through all new names derived from the old name and - // reference to the newly added formula - for (const auto &itt : sset) - { - const string &newname = itt.first; - left_names.insert(newname); - lname2expr.emplace(newname, expr.nformulas()-1); - } - } - } -} - -void -AtomAssignings::print() const -{ - std::cout << "Atom Assignings\nExpressions:\n"; - expr.print(); - std::cout << "Left names:\n"; - for (auto it : lname2expr) - std::cout << it.first << " ⇒ " << expr.formula(it.second) << " (t=" << order[it.second] << ")\n"; -} - -void -AtomAsgnEvaluator::setValues(EvalTree &et) const -{ - // set values of constants - aa.atoms.setValues(et); - - // set values of variables to NaN or to user set values - double nan = std::numeric_limits::quiet_NaN(); - for (int i = 0; i < aa.atoms.nvar(); i++) - { - const string &ss = aa.atoms.name(i); - int t = aa.atoms.index(ss); - if (t >= 0) - { - auto it = user_values.find(t); - if (it == user_values.end()) - et.set_nulary(t, nan); - else - et.set_nulary(t, it->second); - } - } -} - -void -AtomAsgnEvaluator::set_user_value(const string &name, double val) -{ - int t = aa.atoms.index(name); - if (t >= 0) - { - auto it = user_values.find(t); - if (it == user_values.end()) - user_values.emplace(t, val); - else - it->second = val; - } -} - -void -AtomAsgnEvaluator::load(int i, double res) -{ - // set the value - operator[](i) = res; - // if i-th expression is atom, set its value to this EvalTree - int t = aa.order[i]; - if (t >= 0) - etree.set_nulary(t, res); -} - -double -AtomAsgnEvaluator::get_value(const string &name) const -{ - auto it = aa.lname2expr.find(name); - if (it == aa.lname2expr.end()) - return std::numeric_limits::quiet_NaN(); - else - return operator[](it->second); -} diff --git a/dynare++/parser/cc/atom_assignings.hh b/dynare++/parser/cc/atom_assignings.hh deleted file mode 100644 index e5a124135..000000000 --- a/dynare++/parser/cc/atom_assignings.hh +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef OGP_ATOM_ASSIGNINGS_H -#define OGP_ATOM_ASSIGNINGS_H - -#include "static_atoms.hh" -#include "formula_parser.hh" -#include "atom_substitutions.hh" - -#include -#include - -namespace ogp -{ - class AtomAsgnEvaluator; - - /** This class represents atom assignments used in parameters - * settings and initval initialization. It maintains atoms of the - * all expressions on the right hand side, the parsed formulas of - * the right hand sides, and the information about the left hand - * sides. See documentation to the order member below. */ - class AtomAssignings - { - friend class AtomAsgnEvaluator; - protected: - using Tvarintmap = std::map; - /** All atoms which should be sufficient for formulas at the - * right hand sides. The atoms should be filled with names - * (preregistered). This is a responsibility of the caller. */ - StaticAtoms &atoms; - /** The formulas of right hand sides. */ - FormulaParser expr; - /** Name storage of the names from left hand sides. */ - NameStorage left_names; - /** Information on left hand sides. This maps a name to the - * index of its assigned expression in expr. More than one - * name may reference to the same expression. */ - Tvarintmap lname2expr; - /** Information on left hand sides. If order[i] >= 0, then it - * says that i-th expression in expr is assigned to atom with - * order[i] tree index. */ - std::vector order; - public: - /** Construct the object using the provided static atoms. */ - AtomAssignings(StaticAtoms &a) : atoms(a), expr(atoms) - { - } - /** Make a copy with provided reference to (posibly different) - * static atoms. */ - AtomAssignings(const AtomAssignings &aa, StaticAtoms &a); - virtual ~AtomAssignings() = default; - /** Parse the assignments from the given string. */ - void parse(const string &stream); - /** Process a syntax error from bison. */ - void error(string mes); - /** Add an assignment of the given name to the given - * double. Can be called by a user, anytime. */ - void add_assignment_to_double(string name, double val); - /** Add an assignment. Called from assign.y. */ - void add_assignment(int asgn_off, const string &str, int name_len, - int right_off, int right_len); - /** This applies old2new map (possibly from atom - * substitutions) to this object. It registers new variables - * in the atoms, and adds the expressions to expr, and left - * names to lname2expr. The information about dynamical part - * of substitutions is ignored, since we are now in the static - * world. */ - void apply_subst(const AtomSubstitutions::Toldnamemap &mm); - /** Debug print. */ - void print() const; - }; - - /** This class basically evaluates the atom assignments - * AtomAssignings, so it inherits from ogp::FormulaEvaluator. It - * is also a storage for the results of the evaluation stored as a - * vector, so the class inherits from std::vector and - * ogp::FormulaEvalLoader. As the expressions for atoms are - * evaluated, the results are values for atoms which will be - * used in subsequent evaluations. For this reason, the class - * inherits also from AtomValues. */ - class AtomAsgnEvaluator : public FormulaEvalLoader, - public AtomValues, - protected FormulaEvaluator, - public std::vector - { - protected: - using Tusrvalmap = std::map; - Tusrvalmap user_values; - const AtomAssignings &aa; - public: - AtomAsgnEvaluator(const AtomAssignings &a) - : FormulaEvaluator(a.expr), - std::vector(a.expr.nformulas()), aa(a) - { - } - ~AtomAsgnEvaluator() override = default; - /** This sets all initial values to NaNs, all constants and - * all values set by user by call set_value. This is called by - * FormulaEvaluator::eval() method, which is called by eval() - * method passing this argument as AtomValues. So the - * ogp::EvalTree will be always this->etree. */ - void setValues(EvalTree &et) const override; - /** User setting of the values. For example in initval, - * parameters are known and should be set to their values. In - * constrast endogenous variables are set initially to NaNs by - * AtomValues::setValues. */ - void set_user_value(const string &name, double val); - /** This sets the result of i-th expression in aa to res, and - * also checks whether the i-th expression is an atom. If so, - * it sets the value of the atom in ogp::EvalTree - * this->etree. */ - void load(int i, double res) override; - /** After the user values have been set, the assignments can - * be evaluated. For this purpose we have eval() method. The - * result is that this object as std::vector will - * contain the values. It is ordered given by formulas in - * expr. */ - void - eval() - { - FormulaEvaluator::eval(*this, *this); - } - /** This returns a value for a given name. If the name is not - * found among atoms, or there is no assignment for the atom, - * NaN is returned. */ - double get_value(const string &name) const; - }; -}; - -#endif diff --git a/dynare++/parser/cc/atom_substitutions.cc b/dynare++/parser/cc/atom_substitutions.cc deleted file mode 100644 index 83d4f42ce..000000000 --- a/dynare++/parser/cc/atom_substitutions.cc +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "atom_substitutions.hh" -#include "utils/cc/exception.hh" - -using namespace ogp; - -AtomSubstitutions::AtomSubstitutions(const AtomSubstitutions &as, const FineAtoms &oa, - FineAtoms &na) - : new2old(as.new2old), old2new(as.old2new), old_atoms(oa), new_atoms(na) -{ -} - -void -AtomSubstitutions::add_substitution(string newname, string oldname, int tshift) -{ - // insert to new2old map - new2old.emplace(newname, Tshiftname(oldname, tshift)); - // insert to old2new map - auto it = old2new.find(oldname); - if (it != old2new.end()) - it->second.emplace(std::move(newname), -tshift); - else - { - Tshiftnameset snset; - snset.emplace(std::move(newname), -tshift); - old2new.emplace(std::move(oldname), snset); - } - - // put to info - info.num_substs++; -} - -void -AtomSubstitutions::substitutions_finished(VarOrdering::ord_type ot) -{ - // create an external ordering of new_atoms from old_atoms - const vector &oa_ext = old_atoms.get_allvar(); - vector na_ext; - for (const auto &oname : oa_ext) - { - // add the old name itself - na_ext.push_back(oname); - // add all new names derived from the old name - auto it = old2new.find(oname); - if (it != old2new.end()) - for (const auto &itt : it->second) - na_ext.push_back(itt.first); - } - - // call parsing finished for the new_atoms - new_atoms.parsing_finished(ot, na_ext); -} - -string -AtomSubstitutions::get_new4old(const string &oldname, int tshift) const -{ - auto it = old2new.find(oldname); - if (it != old2new.end()) - { - const Tshiftnameset &sset = it->second; - for (const auto &itt : sset) - if (itt.second == -tshift) - return itt.first; - } - return ""; -} - -void -AtomSubstitutions::print() const -{ - std::cout << "Atom Substitutions:\nOld ⇒ New:\n"; - for (const auto &it : old2new) - for (const auto &itt : it.second) - std::cout << " " << it.first << " ⇒ [" << itt.first << ", " << itt.second << "]\n"; - - std::cout << "Old ⇐ New:\n"; - for (const auto &it : new2old) - std::cout << " [" << it.second.first << ", " << it.second.second << "] ⇐ " << it.first << '\n'; -} - -void -SAtoms::substituteAllLagsAndLeads(FormulaParser &fp, AtomSubstitutions &as) -{ - string name; - - int mlead, mlag; - endovarspan(mlead, mlag); - - // substitute all endo lagged more than 1 - while (!(name = findEndoWithLeadInInterval(mlag, -2)).empty()) - makeAuxVariables(name, -1, -2, mlag, fp, as); - // substitute all endo leaded more than 1 - while (!(name = findEndoWithLeadInInterval(2, mlead)).empty()) - makeAuxVariables(name, 1, 2, mlead, fp, as); - - exovarspan(mlead, mlag); - - // substitute all lagged exo - while (!(name = findExoWithLeadInInterval(mlag, -1)).empty()) - makeAuxVariables(name, -1, -1, mlag, fp, as); - // substitute all leaded exo - while (!(name = findExoWithLeadInInterval(1, mlead)).empty()) - makeAuxVariables(name, 1, 1, mlead, fp, as); - - // notify that substitution have been finished - as.substitutions_finished(order_type); -} - -void -SAtoms::substituteAllLagsAndExo1Leads(FormulaParser &fp, AtomSubstitutions &as) -{ - string name; - - int mlead, mlag; - endovarspan(mlead, mlag); - - // substitute all endo lagged more than 1 - while (!(name = findEndoWithLeadInInterval(mlag, -2)).empty()) - makeAuxVariables(name, -1, -2, mlag, fp, as); - - exovarspan(mlead, mlag); - - // substitute all lagged exo - while (!(name = findExoWithLeadInInterval(mlag, -1)).empty()) - makeAuxVariables(name, -1, -1, mlag, fp, as); - // substitute all leaded exo by 1 - while (!(name = findExoWithLeadInInterval(1, 1)).empty()) - makeAuxVariables(name, 1, 1, 1, fp, as); - - // notify that substitution have been finished - as.substitutions_finished(order_type); -} - -string -SAtoms::findNameWithLeadInInterval(const vector &names, - int ll1, int ll2) const -{ - for (auto name : names) - { - auto it = vars.find(name); - if (it != vars.end()) - { - const DynamicAtoms::Tlagmap &lmap = it->second; - for (auto itt : lmap) - if (itt.first >= ll1 && itt.first <= ll2) - return name; - } - } - - // nothing found - return ""; -} - -void -SAtoms::attemptAuxName(const string &str, int ll, string &out) const -{ - char c = (ll >= 0) ? ((ll == 0) ? 'e' : 'p') : 'm'; - string absll = std::to_string(std::abs(ll)); - int iter = 1; - do - { - out = str + '_'; - for (int i = 0; i < iter; i++) - out += c; - if (ll != 0) - out += absll; - iter++; - } - while (varnames.query(out)); -} - -void -SAtoms::makeAuxVariables(const string &name, int step, int start, int limit_lead, - FormulaParser &fp, AtomSubstitutions &as) -{ - if (!(step == 1 || step == -1)) - throw ogu::Exception(__FILE__, __LINE__, - "Wrong value of step in SAtoms::makeAuxVariables"); - if (step*start > step*limit_lead) - throw ogu::Exception(__FILE__, __LINE__, - "Wrong value of start in SAtoms::makeAuxVariables"); - - // make sure that we do not go further than necessary, this is - // that the limit lead is not behind maxlead or minlag - int mlead, mlag; - varspan(name, mlead, mlag); - if (step == -1) - limit_lead = std::max(limit_lead, mlag); - else - limit_lead = std::min(limit_lead, mlead); - - // Comment to comments: name="a"; start=-3; step=-1; - - // recover tree index of a previous atom, i.e. set tprev to a tree - // index of atom "a(-2)" - int tprev = index(name, start-step); - if (tprev == -1) - tprev = fp.add_nulary(name + '(' + std::to_string(start-step) + ')'); - - int ll = start; - do - { - // either create atom "a_m2(0)" with tree index taux and add - // equation "a_m2(0)=a(-2)" - // or - // check if "a_m2(0)" has not been already created (with - // different step), in this case do not add equation "a_m2(0) - // = a(-2)" - string newname, newname_str; - int taux; - if ((newname = as.get_new4old(name, ll-step)).empty()) - { - attemptAuxName(name, ll-step, newname_str); - newname = newname_str; - register_uniq_endo(newname); - taux = fp.add_nulary(newname + "(0)"); - // add to substitutions - as.add_substitution(newname, name, ll-step); - - // add equation "a_m2(0) = a(-2)", this is taux = tprev - fp.add_formula(fp.add_binary(code_t::MINUS, taux, tprev)); - } - else - { - // example: exogenous EPS and occurrence at both EPS(-1) - // EPS(+1) - // first call makeAuxVariables("EPS",1,1,...) will make endo EPS_p0 = EPS - // second call makeAuxVariables("EPS",-1,-1,...) will use this EPS_p0 - // to substitute for EPS(-1) - taux = index(newname, 0); - if (taux < 0) - throw ogu::Exception(__FILE__, __LINE__, - "Couldn't find tree index of previously substituted variable"); - } - - // create atom "a_m2(-1)" or turn "a(-3)" if any to "a_m2(-1)"; tree index t - int t = index(name, ll); - if (t == -1) - { - // no "a(-3)", make t <-> a_m2(-1) - t = fp.add_nulary(newname + '(' + std::to_string(step) + ')'); - } - else - { - // turn a(-3) to a_m2(-1) - unassign_variable(name, ll, t); - assign_variable(newname, step, t); - } - - // next iteration starts with tprev <-> "a_m2(-1)" (this will be made equal to "a_m3(0)") - tprev = t; - - ll += step; - } - while (step*ll <= step*limit_lead); -} diff --git a/dynare++/parser/cc/atom_substitutions.hh b/dynare++/parser/cc/atom_substitutions.hh deleted file mode 100644 index 3fbf3e80a..000000000 --- a/dynare++/parser/cc/atom_substitutions.hh +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef OGP_ATOM_SUBSTITUTIONS_H -#define OGP_ATOM_SUBSTITUTIONS_H - -#include "fine_atoms.hh" - -#include - -namespace ogp -{ - - using std::string; - using std::map; - using std::pair; - - /** This class tracts an information about the performed - * substitutions. In fact, there is only one number to keep track - * about, this is a number of substitutions. */ - struct SubstInfo - { - int num_substs{0}; - SubstInfo() = default; - }; - - /** This class tracks all atom substitutions during the job and - * then builds structures when all substitutions are finished. */ - class AtomSubstitutions - { - public: - using Tshiftname = pair; - using Tshiftmap = map; - using Tshiftnameset = set; - using Toldnamemap = map; - protected: - /** This maps a new name to a shifted old name. This is, one - * entry looks as "a_m3 ==> a(-3)", saying that a variable - * "a_m3" corresponds to a variable "a" lagged by 3. */ - Tshiftmap new2old; - /** This is inverse to new2old, which is not unique. For old - * name, say "a", it says what new names are derived with what - * shifts from the "a". For example, it can map "a" to a two - * element set {["a_m3", +3], ["a_p2", -2]}. This says that - * leading "a_m3" by 3 one gets old "a" and lagging "a_p2" by - * 2 one gets also old "a". */ - Toldnamemap old2new; - /** This is a reference to old atoms with multiple leads and - * lags. They are supposed to be used with parsing finished - * being had called, so that the external ordering is - * available. */ - const FineAtoms &old_atoms; - /** This is a reference to new atoms. All name pointers point - * to storage of these atoms. */ - FineAtoms &new_atoms; - /** Substitutions information. */ - SubstInfo info; - public: - /** Create the object with reference to the old and new - * atoms. In the beginning, old atoms are supposed to be with - * parsing_finished() called, and new atoms a simple copy of - * old atoms. The new atoms will be an instance of SAtoms. All - * substitution job is done by a substitution method of the - * new atoms. */ - AtomSubstitutions(const FineAtoms &oa, FineAtoms &na) - : old_atoms(oa), new_atoms(na) - { - } - /** Construct a copy of the object using a different instances - * of old atoms and new atoms, which are supposed to be - * semantically same as the atoms from as. */ - AtomSubstitutions(const AtomSubstitutions &as, const FineAtoms &oa, FineAtoms &na); - virtual ~AtomSubstitutions() = default; - /** This is called during the substitution job from the - * substitution method of the new atoms. This says that the - * new name, say "a_m3" is a substitution of old name "a" - * shifted by -3. */ - void add_substitution(string newname, string oldname, int tshift); - /** This is called when all substitutions are finished. This - * forms the new external ordering of the new atoms and calls - * parsing_finished() for the new atoms with the given ordering type. */ - void substitutions_finished(VarOrdering::ord_type ot); - /** Returns a new name for old name and given tshift. For "a" - * and tshift=-3, it returns "a_m3". If there is no such - * substitution, it returns an empty string. */ - string get_new4old(const string &oldname, int tshift) const; - /** Return new2old. */ - const Tshiftmap & - get_new2old() const - { - return new2old; - } - /** Return old2new. */ - const Toldnamemap & - get_old2new() const - { - return old2new; - } - /** Return substitution info. */ - const SubstInfo & - get_info() const - { - return info; - } - /** Return old atoms. */ - const FineAtoms & - get_old_atoms() const - { - return old_atoms; - } - /** Return new atoms. */ - const FineAtoms & - get_new_atoms() const - { - return new_atoms; - } - /** Debug print. */ - void print() const; - }; - - class SAtoms : public FineAtoms - { - public: - SAtoms() - : FineAtoms() - { - } - SAtoms(const SAtoms &sa) = default; - /** This substitutes all lags and leads for all exogenous and - * all lags and leads greater than 1 for all endogenous - * variables. This is useful for perfect foresight problems - * where we can do that. */ - void substituteAllLagsAndLeads(FormulaParser &fp, AtomSubstitutions &as); - /** This substitutes all lags of all endo and exo and one step - * leads of all exo variables. This is useful for stochastic - * models where we cannot solve leads more than 1. */ - void substituteAllLagsAndExo1Leads(FormulaParser &fp, AtomSubstitutions &as); - protected: - /** This finds an endogenous variable name which occurs between - * ll1 and ll2 included. */ - string - findEndoWithLeadInInterval(int ll1, int ll2) const - { - return findNameWithLeadInInterval(get_endovars(), ll1, ll2); - } - /** This finds an exogenous variable name which occurs between - * ll1 and ll2 included. */ - string - findExoWithLeadInInterval(int ll1, int ll2) const - { - return findNameWithLeadInInterval(get_exovars(), ll1, ll2); - } - - /** This attempts to find a non registered name of the form - * _m or _p. A letter 'p' is - * chosen if ll is positive, 'm' if negative. If a name of - * such form is already registered, one more character (either - * 'p' or 'm') is added and the test is performed again. The - * resulting name is returned in a string out. */ - void attemptAuxName(const string &str, int ll, string &out) const; - - /** This makes auxiliary variables to eliminate all leads/lags - * greater/less than or equal to start up to the limit_lead - * for a variable with the given name. If the limit_lead is - * greater/less than the maxlead/minlag of the variable, than - * maxlead/minlag is used. This process is recorded in - * AtomSubstitutions. The new auxiliary variables and their - * atoms are created in this object. The auxiliary equations - * are created in the given FormulaParser. The value of step - * is allowed to be either -1 (lags) or +1 (leads). */ - void makeAuxVariables(const string &name, int step, int start, int limit_lead, - FormulaParser &fp, AtomSubstitutions &as); - private: - /** This is a worker routine for findEndoWithLeadInInterval - * and findExoWithLeadInInterval. */ - string findNameWithLeadInInterval(const vector &names, - int ll1, int ll2) const; - - }; - -}; - -#endif diff --git a/dynare++/parser/cc/dynamic_atoms.cc b/dynare++/parser/cc/dynamic_atoms.cc deleted file mode 100644 index 580ec70d0..000000000 --- a/dynare++/parser/cc/dynamic_atoms.cc +++ /dev/null @@ -1,617 +0,0 @@ -/* - * Copyright © 2005 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "utils/cc/exception.hh" -#include "dynamic_atoms.hh" - -using namespace ogp; - -void -NameStorage::insert(string name) -{ - if (!query(name)) - { - name_store.push_back(name); - name_set.insert(std::move(name)); - } -} - -void -NameStorage::print() const -{ - for (auto i : name_store) - std::cout << i << '\n'; -} - -void -Constants::import_constants(const Constants &c, OperationTree &otree, Tintintmap &tmap) -{ - for (auto it : c.cmap) - { - int told = it.first; - int tnew = otree.add_nulary(); - tmap.emplace(told, tnew); - add_constant(tnew, it.second); - } -} - -void -Constants::setValues(EvalTree &et) const -{ - for (const auto &it : cmap) - et.set_nulary(it.first, it.second); -} - -void -Constants::add_constant(int t, double val) -{ - cmap.emplace(t, val); - cinvmap.emplace(val, t); -} - -bool -Constants::is_constant(int t) const -{ - if (t < OperationTree::num_constants) - return true; - auto it = cmap.find(t); - return (it != cmap.end()); -} - -double -Constants::get_constant_value(int t) const -{ - auto it = cmap.find(t); - if (it != cmap.end()) - return it->second; - else - throw ogu::Exception(__FILE__, __LINE__, - "Tree index is not constant in Constants::get_constant_value"); -} - -int -Constants::check(const string &str) const -{ - double d = std::stod(str); - auto it = cinvmap.find(d); - if (it != cinvmap.end()) - return it->second; - else - return -1; -} - -void -Constants::print() const -{ - for (const auto &it : cmap) - std::cout << "$" << it.first << ": " << it.second << "\n"; -} - -int -DynamicAtoms::check(const string &name) const -{ - if (is_string_constant(name)) - return Constants::check(name); - - return check_variable(name); -} - -int -DynamicAtoms::check_variable(const string &name) const -{ - string str; - int ll; - parse_variable(name, str, ll); - auto it = vars.find(str); - - if (it != vars.end()) - { - const Tlagmap &lmap = it->second; - auto itt = lmap.find(ll); - if (itt != lmap.end()) - return itt->second; - } - return -1; -} - -void -DynamicAtoms::assign(const string &name, int t) -{ - if (is_string_constant(name)) - assign_constant(name, t); - else - assign_variable(name, t); -} - -void -DynamicAtoms::assign_constant(const string &name, int t) -{ - double val = std::stod(name); - add_constant(t, val); -} - -// parse the name and then call assing_variable(varname, ll, t) - -void -DynamicAtoms::assign_variable(const string &name, int t) -{ - int ll; - string str; - parse_variable(name, str, ll); - // here str is just name without lead/lag - varnames.insert(str); - - assign_variable(str, ll, t); -} - -void -DynamicAtoms::assign_variable(const string &varname, int ll, int t) -{ - if (indices.end() != indices.find(t)) - throw ogu::Exception(__FILE__, __LINE__, - "Attempt to assign already allocated tree index"); - - auto it = vars.find(varname); - if (it != vars.end()) - { - Tlagmap &lmap = it->second; - if (lmap.end() != lmap.find(ll)) - throw ogu::Exception(__FILE__, __LINE__, - "Attempt to assign already allocated variable"); - lmap.emplace(ll, t); - } - else - { - Tlagmap lmap; - lmap.emplace(ll, t); - vars.emplace(varname, lmap); - } - indices.emplace(t, varname); - - nv++; - minlag = std::min(ll, minlag); - maxlead = std::max(ll, maxlead); -} - -void -DynamicAtoms::unassign_variable(const string &varname, int ll, int t) -{ - auto it = vars.find(varname); - if (it != vars.end()) - { - Tlagmap &lmap = it->second; - auto itt = lmap.find(ll); - if (itt != lmap.end()) - { - if (itt->second == t) - { - // erase it from the lagmap; if it becomes empty, - // erase the lagmap from varmap - lmap.erase(itt); - if (lmap.size() == 0) - vars.erase(it); - // erase it from the indices - auto ittt = indices.find(t); - if (ittt != indices.end()) - indices.erase(ittt); - - nv--; - if (ll == minlag || ll == maxlead) - update_minmaxll(); - } - else - throw ogu::Exception(__FILE__, __LINE__, - "Tree index inconsistent in DynamicAtoms::unassign_variable"); - } - else - throw ogu::Exception(__FILE__, __LINE__, - "Lead/lag of the variable not found in DynamicAtoms::unassign_variable"); - } - else - throw ogu::Exception(__FILE__, __LINE__, - "Variable not found in DynamicAtoms::unassign_variable"); -} - -void -DynamicAtoms::update_minmaxll() -{ - minlag = std::numeric_limits::max(); - maxlead = std::numeric_limits::min(); - for (const auto &it : vars) - { - const Tlagmap &lmap = it.second; - for (auto itt : lmap) - { - int ll = itt.first; - minlag = std::min(ll, minlag); - maxlead = std::max(ll, maxlead); - } - } -} - -vector -DynamicAtoms::variables() const -{ - vector res; - for (const auto &var : vars) - { - const Tlagmap &lmap = var.second; - for (auto itt : lmap) - res.push_back(itt.second); - } - return res; -} - -void -DynamicAtoms::varspan(int t, int &mlead, int &mlag) const -{ - auto it = indices.find(t); - if (indices.end() == it) - { - mlead = std::numeric_limits::min(); - mlag = std::numeric_limits::max(); - return; - } - varspan(it->second, mlead, mlag); -} - -void -DynamicAtoms::varspan(const string &name, int &mlead, int &mlag) const -{ - auto it = vars.find(name); - if (vars.end() == it) - { - mlead = std::numeric_limits::min(); - mlag = std::numeric_limits::max(); - return; - } - const Tlagmap &lmap = it->second; - auto beg = lmap.begin(); - auto end = lmap.rbegin(); - mlag = beg->first; - mlead = end->first; -} - -void -DynamicAtoms::varspan(const vector &names, int &mlead, int &mlag) const -{ - mlead = std::numeric_limits::min(); - mlag = std::numeric_limits::max(); - for (const auto &name : names) - { - int lag, lead; - varspan(name, lead, lag); - mlead = std::max(lead, mlead); - mlag = std::min(lag, mlag); - } -} - -bool -DynamicAtoms::is_named_atom(int t) const -{ - return indices.end() != indices.find(t); -} - -int -DynamicAtoms::index(const string &name, int ll) const -{ - auto it = vars.find(name); - if (vars.end() != it) - { - const Tlagmap &lmap = it->second; - auto itt = lmap.find(ll); - if (lmap.end() != itt) - return itt->second; - } - return -1; -} - -bool -DynamicAtoms::is_referenced(const string &name) const -{ - return vars.find(name) != vars.end(); -} - -const DynamicAtoms::Tlagmap & -DynamicAtoms::lagmap(const string &name) const -{ - auto it = vars.find(name); - if (vars.end() == it) - throw ogu::Exception(__FILE__, __LINE__, - "Couldn't find the name " - + name + " in DynamicAtoms::lagmap"); - return it->second; -} - -const string & -DynamicAtoms::name(int t) const -{ - auto it = indices.find(t); - if (indices.end() == it) - throw ogu::Exception(__FILE__, __LINE__, - "Couldn't find tree index in DynamicAtoms::name"); - return it->second; -} - -int -DynamicAtoms::lead(int t) const -{ - const string &nam = name(t); - const Tlagmap &lmap = lagmap(nam); - auto it = lmap.begin(); - while (it != lmap.end() && it->second != t) - ++it; - if (lmap.end() == it) - throw ogu::Exception(__FILE__, __LINE__, - "Couldn't find the three index in DynamicAtoms::lead"); - return it->first; -} - -void -DynamicAtoms::print() const -{ - std::cout << "names:\n"; - varnames.print(); - std::cout << "constants:\n"; - Constants::print(); - std::cout << "variables:\n"; - for (const auto &var : vars) - { - const Tlagmap &lmap = var.second; - for (auto itt : lmap) - std::cout << "$" << itt.second << ": " << var.first << "(" << itt.first << ")\n"; - } - std::cout << "indices:\n"; - for (auto indice : indices) - std::cout << "t=" << indice.first << " ⇒ " << indice.second << "\n"; -} - -/** Note that the str has been parsed by the lexicographic - * analyzer. It can be either a variable or a double. So it is easy to - * recognize it by the first character. */ -bool -DynamicAtoms::is_string_constant(const string &str) -{ - return str[0] == '.' || str[0] == '-' || (str[0] >= '0' && str[0] <= '9'); -} - -VarOrdering::VarOrdering(const VarOrdering &vo, const vector &vnames, - const DynamicAtoms &a) - : n_stat(vo.n_stat), n_pred(vo.n_pred), n_both(vo.n_both), n_forw(vo.n_forw), - der_atoms(vo.der_atoms), positions(vo.positions), - outer2y(vo.outer2y), y2outer(vo.y2outer), varnames(vnames), atoms(a) -{ -} - -bool -VarOrdering::check(int t) const -{ - return positions.find(t) != positions.end(); -} - -int -VarOrdering::get_pos_of(int t) const -{ - auto it = positions.find(t); - if (it != positions.end()) - return it->second; - else - throw ogu::Exception(__FILE__, __LINE__, - "Couldn't find the tree index in VarOrdering::get_pos_of"); -} - -void -VarOrdering::do_general(ord_type ordering) -{ - // auxiliary vectors for setting der_atoms and map - vector pred_minus; - vector both_minus; - vector stat; - vector pred_pad; - vector both_pad; - vector forw_pad; - vector both_plus; - vector forw_plus; - - // auxiliary vectors for setting y2outer and outer2y - vector y2o_stat; - vector y2o_pred; - vector y2o_both; - vector y2o_forw; - - for (unsigned int i = 0; i < varnames.size(); i++) - { - const string &ss = varnames[i]; - int lead; - int lag; - atoms.varspan(ss, lead, lag); - if (lag == 0 && lead == 0) - { - stat.push_back(atoms.index(ss, 0)); - y2o_stat.push_back(i); - } - else if (lag == -1 && lead < 1) - { - pred_minus.push_back(atoms.index(ss, -1)); - pred_pad.push_back(atoms.index(ss, 0)); - y2o_pred.push_back(i); - } - else if (lag > -1 && lead == 1) - { - forw_pad.push_back(atoms.index(ss, 0)); - forw_plus.push_back(atoms.index(ss, 1)); - y2o_forw.push_back(i); - } - else if (lag == -1 && lead == 1) - { - both_minus.push_back(atoms.index(ss, -1)); - both_pad.push_back(atoms.index(ss, 0)); - both_plus.push_back(atoms.index(ss, 1)); - y2o_both.push_back(i); - } - else - throw ogu::Exception(__FILE__, __LINE__, - "A wrong lag/lead of a variable in VarOrdering::do_pbspbfbf"); - } - - // here we fill ords according to ordering - vector *ords[8]; - if (ordering == pbspbfbf) - { - ords[0] = &pred_minus; - ords[1] = &both_minus; - ords[2] = &stat; - ords[3] = &pred_pad; - ords[4] = &both_pad; - ords[5] = &forw_pad; - ords[6] = &both_plus; - ords[7] = &forw_plus; - } - else if (ordering == bfspbfpb) - { - ords[0] = &both_plus; - ords[1] = &forw_plus; - ords[2] = &stat; - ords[3] = &pred_pad; - ords[4] = &both_pad; - ords[5] = &forw_pad; - ords[6] = &pred_minus; - ords[7] = &both_minus; - } - else // BEWARE: when implementing a new ordering, check also the code below setting y2outer - throw ogu::Exception(__FILE__, __LINE__, - "Ordering not implemented in VarOrdering::do_general"); - - // make der_atoms and positions - int off = 0; - for (auto &ord : ords) - for (unsigned int j = 0; j < ord->size(); j++, off++) - if ((*ord)[j] != -1) - { - der_atoms.push_back((*ord)[j]); - positions.emplace((*ord)[j], off); - } - - // set integer constants - n_stat = stat.size(); - n_pred = pred_pad.size(); - n_both = both_pad.size(); - n_forw = forw_pad.size(); - - // make y2outer mapping - y2outer.insert(y2outer.end(), y2o_stat.begin(), y2o_stat.end()); - y2outer.insert(y2outer.end(), y2o_pred.begin(), y2o_pred.end()); - y2outer.insert(y2outer.end(), y2o_both.begin(), y2o_both.end()); - y2outer.insert(y2outer.end(), y2o_forw.begin(), y2o_forw.end()); - // make outer2y mapping - outer2y.resize(y2outer.size(), -1); - for (unsigned int i = 0; i < y2outer.size(); i++) - outer2y[y2outer[i]] = i; -} - -void -VarOrdering::do_increasing_time() -{ - // get maxlead and minlag of the variables - int mlag, mlead; - atoms.varspan(varnames, mlead, mlag); - // setup the matrix of tree indices, if there is no occurrence, - // the index is set to -1 - vector ll_init(varnames.size(), -1); - vector> tree_ind(mlead-mlag+1, ll_init); - for (unsigned int iv = 0; iv < varnames.size(); iv++) - { - try - { - const DynamicAtoms::Tlagmap &lmap = atoms.lagmap(varnames[iv]); - for (auto it : lmap) - { - int ll = it.first; - int t = it.second; - tree_ind[ll-mlag][iv] = t; - } - } - catch (const ogu::Exception &e) - { - // ignore the error of not found variable in the tree - } - } - - // setup der_atoms and positions - for (int ll = mlag; ll <= mlead; ll++) - for (unsigned int iv = 0; iv < varnames.size(); iv++) - { - int t = tree_ind[ll-mlag][iv]; - if (t != -1) - { - der_atoms.push_back(t); - int pos = (ll-mlag)*varnames.size() + iv; - positions.emplace(t, pos); - } - } - - // set outer2y and y2outer to identities - for (unsigned int iv = 0; iv < varnames.size(); iv++) - { - outer2y.push_back(iv); - y2outer.push_back(iv); - } - - // set n_stat, n_pred, n_both, and n_forw - for (auto varname : varnames) - { - int mmlag, mmlead; - atoms.varspan(varname, mmlead, mmlag); - if (mmlead == 0 && mmlag == 0) - n_stat++; - else if (mmlead <= 0 && mmlag < 0) - n_pred++; - else if (mmlead > 0 && mmlag >= 0) - n_forw++; - else if (mmlead > 0 && mmlag < 0) - n_both++; - else if (mmlead < mmlag) - // variable does not occur in the tree, cound as static - n_stat++; - else - throw ogu::Exception(__FILE__, __LINE__, - "A wrong lag/lead of a variable in VarOrdering::do_increasing_time"); - } -} - -void -VarOrdering::print() const -{ - std::cout << "nstat=" << n_stat << ", npred=" << n_pred << ", nboth=" << n_both - << ", nforw=" << n_forw << "\n" - << "der_atoms:\n"; - for (int der_atom : der_atoms) - std::cout << " " << der_atom; - std::cout << "\nmap:\n"; - for (auto position : positions) - std::cout << " [" << position.first << "→" << position.second << "]"; - std::cout << "\ny2outer:\n"; - for (int i : y2outer) - std::cout << " " << i; - std::cout << "\nouter2y:\n"; - for (int i : outer2y) - std::cout << " " << i; - std::cout << "\n"; -} diff --git a/dynare++/parser/cc/dynamic_atoms.hh b/dynare++/parser/cc/dynamic_atoms.hh deleted file mode 100644 index f0f1bfaef..000000000 --- a/dynare++/parser/cc/dynamic_atoms.hh +++ /dev/null @@ -1,470 +0,0 @@ -/* - * Copyright © 2005 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef OGP_DYNAMIC_ATOMS_H -#define OGP_DYNAMIC_ATOMS_H - -#include "formula_parser.hh" - -#include -#include -#include -#include -#include -#include - -namespace ogp -{ - using std::vector; - using std::map; - using std::set; - using std::string; - - /** Class storing names. We will keep names of variables in - * various places, and all these pointers will point to one - * storage, which will be responsible for allocation and - * deallocation. The main function of the class is to allocate - * space for names, and return a pointer of the stored name if - * required. */ - class NameStorage - { - protected: - /** Vector of names allocated, this is the storage. */ - vector name_store; - /** Map useful to quickly decide if the name is already - * allocated or not. */ - set name_set; - public: - /** Query for the name. If the name has been stored, it - * true, otherwise false. */ - bool - query(const string &name) const - { - return name_set.find(name) != name_set.end(); - } - /** Insert the name if it has not been inserted yet. */ - void insert(string name); - int - num() const - { - return static_cast(name_store.size()); - } - const string & - get_name(int i) const - { - return name_store[i]; - } - /** Debug print. */ - void print() const; - }; - - class Constants : public AtomValues - { - public: - /** Type for a map mapping tree indices to double values. */ - using Tconstantmap = map; - using Tintintmap = map; - protected: - /** Map mapping a tree index of a constant to its double value. */ - Tconstantmap cmap; - public: - Constants() = default; - /** Copy constructor. */ - Constants(const Constants &c) - : cmap(c.cmap), cinvmap(c.cinvmap) - { - } - /** Copy constructor registering the constants in the given - * tree. The mapping from old tree indices to new ones is - * traced in tmap. */ - Constants(const Constants &c, OperationTree &otree, Tintintmap &tmap) - { - import_constants(c, otree, tmap); - } - /** Import constants registering their tree indices in the - * given tree. The mapping form old tree indices to new ones - * is traced in tmap. */ - void import_constants(const Constants &c, OperationTree &otree, Tintintmap &tmap); - /** Implements AtomValues interface. This sets the values to - * the evaluation tree EvalTree. */ - void setValues(EvalTree &et) const override; - /** This adds a constant with the given tree index. The - * constant must be checked previously and asserted that it - * does not exist. */ - void add_constant(int t, double val); - /** Returns true if the tree index is either an hardwired - * constant (initial number OperationTree:num_constants in - * OperationTree) or the tree index is a registered constant - * by add_constant method. */ - bool is_constant(int t) const; - double get_constant_value(int t) const; - /** Return -1 if the given string representation of a constant - * is not among the constants (double represenations). If it - * is, its tree index is returned. */ - int check(const string &str) const; - /** Debug print. */ - void print() const; - const Tconstantmap & - get_constantmap() const - { - return cmap; - } - private: - /** Inverse map to Tconstantmap. */ - using Tconstantinvmap = map; - /** This is an inverse map to cmap. This is only used for fast - * queries for the existing double constants in check - * method and add_constant. */ - Tconstantinvmap cinvmap; - }; - - /** This class is a parent to Atoms classes which distinguish between - * constants (numerical literals), and variables with lags and - * leads. This abstraction does not distinguish between a parameter - * and a variable without lag or lead. In this sense, everything is a - * variable.*/ - class DynamicAtoms : public Atoms, public Constants - { - public: - /** Definition of a type mapping lags to the indices of the variables. */ - using Tlagmap = map; - protected: - /** Definition of a type mapping names of the atoms to Tlagmap. */ - using Tvarmap = map; - /** Definition of a type mapping indices of variables to the variable names. */ - using Tindexmap = map; - /** This is just a storage for variable names, since all other - * instances of a variable name just point to the memory - * allocated by this object. */ - NameStorage varnames; - /** This is the map for variables. Each variable name is - * mapped to the Tlagmap, which maps lags/leads to the nulary - * term indices in the tree. */ - Tvarmap vars; - /** This is almost inverse map to the vars. It maps variable - * indices to the names. A returned name can be in turn used - * as a key in vars. */ - Tindexmap indices; - - /** Number of variables. */ - int nv{0}; - /** Minimum lag, if there is at least one lag, than this is a negative number. */ - int minlag{std::numeric_limits::max()}; - /** Maximum lead, if there is at least one lead, than this is a positive number. */ - int maxlead{std::numeric_limits::min()}; - public: - /** Construct empty DynamicAtoms. */ - DynamicAtoms() = default; - /** Check the nulary term identified by its string - * representation. The nulary term can be either a constant or - * a variable. If constant, -1 is returned so that it could be - * assigned regardless if the same constant has already - * appeared or not. If variable, then -1 is returned only if - * the variable has not been assigned an index, otherwise the - * assigned index is returned. */ - int check(const string &name) const override; - /** Assign the nulary term identified by its string - * representation. This method should be called when check() - * returns -1. */ - void assign(const string &name, int t) override; - /** Return a number of all variables. */ - int - nvar() const override - { - return nv; - } - /** Return the vector of variable indices. */ - vector variables() const override; - /** Return max lead and min lag for a variable given by the - * index. If a variable cannot be found, the method retursn - * the smallest integer as maxlead and the largest integer as - * minlag. */ - void varspan(int t, int &mlead, int &mlag) const; - /** Return max lead and min lag for a variable given by the - * name (without lead, lag). The same is valid if the variable - * name cannot be found. */ - void varspan(const string &name, int &mlead, int &mlag) const; - /** Return max lead and min lag for a vector of variables given by the names. */ - void varspan(const vector &names, int &mlead, int &mlag) const; - /** Return true for all tree indices corresponding to a - * variable in the sense of this class. (This is parameters, - * exo and endo). Since the semantics of 'variable' will be - * changed in subclasses, we use name 'named atom'. These are - * all atoms but constants. */ - bool is_named_atom(int t) const; - /** Return index of the variable described by the variable - * name and lag/lead. If it doesn't exist, return -1. */ - int index(const string &name, int ll) const; - /** Return true if a variable is referenced, i.e. it has lag - * map. */ - bool is_referenced(const string &name) const; - /** Return the lag map for the variable name. */ - const Tlagmap &lagmap(const string &name) const; - /** Return the variable name for the tree index. It throws an - * exception if the tree index t is not a named atom. */ - const string &name(int t) const; - /** Return the lead/lag for the tree index. It throws an - * exception if the tree index t is not a named atom. */ - int lead(int t) const; - /** Return maximum lead. */ - int - get_maxlead() const - { - return maxlead; - } - /** Return minimum lag. */ - int - get_minlag() const - { - return minlag; - } - /** Return the name storage to allow querying to other - * classes. */ - const NameStorage & - get_name_storage() const - { - return varnames; - } - /** Assign the variable with a given lead. The varname must be - * from the varnames storage. The method checks if the - * variable iwht the given lead/lag is not assigned. If so, an - * exception is thrown. */ - void assign_variable(const string &varname, int ll, int t); - /** Unassign the variable with a given lead and given tree - * index. The tree index is only provided as a check. An - * exception is thrown if the name, ll, and the tree index t - * are not consistent. The method also updates nv, indices, - * maxlead and minlag. The varname must be from the varnames - * storage. */ - void unassign_variable(const string &varname, int ll, int t); - /** Debug print. */ - void print() const override; - protected: - /** Do the check for the variable. A subclass may need to - * reimplement this so that it could raise an error if the - * variable is not among a given list. */ - virtual int check_variable(const string &name) const; - /** Assign the constant. */ - void assign_constant(const string &name, int t); - /** Assign the variable. */ - void assign_variable(const string &name, int t); - /** The method just updates minlag or/and maxlead. Note that - * when assigning variables, the update is done when inserting - * to the maps, however, if removing a variable, we need to - * call this method. */ - void update_minmaxll(); - /** The method parses the string to recover a variable name - * and lag/lead ll. The variable name doesn't contain a lead/lag. */ - virtual void parse_variable(const string &in, string &out, int &ll) const = 0; - public: - /** Return true if the str represents a double.*/ - static bool is_string_constant(const string &str); - }; - - /** This class is a parent of all orderings of the dynamic atoms - * of variables which can appear before t, at t, or after t. It - * encapsulates the ordering, and the information about the number - * of static (appearing only at time t) predetermined (appearing - * before t and possibly at t), both (appearing before t and after - * t and possibly at t) and forward looking (appearing after t and - * possibly at t). - * - * The constructor takes a list of variable names. The class also - * provides mapping from the ordering of the variables in the list - * (outer) to the new ordering (at time t) and back. - * - * The user of the subclass must call do_ordering() after - * initialization. - * - * The class contains a few preimplemented methods for - * ordering. The class is used in this way: Make a subclass, and - * implement pure virtual do_ordering() by just plugging a - * preimplemented method, or plugging your own implementation. The - * method do_ordering() is called by the user after the constructor. - */ - class VarOrdering - { - protected: - /** Number of static variables. */ - int n_stat; - /** Number of predetermined variables. */ - int n_pred; - /** Number of both variables. */ - int n_both; - /** Number of forward looking variables. */ - int n_forw; - /** This is a set of tree indices corresponding to the - * variables at all times as they occur in the formulas. In - * fact, since this is used only for derivatives, the ordering - * of this vector is only important for ordering of the - * derivatives, in other contexts the ordering is not - * important, so it is rather a set of indices.*/ - vector der_atoms; - /** This maps tree index of the variable to the position in - * the row of the ordering. One should be careful with making - * space in the positions for variables not appearing at time - * t. For instance in the pred(t-1), both(t-1), stat(t), - * pred(t), both(t), forw(t), both(t+1), forw(t+1) ordering, - * the variables x(t-1), y(t-1), x(t+1), z(t-1), z(t), and - * z(t+1) having tree indices 6,5,4,3,2,1 will be ordered as - * follows: y(t-1), x(t-1), z(t-1), [y(t)], [x(t)], z(t), - * x(t+1), where a bracketed expresion means non-existent by - * occupying a space. The map thus will look as follows: - * {5→0, 6→1, 3→2, 2→5, 3→6}. Note that nothing is mapped - * to positions 3 and 4. */ - map positions; - /** This maps an ordering of the list of variables in - * constructor to the new ordering (at time t). The length is - * the number of variables. */ - vector outer2y; - /** This maps a new ordering to the ordering of the list of - * variables in constructor (at time t). The length is the - * number of variables. */ - vector y2outer; - /** This is just a reference for variable names to keep it - * from constructor to do_ordering() implementations. */ - const vector &varnames; - /** This is just a reference to atoms to keep it from - * constructor to do_ordering() implementations. */ - const DynamicAtoms &atoms; - public: - /** This is an enum type for an ordering type implemented by - * do_general. */ - enum ord_type { pbspbfbf, bfspbfpb }; - /** Construct the ordering of the variables given by the names - * with their dynamic occurrences defined by the atoms. It - * calls the virtual method do_ordering which can be - * reimplemented. */ - VarOrdering(const vector &vnames, const DynamicAtoms &a) - : n_stat(0), n_pred(0), n_both(0), n_forw(0), varnames(vnames), atoms(a) - { - } - VarOrdering(const VarOrdering &vo, const vector &vnames, - const DynamicAtoms &a); - VarOrdering(const VarOrdering &vo) = delete; - virtual std::unique_ptr clone(const vector &vnames, - const DynamicAtoms &a) const = 0; - /** Destructor does nothing here. */ - virtual ~VarOrdering() = default; - /** This is the method setting the ordering and the map. A - * subclass must reimplement it, possibly using a - * preimplemented ordering. This method must be called by the - * user after the class has been created. */ - virtual void do_ordering() = 0; - /** Return number of static. */ - int - nstat() const - { - return n_stat; - } - /** Return number of predetermined. */ - int - npred() const - { - return n_pred; - } - /** Return number of both. */ - int - nboth() const - { - return n_both; - } - /** Return number of forward looking. */ - int - nforw() const - { - return n_forw; - } - /** Return the set of tree indices for derivatives. */ - const vector & - get_der_atoms() const - { - return der_atoms; - } - /** Return the y2outer. */ - const vector & - get_y2outer() const - { - return y2outer; - } - /** Return the outer2y. */ - const vector & - get_outer2y() const - { - return outer2y; - } - /** Query the atom given by the tree index. True is returned - * if the atom is one of the variables in the object. */ - bool check(int t) const; - /** Return the position of the atom (nulary term) given by a - * tree index. It is a lookup to the map. If the atom cannot - * be found, the exception is raised. */ - int get_pos_of(int t) const; - /** This returns a length of ordered row of atoms. In all - * cases so far, it does not depend on the ordering and it is - * as follows. */ - int - length() const - { - return n_stat+2*n_pred+3*n_both+2*n_forw; - } - /** Debug print. */ - void print() const; - protected: - /** This is a general ordering method which orders the - * variables by the given ordering ord_type. See documentation - * for respective do_ methods. */ - void do_general(ord_type ordering); - /** This is a preimplemented ordering for do_ordering() - * method. It assumes that the variables appear only at time - * t-1, t, t+1. It orders the atoms as pred(t-1), both(t-1), - * stat(t), pred(t), both(t), forw(t), both(t+1), - * forw(t+1). It builds the der_atoms, the map of positions, - * as well as y2outer and outer2y. */ - void - do_pbspbfbf() - { - do_general(pbspbfbf); - } - /** This is a preimplemented ordering for do_ordering() - * method. It assumes that the variables appear only at time - * t-1, t, t+1. It orders the atoms as both(t+1), forw(t+1), - * stat(t), pred(t), both(t), forw(t), pred(t-1), - * both(t-1). It builds the der_atoms, the map of positions, - * as well as y2outer and outer2y. */ - void - do_bfspbfpb() - { - do_general(bfspbfpb); - } - /** This is a preimplemented ordering for do_ordering() - * method. It makes no assumptions about occurences of - * variables at different times. It orders the atoms with - * increasing time keeping the given ordering within one - * time. This implies that y2outer and outer2y will be - * identities. The der_atoms will be just a sequence of atoms - * from the least to the most time preserving the order of atoms - * within one time. */ - void do_increasing_time(); - }; - -}; - -#endif diff --git a/dynare++/parser/cc/fine_atoms.cc b/dynare++/parser/cc/fine_atoms.cc deleted file mode 100644 index 8143e074e..000000000 --- a/dynare++/parser/cc/fine_atoms.cc +++ /dev/null @@ -1,536 +0,0 @@ -/* - * Copyright © 2005 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "utils/cc/exception.hh" - -#include "parser_exception.hh" -#include "fine_atoms.hh" - -using namespace ogp; - -AllvarOuterOrdering::AllvarOuterOrdering(const vector &allvar_outer, - const FineAtoms &a) - : atoms(a), allvar(), - endo2all(a.get_endovars().size(), -1), - exo2all(a.get_exovars().size(), -1) -{ - // fill in the allvar from allvar_outer - for (const auto &s : allvar_outer) - { - if (atoms.varnames.query(s)) - allvar.push_back(s); - else - throw ogu::Exception(__FILE__, __LINE__, - "Variable " + s + " is not a declared symbol in AllvarOuterOrdering constructor"); - } - - // fill in endo2all and exo2all - for (unsigned int i = 0; i < allvar.size(); i++) - { - auto it = atoms.endo_outer_map.find(allvar[i]); - if (it != atoms.endo_outer_map.end()) - endo2all[it->second] = i; - else - { - it = atoms.exo_outer_map.find(allvar[i]); - if (it != atoms.exo_outer_map.end()) - exo2all[it->second] = i; - else - throw ogu::Exception(__FILE__, __LINE__, - "Name " + allvar[i] + " is neither endogenous nor exogenous variable in AllvarOuterOrdering constructor"); - } - } - - // check whether everything has been filled - unsigned int iendo = 0; - while (iendo < endo2all.size() && endo2all[iendo] != -1) - iendo++; - unsigned int iexo = 0; - while (iexo < exo2all.size() && exo2all[iexo] != -1) - iexo++; - if (iendo < endo2all.size()) - throw ogu::Exception(__FILE__, __LINE__, - "Endogenous variable " + atoms.get_endovars()[iendo] - +" not found in outer all ordering in AllvarOuterOrdering constructor"); - if (iexo < exo2all.size()) - throw ogu::Exception(__FILE__, __LINE__, - "Exogenous variable " + atoms.get_exovars()[iexo] - +" not found in outer all ordering in AllvarOuterOrdering constructor"); -} - -AllvarOuterOrdering::AllvarOuterOrdering(const AllvarOuterOrdering &avo, - const FineAtoms &a) - : atoms(a), allvar(avo.allvar), - endo2all(avo.endo2all), - exo2all(avo.exo2all) -{ -} - -FineAtoms::FineAtoms(const FineAtoms &fa) - : DynamicAtoms(fa), params(), endovars(), exovars(), - der_atoms(fa.der_atoms), - endo_atoms_map(fa.endo_atoms_map), - exo_atoms_map(fa.exo_atoms_map) -{ - // fill in params - for (const auto ¶m : fa.params) - { - if (!varnames.query(param)) - throw ogu::Exception(__FILE__, __LINE__, - "Parameter " + param + " does not exist in FineAtoms copy cosntructor"); - params.push_back(param); - param_outer_map.emplace(param, params.size()-1); - } - // fill in endovars - for (const auto &endovar : fa.endovars) - { - if (!varnames.query(endovar)) - throw ogu::Exception(__FILE__, __LINE__, - "Endo variable " + endovar + " does not exist in FineAtoms copy constructor"); - endovars.push_back(endovar); - endo_outer_map.emplace(endovar, endovars.size()-1); - } - // fill in exovars - for (const auto &exovar : fa.exovars) - { - if (!varnames.query(exovar)) - throw ogu::Exception(__FILE__, __LINE__, - "Exo variable " + exovar + " does not exist in FineAtoms copy cosntructor"); - exovars.push_back(exovar); - exo_outer_map.emplace(exovar, exovars.size()-1); - } - - if (fa.endo_order) - endo_order = fa.endo_order->clone(endovars, *this); - - if (fa.exo_order) - exo_order = fa.exo_order->clone(exovars, *this); - - if (fa.allvar_order) - allvar_order = std::make_unique(*(fa.allvar_order), *this); -} - -int -FineAtoms::check_variable(const string &name) const -{ - string str; - int ll; - parse_variable(name, str, ll); - if (varnames.query(str)) - return DynamicAtoms::check_variable(name); - else - { - throw ParserException("Variable <"+str+"> not declared.", 0); - return -1; - } -} - -int -FineAtoms::num_exo_periods() const -{ - int mlead, mlag; - exovarspan(mlead, mlag); - return mlead-mlag+1; -} - -void -FineAtoms::parsing_finished(VarOrdering::ord_type ot) -{ - make_internal_orderings(ot); - - // by default, concatenate outer endo and outer exo and make it as - // allvar outer: - vector allvar_tmp; - allvar_tmp.insert(allvar_tmp.end(), endovars.begin(), endovars.end()); - allvar_tmp.insert(allvar_tmp.end(), exovars.begin(), exovars.end()); - - allvar_order = std::make_unique(allvar_tmp, *this); -} - -void -FineAtoms::parsing_finished(VarOrdering::ord_type ot, - const vector &allvar) -{ - make_internal_orderings(ot); - allvar_order = std::make_unique(allvar, *this); -} - -const vector & -FineAtoms::get_allvar() const -{ - if (!allvar_order) - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::get_allvars called before parsing_finished"); - - return allvar_order->get_allvar(); -} - -const vector & -FineAtoms::outer_endo2all() const -{ - if (!allvar_order) - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::outer_endo2all called before parsing_finished"); - - return allvar_order->get_endo2all(); -} - -const vector & -FineAtoms::outer_exo2all() const -{ - if (!allvar_order) - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::outer_exo2all called before parsing_finished"); - - return allvar_order->get_exo2all(); -} - -vector -FineAtoms::variables() const -{ - if (endo_order) - return der_atoms; - else - { - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::variables called before parsing_finished"); - return {}; - } -} - -int -FineAtoms::nstat() const -{ - if (endo_order) - return endo_order->nstat(); - else - { - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::nstat called before parsing_finished"); - return -1; - } -} - -int -FineAtoms::npred() const -{ - if (endo_order) - return endo_order->npred(); - else - { - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::npred called before parsing_finished"); - return -1; - } -} - -int -FineAtoms::nboth() const -{ - if (endo_order) - return endo_order->nboth(); - else - { - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::nboth called before parsing_finished"); - return -1; - } -} - -int -FineAtoms::nforw() const -{ - if (endo_order) - return endo_order->nforw(); - else - { - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::nforw called before parsing_finished"); - return -1; - } -} - -int -FineAtoms::get_pos_of_endo(int t) const -{ - if (endo_order) - return endo_order->get_pos_of(t); - else - { - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::get_pos_of_endo called before parsing_finished"); - return -1; - } -} - -int -FineAtoms::get_pos_of_exo(int t) const -{ - if (exo_order) - return exo_order->get_pos_of(t); - else - { - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::get_pos_of_exo called before parsing_finished"); - return -1; - } -} - -int -FineAtoms::get_pos_of_all(int t) const -{ - if (endo_order && exo_order) - { - if (endo_order->check(t)) - return endo_order->get_pos_of(t); - else if (exo_order->check(t)) - return endo_order->length() + exo_order->get_pos_of(t); - else - { - throw ogu::Exception(__FILE__, __LINE__, - "Atom is not endo nor exo in FineAtoms::get_pos_of_all"); - return -1; - } - } - else - { - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::get_pos_of_exo called before parsing_finished"); - return -1; - } -} - -const vector & -FineAtoms::y2outer_endo() const -{ - if (!endo_order) - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::y2outer_endo called before parsing_finished"); - return endo_order->get_y2outer(); -} - -const vector & -FineAtoms::outer2y_endo() const -{ - if (!endo_order) - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::outer2y_endo called before parsing_finished"); - return endo_order->get_outer2y(); -} - -const vector & -FineAtoms::y2outer_exo() const -{ - if (!exo_order) - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::y2outer_endo called before parsing_finished"); - return exo_order->get_y2outer(); -} - -const vector & -FineAtoms::outer2y_exo() const -{ - if (!exo_order) - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::outer2y_exo called before parsing_finished"); - return exo_order->get_outer2y(); -} - -const vector & -FineAtoms::get_endo_atoms_map() const -{ - if (!endo_order) - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::get_endo_atoms_map called before parsing_finished"); - return endo_atoms_map; -} - -const vector & -FineAtoms::get_exo_atoms_map() const -{ - if (!exo_order) - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::get_exo_atoms_map called before parsing_finished"); - return exo_atoms_map; -} - -int -FineAtoms::name2outer_param(const string &name) const -{ - auto it = param_outer_map.find(name); - if (it == param_outer_map.end()) - throw ogu::Exception(__FILE__, __LINE__, - "Name is not a parameter in FineAtoms::name2outer_param"); - return it->second; -} - -int -FineAtoms::name2outer_endo(const string &name) const -{ - auto it = endo_outer_map.find(name); - if (it == endo_outer_map.end()) - throw ogu::Exception(__FILE__, __LINE__, - "Name is not an endogenous variable in FineAtoms::name2outer_endo"); - return it->second; -} - -int -FineAtoms::name2outer_exo(const string &name) const -{ - auto it = exo_outer_map.find(name); - if (it == exo_outer_map.end()) - throw ogu::Exception(__FILE__, __LINE__, - "Name is not an exogenous variable in FineAtoms::name2outer_exo"); - return it->second; -} - -int -FineAtoms::name2outer_allvar(const string &name) const -{ - if (!allvar_order) - throw ogu::Exception(__FILE__, __LINE__, - "FineAtoms::name2outer_allvar called beore parsing_finished"); - - auto it = endo_outer_map.find(name); - if (it != endo_outer_map.end()) - return allvar_order->get_endo2all()[it->second]; - else - { - it = exo_outer_map.find(name); - if (it != exo_outer_map.end()) - return allvar_order->get_exo2all()[it->second]; - } - - throw ogu::Exception(__FILE__, __LINE__, - "Name " + name + " is neither endo nor exo variable in FineAtoms::name2outer_allvar"); - return -1; -} - -void -FineAtoms::register_uniq_endo(string name) -{ - if (varnames.query(name)) - throw ogp::ParserException("Endogenous variable <"+name+"> is not unique.", 0); - varnames.insert(name); - endovars.push_back(name); - endo_outer_map.emplace(std::move(name), endovars.size()-1); -} - -void -FineAtoms::register_uniq_exo(string name) -{ - if (varnames.query(name)) - throw ogp::ParserException("Exogenous variable <"+name+"> is not unique.", 0); - varnames.insert(name); - exovars.push_back(name); - exo_outer_map.emplace(std::move(name), exovars.size()-1); -} - -void -FineAtoms::register_uniq_param(string name) -{ - if (varnames.query(name)) - throw ogp::ParserException("Parameter <"+name+"> is not unique.", 0); - varnames.insert(name); - params.push_back(name); - param_outer_map.emplace(std::move(name), params.size()-1); -} - -void -FineAtoms::make_internal_orderings(VarOrdering::ord_type ot) -{ - bool endo_ordering_done = false; - bool exo_ordering_done = false; - - order_type = ot; - - int mlead, mlag; - endovarspan(mlead, mlag); - if (mlag >= -1 && mlead <= 1) - { - // make endo ordering - if (ot == VarOrdering::pbspbfbf) - endo_order = std::make_unique(endovars, *this); - else - endo_order = std::make_unique(endovars, *this); - endo_order->do_ordering(); - endo_ordering_done = true; - } - - exovarspan(mlead, mlag); - if (mlag == 0 && mlead == 0) - { - // make exo ordering - exo_order = std::make_unique(exovars, *this); - exo_order->do_ordering(); - exo_ordering_done = true; - } - - if (endo_ordering_done && exo_ordering_done) - { - // concatenate der atoms from endo_order and exo_order - der_atoms.clear(); - der_atoms.insert(der_atoms.end(), - endo_order->get_der_atoms().begin(), - endo_order->get_der_atoms().end()); - der_atoms.insert(der_atoms.end(), - exo_order->get_der_atoms().begin(), - exo_order->get_der_atoms().end()); - - // create endo_atoms_map; der_atoms is a concatenation, so it is easy - int endo_atoms = endo_order->get_der_atoms().size(); - endo_atoms_map.clear(); - for (int i = 0; i < endo_atoms; i++) - endo_atoms_map.push_back(i); - // create exo_atoms_map - int exo_atoms = exo_order->get_der_atoms().size(); - exo_atoms_map.clear(); - for (int i = 0; i < exo_atoms; i++) - exo_atoms_map.push_back(endo_atoms + i); - } -} - -void -FineAtoms::print() const -{ - DynamicAtoms::print(); - if (endo_order) - { - std::cout << "Endo ordering:\n"; - endo_order->print(); - } - else - std::cout << "Endo ordering not created.\n"; - - if (exo_order) - { - std::cout << "Exo ordering:\n"; - exo_order->print(); - } - else - std::cout << "Exo ordering not created.\n"; - - std::cout << "endo atoms map:\n"; - for (unsigned int i = 0; i < endo_atoms_map.size(); i++) - std::cout << i << " → " << endo_atoms_map[i] << "\n"; - std::cout << "exo atoms map:\n"; - for (unsigned int i = 0; i < exo_atoms_map.size(); i++) - std::cout << i << " → " << exo_atoms_map[i] << "\n"; -} diff --git a/dynare++/parser/cc/fine_atoms.hh b/dynare++/parser/cc/fine_atoms.hh deleted file mode 100644 index c463c7c7c..000000000 --- a/dynare++/parser/cc/fine_atoms.hh +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Copyright © 2005 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef OGP_FINE_ATOMS_H -#define OGP_FINE_ATOMS_H - -#include "dynamic_atoms.hh" - -#include -#include -#include - -namespace ogp -{ - using std::vector; - using std::string; - - /** This is just ordering used for endogenous variables. It - * assumes that we have only time t-1, t, and t+1, orders them as - * pred(t-1), both(t-1), stat(t), pred(t), both(t), forw(t), - * both(t+1), forw(t+1). */ - class EndoVarOrdering1 : public VarOrdering - { - public: - EndoVarOrdering1(const vector &vnames, const DynamicAtoms &a) - : VarOrdering(vnames, a) - { - } - EndoVarOrdering1(const EndoVarOrdering1 &vo, const vector &vnames, - const DynamicAtoms &a) - : VarOrdering(vo, vnames, a) - { - } - std::unique_ptr - clone(const vector &vnames, const DynamicAtoms &a) const override - { - return std::make_unique(*this, vnames, a); - } - void - do_ordering() override - { - do_pbspbfbf(); - } - }; - - /** This is just another ordering used for endogenous - * variables. It assumes that we have only time t-1, t, and t+1, - * orders them as both(t+1), forw(t+1), pred(t-1), both(t-1), - * stat(t), pred(t), both(t), forw(t). */ - class EndoVarOrdering2 : public VarOrdering - { - public: - EndoVarOrdering2(const vector &vnames, const DynamicAtoms &a) - : VarOrdering(vnames, a) - { - } - EndoVarOrdering2(const EndoVarOrdering2 &vo, const vector &vnames, - const DynamicAtoms &a) - : VarOrdering(vo, vnames, a) - { - } - std::unique_ptr - clone(const vector &vnames, const DynamicAtoms &a) const override - { - return std::make_unique(*this, vnames, a); - } - void - do_ordering() override - { - do_bfspbfpb(); - } - }; - - /** This is just ordering used for exogenous variables. It makes - * no assumptions about their timing. It orders them from the - * least time to the latest time. */ - class ExoVarOrdering : public VarOrdering - { - public: - ExoVarOrdering(const vector &vnames, const DynamicAtoms &a) - : VarOrdering(vnames, a) - { - } - ExoVarOrdering(const ExoVarOrdering &vo, const vector &vnames, - const DynamicAtoms &a) - : VarOrdering(vo, vnames, a) - { - } - std::unique_ptr - clone(const vector &vnames, const DynamicAtoms &a) const override - { - return std::make_unique(*this, vnames, a); - } - void - do_ordering() override - { - do_increasing_time(); - } - }; - - class FineAtoms; - - /** This class provides an outer ordering of all variables (endo - * and exo). It maps the ordering to the particular outer - * orderings of endo and exo. It works tightly with the FineAtoms - * class. */ - class AllvarOuterOrdering - { - protected: - /** Type for a map mapping a variable name to an integer. */ - using Tvarintmap = map; - /** Reference to atoms. */ - const FineAtoms &atoms; - /** The vector of all endo and exo variables in outer - * ordering. The pointers point to storage in atoms. */ - vector allvar; - /** The mapping from outer endogenous to outer all. For - * example endo2all[0] is the order of the first outer - * endogenous variable in the allvar ordering. */ - vector endo2all; - /** The mapping from outer exogenous to outer all. For example - * exo2all[0] is the order of the first outer exogenous - * variables in the allvar ordering. */ - vector exo2all; - public: - /** Construct the allvar outer ordering from the provided - * sequence of endo and exo names. The names can have an - * arbitrary storage, the storage is transformed to the atoms - * storage. An exception is thrown if either the list is not - * exhaustive, or some string is not a variable. */ - AllvarOuterOrdering(const vector &allvar_outer, const FineAtoms &a); - /** Copy constructor using the storage of provided atoms. */ - AllvarOuterOrdering(const AllvarOuterOrdering &allvar_outer, const FineAtoms &a); - /** Return endo2all mapping. */ - const vector & - get_endo2all() const - { - return endo2all; - } - /** Return exo2all mapping. */ - const vector & - get_exo2all() const - { - return exo2all; - } - /** Return the allvar ordering. */ - const vector & - get_allvar() const - { - return allvar; - } - }; - - /** This class refines the DynamicAtoms by distinguishing among - * parameters (no lag and leads) and endogenous and exogenous - * variables (with lags and leads). For parameters, endogenous and - * exogenous, it defines outer orderings and internal - * orderings. The internal orderings are created by - * parsing_finished() method when it is sure that no new variables - * would be registered. The outer orderings are given by the order - * of calls of registering methods. - * - * In addition, the class also defines outer ordering of - * endogenous and exogenous variables. This is input as a - * parameter to parsing_finished(). By default, this whole outer - * ordering is just a concatenation of outer ordering of - * endogenous and exogenous variables. - * - * The internal ordering of all endo and exo variables is just a - * concatenation of endo and exo variables in their internal - * orderings. This is the ordering with respect to which all - * derivatives are taken. */ - class FineAtoms : public DynamicAtoms - { - friend class AllvarOuterOrdering; - protected: - using Tvarintmap = map; - private: - /** The vector of parameters names. The order gives the order - * the data is communicated with outside world. */ - vector params; - /** A map mapping a name of a parameter to an index in the outer - * ordering. */ - Tvarintmap param_outer_map; - /** The vector of endogenous variables. This defines the order - * like parameters. */ - vector endovars; - /** A map mapping a name of an endogenous variable to an index - * in the outer ordering. */ - Tvarintmap endo_outer_map; - /** The vector of exogenous variables. Also defines the order - * like parameters and endovars. */ - vector exovars; - /** A map mapping a name of an exogenous variable to an index - * in the outer ordering. */ - Tvarintmap exo_outer_map; - - protected: - /** This is the internal ordering of all atoms corresponding - * to endogenous variables. It is constructed by - * parsing_finished() method, which should be called after all - * parsing jobs have been finished. */ - std::unique_ptr endo_order; - /** This is the internal ordering of all atoms corresponding - * to exogenous variables. It has the same handling as - * endo_order. */ - std::unique_ptr exo_order; - /** This is the all variables outer ordering. It is - * constructed by parsing finished. */ - std::unique_ptr allvar_order; - /** This vector defines a set of atoms as tree indices used - * for differentiation. The order of the atoms in this vector - * defines ordering of the derivative tensors. The ordering is - * a concatenation of atoms from endo_order and then - * exo_order. This vector is setup by parsing_finished() and - * is returned by variables(). */ - vector der_atoms; - /** This is a mapping from endogenous atoms to all atoms in - * der_atoms member. The mapping maps index in endogenous atom - * ordering to index (not value) in der_atoms. It is useful if - * one wants to evaluate derivatives wrt only endogenous - * variables. It is set by parsing_finished(). By definition, - * it is monotone. */ - vector endo_atoms_map; - /** This is a mapping from exogenous atoms to all atoms in - * der_atoms member. It is the same as endo_atoms_map for - * atoms of exogenous variables. */ - vector exo_atoms_map; - public: - FineAtoms() = default; - FineAtoms(const FineAtoms &fa); - /** Deletes endo_order and exo_order. */ - ~FineAtoms() override = default; - /** Overrides DynamicAtoms::check_variable so that the error - * would be raised if the variable name is not declared. A - * variable is declared by inserting it to - * DynamicAtoms::varnames. This is a responsibility of a - * subclass. */ - int check_variable(const string &name) const override; - /** This calculates min lag and max lead of endogenous variables. */ - void - endovarspan(int &mlead, int &mlag) const - { - varspan(endovars, mlead, mlag); - } - /** This calculates mim lag and max lead of exogenous variables. */ - void - exovarspan(int &mlead, int &mlag) const - { - varspan(exovars, mlead, mlag); - } - /** This calculates the number of periods in which at least - * one exogenous variable occurs. */ - int num_exo_periods() const; - /** Return an (external) ordering of parameters. */ - const vector & - get_params() const - { - return params; - } - /** Return an external ordering of endogenous variables. */ - const vector & - get_endovars() const - { - return endovars; - } - /** Return an external ordering of exogenous variables. */ - const vector & - get_exovars() const - { - return exovars; - } - /** This constructs internal orderings and makes the indices - * returned by variables method available. Further it - * constructs outer ordering of all variables by a simple - * concatenation of outer endogenous and outer exogenous. In - * addition, it makes nstat, npred, nboth, nforw available. */ - void parsing_finished(VarOrdering::ord_type ot); - /** This does the same thing as - * parsing_finished(VarOrdering::ord_type) plus it allows for - * inputing a different outer ordering of all variables. The - * ordering is input as a list of strings, their storage can - * be arbitrary. */ - void parsing_finished(VarOrdering::ord_type ot, const vector &avo); - /** Return the external ordering of all variables (endo and - * exo). This is either the second argument to - * parsing_finished or the default external ordering. This - * must be called only after parsing_finished. */ - const vector &get_allvar() const; - /** Return the map from outer ordering of endo variables to - * the allvar ordering. This must be called only after - * parsing_finished. */ - const vector &outer_endo2all() const; - /** Return the map from outer ordering of exo variables to - * the allvar ordering. This must be called only after - * parsing_finished. */ - const vector &outer_exo2all() const; - /** Return the atoms with respect to which we are going to - * differentiate. This must be called after - * parsing_finished. */ - vector variables() const override; - /** Return the number of static. */ - int nstat() const; - /** Return the number of predetermined. */ - int npred() const; - /** Return the number of both. */ - int nboth() const; - /** Return the number of forward looking. */ - int nforw() const; - /** Return the index of an endogenous atom given by tree index in - * the endo ordering. This must be also called only after - * parsing_finished(). */ - int get_pos_of_endo(int t) const; - /** Return the index of an exogenous atom given by tree index in - * the exo ordering. This must be also called only after - * parsing_finished(). */ - int get_pos_of_exo(int t) const; - /** Return the index of either endogenous or exogenous atom - * given by tree index in the concatenated ordering of - * endogenous and exogenous atoms. This must be also called - * only after parsing_finished(). */ - int get_pos_of_all(int t) const; - /** Return the mapping from endogenous at time t to outer - * ordering of endogenous. */ - const vector &y2outer_endo() const; - /** Return the mapping from the outer ordering of endogenous to endogenous - * at time t. */ - const vector &outer2y_endo() const; - /** Return the mapping from exogenous at time t to outer - * ordering of exogenous. */ - const vector &y2outer_exo() const; - /** Return the mapping from the outer ordering of exogenous to exogenous - * at time t. */ - const vector &outer2y_exo() const; - /** Return the endo_atoms_map. */ - const vector &get_endo_atoms_map() const; - /** Return the exo_atoms_map. */ - const vector &get_exo_atoms_map() const; - /** Return an index in the outer ordering of a given - * parameter. An exception is thrown if the name is not a - * parameter. */ - int name2outer_param(const string &name) const; - /** Return an index in the outer ordering of a given - * endogenous variable. An exception is thrown if the name is not a - * and endogenous variable. */ - int name2outer_endo(const string &name) const; - /** Return an index in the outer ordering of a given - * exogenous variable. An exception is thrown if the name is not a - * and exogenous variable. */ - int name2outer_exo(const string &name) const; - /** Return an index in the outer ordering of all variables - * (endo and exo) for a given name. An exception is thrown if - * the name is not a variable. This must be called only after - * parsing_finished(). */ - int name2outer_allvar(const string &name) const; - /** Return the number of endogenous variables at time t-1, these are state - * variables. */ - int - nys() const - { - return npred()+nboth(); - } - /** Return the number of endogenous variables at time t+1. */ - int - nyss() const - { - return nboth()+nforw(); - } - /** Return the number of endogenous variables. */ - int - ny() const - { - return endovars.size(); - } - /** Return the number of exogenous variables. */ - int - nexo() const - { - return static_cast(exovars.size()); - } - /** Return the number of parameters. */ - int - np() const - { - return static_cast(params.size()); - } - /** Register unique endogenous variable name. The order of - * calls defines the endo outer ordering. The method is - * virtual, since a superclass may want to do some additional - * action. */ - virtual void register_uniq_endo(string name); - /** Register unique exogenous variable name. The order of - * calls defines the exo outer ordering. The method is - * virtual, since a superclass may want to do somem additional - * action. */ - virtual void register_uniq_exo(string name); - /** Register unique parameter name. The order of calls defines - * the param outer ordering. The method is - * virtual, since a superclass may want to do somem additional - * action. */ - virtual void register_uniq_param(string name); - /** Debug print. */ - void print() const override; - private: - /** This performs the common part of parsing_finished(), which - * is a construction of internal orderings. */ - void make_internal_orderings(VarOrdering::ord_type ot); - protected: - /** This remembers the ordering type of the last call make_internal_ordering. */ - VarOrdering::ord_type order_type; - }; -}; - -#endif diff --git a/dynare++/parser/cc/formula.ll b/dynare++/parser/cc/formula.ll deleted file mode 100644 index 4b5b2aeb2..000000000 --- a/dynare++/parser/cc/formula.ll +++ /dev/null @@ -1,92 +0,0 @@ -/* -*- C++ -*- */ -/* - * Copyright © 2004-2011 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ -%{ -#include "location.hh" -#include "formula_tab.hh" - -#define YY_USER_ACTION SET_LLOC(fmla_); -%} - -%option nounput -%option noyy_top_state -%option stack -%option yylineno -%option prefix="fmla_" -%option never-interactive -%x CMT - -%% - - /* comments */ -<*>"/*" {yy_push_state(CMT);} -[^*\n]* -"*"+[^*/\n]* -"*"+"/" {yy_pop_state();} -[\n] -"//".*\n - - /* initial spaces or tabs are ignored */ - -[ \t\r\n] -[+] {return YPLUS;} -[-] {return YMINUS;} -[*] {return YTIMES;} -[/] {return YDIVIDE;} -[\^] {return YPOWER;} -exp {return YEXP;} -log {return YLOG;} -sin {return YSIN;} -cos {return YCOS;} -tan {return YTAN;} -sqrt {return YSQRT;} -erf {return YERF;} -erfc {return YERFC;} -diff {return YDIFF;} - - /* names: parameters, variables (lagged/leaded) */ -[A-Za-z_][A-Za-z0-9_]*([\(\{][+-]?[0-9]+[\)\}])? { - fmla_lval.string=fmla_text; - return NAME; -} - - /* floating point numbers */ -(([0-9]*\.?[0-9]+)|([0-9]+\.))([edED][-+]?[0-9]+)? { - fmla_lval.string=fmla_text; - return DNUMBER; -} - -= {return EQUAL_SIGN;} - -. {return fmla_text[0];} - -%% - -int -fmla_wrap() -{ - return 1; -} - -void -fmla__destroy_buffer(void* p) -{ - fmla__delete_buffer(static_cast(p)); -} diff --git a/dynare++/parser/cc/formula.yy b/dynare++/parser/cc/formula.yy deleted file mode 100644 index 4fc7f934d..000000000 --- a/dynare++/parser/cc/formula.yy +++ /dev/null @@ -1,101 +0,0 @@ -// -*- C++ -*- -/* - * Copyright © 2006-2011 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -%code requires -{ -#include "location.hh" -#define FMLA_LTYPE ogp::location_type -} - -%code -{ -#include "formula_parser.hh" -#include - -void fmla_error(std::string); -int fmla_lex(); -extern ogp::FormulaParser* fparser; -} - -%union -{ - char* string; - double dvalue; - int integer; -} - -%token EQUAL_SIGN -%left YPLUS YMINUS -%left YTIMES YDIVIDE -%precedence YUMINUS YUPLUS -%right YPOWER -%token YEXP YLOG YSIN YCOS YTAN YSQRT YERF YERFC YDIFF -%token DNUMBER NAME -%type expression - -%define api.prefix {fmla_} - -%locations -%defines -%define parse.error verbose - -%% - root : equation_list - | expression - {fparser->add_formula($1);} - ; - - equation_list : equation_list equation | equation ; - - equation : expression EQUAL_SIGN expression ';' - {fparser->add_formula(fparser->add_binary(ogp::code_t::MINUS,$1,$3));} - | expression ';' - {fparser->add_formula($1);} - ; - - expression : '(' expression ')' { $$ = $2;} - | expression YPLUS expression {$$=fparser->add_binary(ogp::code_t::PLUS,$1,$3);} - | expression YMINUS expression {$$=fparser->add_binary(ogp::code_t::MINUS,$1,$3);} - | expression YTIMES expression {$$=fparser->add_binary(ogp::code_t::TIMES,$1,$3);} - | expression YDIVIDE expression {$$=fparser->add_binary(ogp::code_t::DIVIDE,$1,$3);} - | expression YPOWER expression {$$=fparser->add_binary(ogp::code_t::POWER,$1,$3);} - | YMINUS expression %prec YUMINUS {$$=fparser->add_unary(ogp::code_t::UMINUS,$2);} - | YPLUS expression %prec YUPLUS {$$ = $2;} - | YSIN '(' expression ')' {$$=fparser->add_unary(ogp::code_t::SIN,$3);} - | YCOS '(' expression ')' {$$=fparser->add_unary(ogp::code_t::COS,$3);} - | YTAN '(' expression ')' {$$=fparser->add_unary(ogp::code_t::TAN,$3);} - | YEXP '(' expression ')' {$$=fparser->add_unary(ogp::code_t::EXP,$3);} - | YLOG '(' expression ')' {$$=fparser->add_unary(ogp::code_t::LOG,$3);} - | YSQRT '(' expression ')' {$$=fparser->add_unary(ogp::code_t::SQRT,$3);} - | YERF '(' expression ')' {$$=fparser->add_unary(ogp::code_t::ERF,$3);} - | YERFC '(' expression ')' {$$=fparser->add_unary(ogp::code_t::ERFC,$3);} - | YDIFF '(' expression ',' NAME ')' {$$=fparser->add_derivative($3, fparser->add_nulary($5));} - | NAME {$$=fparser->add_nulary($1);} - | DNUMBER {$$=fparser->add_nulary($1);} - ; - -%% - -void -fmla_error(std::string s) -{ - fparser->error(std::move(s)); -} diff --git a/dynare++/parser/cc/formula_parser.cc b/dynare++/parser/cc/formula_parser.cc deleted file mode 100644 index e23ca3a0d..000000000 --- a/dynare++/parser/cc/formula_parser.cc +++ /dev/null @@ -1,536 +0,0 @@ -/* - * Copyright © 2005 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "utils/cc/pascal_triangle.hh" -#include "utils/cc/exception.hh" - -#include "parser_exception.hh" -#include "location.hh" -#include "formula_parser.hh" -#include "formula_tab.hh" - -#include -#include - -using namespace ogp; - -extern location_type fmla_lloc; - -FormulaParser::FormulaParser(const FormulaParser &fp, Atoms &a) - : otree(fp.otree), atoms(a), formulas(fp.formulas), ders() -{ - // create derivatives - for (const auto &der : fp.ders) - ders.push_back(std::make_unique(*der)); -} - -void -FormulaParser::differentiate(int max_order) -{ - ders.clear(); - vector vars; - vars = atoms.variables(); - for (int formula : formulas) - ders.push_back(std::make_unique(otree, vars, formula, max_order)); -} - -const FormulaDerivatives & -FormulaParser::derivatives(int i) const -{ - if (i < static_cast(ders.size())) - return *(ders[i]); - else - throw ogu::Exception(__FILE__, __LINE__, - "Wrong formula index in FormulaParser::derivatives"); - return *(ders[0]); // just because of compiler -} - -void -FormulaParser::add_formula(int t) -{ - formulas.push_back(t); -} - -int -FormulaParser::add_binary(code_t code, int t1, int t2) -{ - return otree.add_binary(code, t1, t2); -} - -int -FormulaParser::add_unary(code_t code, int t) -{ - return otree.add_unary(code, t); -} - -int -FormulaParser::add_nulary(const string &str) -{ - int t = -1; - try - { - t = atoms.check(str); - } - catch (const ParserException &e) - { - throw ParserException(e, fmla_lloc.off); - } - if (t == -1) - { - t = otree.add_nulary(); - atoms.assign(str, t); - } - return t; -} - -void -FormulaParser::add_subst_formulas(const map &subst, const FormulaParser &fp) -{ - for (int i = 0; i < fp.nformulas(); i++) - { - int f = add_substitution(fp.formula(i), subst, fp); - add_formula(f); - } -} - -void -FormulaParser::substitute_formulas(const map &smap) -{ - for (int i = 0; i < nformulas(); i++) - { - // make substitution and replace the formula for it - int f = add_substitution(formulas[i], smap); - formulas[i] = f; - // update the derivatives if any - if (i < static_cast(ders.size()) && ders[i]) - { - int order = ders[i]->get_order(); - ders[i] = std::make_unique(otree, atoms.variables(), formulas[i], order); - } - } -} - -/** Global symbols for passing info to parser. */ -FormulaParser *fparser; - -/** The declarations of functions defined in formula_ll.cc and - * formula_tab.cc generated from formula.lex and formula.y */ -void *fmla__scan_string(const char *); -void fmla__destroy_buffer(void *); -int fmla_parse(); -extern location_type fmla_lloc; - -/** This makes own copy of provided data, sets the buffer for the - * parser with fmla_scan_buffer, and launches fmla_parse(). Note that - * the pointer returned from fmla_scan_buffer must be freed at the - * end. */ -void -FormulaParser::parse(const string &stream) -{ - fmla_lloc.off = 0; - fmla_lloc.ll = 0; - void *p = fmla__scan_string(stream.c_str()); - fparser = this; - fmla_parse(); - fmla__destroy_buffer(p); -} - -void -FormulaParser::error(string mes) const -{ - throw ParserException(std::move(mes), fmla_lloc.off); -} - -int -FormulaParser::last_formula() const -{ - int res = -1; - for (int formula : formulas) - res = std::max(res, formula); - return std::max(res, otree.get_last_nulary()); -} - -int -FormulaParser::pop_last_formula() -{ - if (formulas.size() == 0) - return -1; - int t = formulas.back(); - if (formulas.size() == ders.size()) - ders.pop_back(); - formulas.pop_back(); - return t; -} - -void -FormulaParser::print() const -{ - atoms.print(); - for (int formula : formulas) - { - std::cout << "formula " << formula << ":\n"; - otree.print_operation(formula); - } - for (unsigned int i = 0; i < ders.size(); i++) - { - std::cout << "derivatives for the formula " << formulas[i] << ":\n"; - ders[i]->print(otree); - } -} - -/** This constructor makes a vector of indices for formulas - * corresponding to derivatives of the given formula. The formula is - * supposed to belong to the provided tree, the created derivatives - * are added to the tree. - * - * The algorithm is as follows. todo: update description of the - * algorithm - */ -FormulaDerivatives::FormulaDerivatives(OperationTree &otree, - const vector &vars, int f, int max_order) - : nvar(vars.size()), order(max_order) -{ - FoldMultiIndex fmi_zero(nvar); - tder.push_back(f); - indices.push_back(fmi_zero); - unsigned int last_order_beg = 0; - unsigned int last_order_end = tder.size(); - - for (int k = 1; k <= order; k++) - { - // interval = last_order_end) - break; - } - - // build ind2der map - for (unsigned int i = 0; i < indices.size(); i++) - ind2der.emplace(indices[i], i); - -} - -FormulaDerivatives::FormulaDerivatives(const FormulaDerivatives &fd) = default; - -int -FormulaDerivatives::derivative(const FoldMultiIndex &mi) const -{ - if (mi.order() > order) - throw ogu::Exception(__FILE__, __LINE__, - "Wrong order of multi-index in FormulaDerivatives::derivative"); - if (mi.nv() != nvar) - throw ogu::Exception(__FILE__, __LINE__, - "Wrong multi-index variables in FormulaDerivatives::derivative"); - - auto it = ind2der.find(mi); - if (it == ind2der.end()) - return OperationTree::zero; - else - return tder[it->second]; -} - -void -FormulaDerivatives::print(const OperationTree &otree) const -{ - for (const auto &it : ind2der) - { - std::cout << "derivative "; - it.first.print(); - std::cout << " is formula " << tder[it.second] << '\n'; - otree.print_operation(tder[it.second]); - } -} - -void -FormulaCustomEvaluator::eval(const AtomValues &av, FormulaEvalLoader &loader) -{ - etree.reset_all(); - av.setValues(etree); - for (unsigned int i = 0; i < terms.size(); i++) - { - double res = etree.eval(terms[i]); - loader.load(static_cast(i), res); - } -} - -FoldMultiIndex::FoldMultiIndex(int nv) - : nvar(nv), ord(0), data(std::make_unique(ord)) -{ -} - -FoldMultiIndex::FoldMultiIndex(int nv, int ordd, int ii) - : nvar(nv), ord(ordd), data(std::make_unique(ord)) -{ - for (int i = 0; i < ord; i++) - data[i] = ii; -} - -/** Note that a monotone sequence mapped by monotone mapping yields a - * monotone sequence. */ -FoldMultiIndex::FoldMultiIndex(int nv, const FoldMultiIndex &mi, const vector &mp) - : nvar(nv), ord(mi.ord), data(std::make_unique(ord)) -{ - for (int i = 0; i < ord; i++) - { - if (i < ord-1 && mp[i+1] < mp[i]) - throw ogu::Exception(__FILE__, __LINE__, - "Mapping not monotone in FoldMultiIndex constructor"); - if (mp[mi[i]] >= nv || mp[mi[i]] < 0) - throw ogu::Exception(__FILE__, __LINE__, - "Mapping out of bounds in FoldMultiIndex constructor"); - data[i] = mp[mi[i]]; - } -} - -FoldMultiIndex::FoldMultiIndex(const FoldMultiIndex &fmi, int new_orders) - : nvar(fmi.nvar), - ord(fmi.ord+new_orders), - data(std::make_unique(ord)) -{ - std::copy_n(fmi.data.get(), fmi.ord, data.get()); - int new_item = (fmi.ord > 0) ? fmi.data[fmi.ord-1] : 0; - for (int i = fmi.ord; i < ord; i++) - data[i] = new_item; -} - -FoldMultiIndex::FoldMultiIndex(const FoldMultiIndex &fmi) - : nvar(fmi.nvar), - ord(fmi.ord), - data(std::make_unique(ord)) -{ - std::copy_n(fmi.data.get(), ord, data.get()); -} - -const FoldMultiIndex & -FoldMultiIndex::operator=(const FoldMultiIndex &fmi) -{ - if (ord != fmi.ord) - data = std::make_unique(fmi.ord); - - ord = fmi.ord; - nvar = fmi.nvar; - std::copy_n(fmi.data.get(), ord, data.get()); - - return *this; -} - -bool -FoldMultiIndex::operator<(const FoldMultiIndex &fmi) const -{ - if (nvar != fmi.nvar) - ogu::Exception(__FILE__, __LINE__, - "Different nvar in FoldMultiIndex::operator<"); - - if (ord < fmi.ord) - return true; - if (ord > fmi.ord) - return false; - - int i = 0; - while (i < ord && data[i] == fmi.data[i]) - i++; - if (i == ord) - return false; - else - return data[i] < fmi.data[i]; -} - -bool -FoldMultiIndex::operator==(const FoldMultiIndex &fmi) const -{ - bool res = true; - res = res && (nvar == fmi.nvar) && (ord == fmi.ord); - if (res) - for (int i = 0; i < ord; i++) - if (data[i] != fmi.data[i]) - return false; - return res; -} - -void -FoldMultiIndex::increment() -{ - if (ord == 0) - return; - - int k = ord-1; - data[k]++; - while (k > 0 && data[k] == nvar) - { - data[k] = 0; - data[--k]++; - } - for (int kk = 1; kk < ord; kk++) - if (data[kk-1] > data[kk]) - data[kk] = data[kk-1]; -} - -// For description of an algorithm for calculation of folded offset, -// see Tensor Library Documentation, Ondra Kamenik, 2005, description -// of FTensor::getOffsetRecurse(). -int -FoldMultiIndex::offset() const -{ - // make copy for the recursions - auto tmp = std::make_unique(ord); - std::copy_n(data.get(), ord, tmp.get()); - // call the recursive algorithm - int res = offset_recurse(tmp.get(), ord, nvar); - return res; -} - -void -FoldMultiIndex::print() const -{ - std::cout << "["; - for (int i = 0; i < ord; i++) - std::cout << data[i] << ' '; - std::cout << "]"; -} - -int -FoldMultiIndex::offset_recurse(int *data, int len, int nv) -{ - if (len == 0) - return 0; - // calculate length of initial constant indices - int prefix = 1; - while (prefix < len && data[0] == data[prefix]) - prefix++; - - int m = data[0]; - int s1 = PascalTriangle::noverk(nv+len-1, len) - PascalTriangle::noverk(nv-m+len-1, len); - - // cancel m from the rest of the sequence - for (int i = prefix; i < len; i++) - data[i] -= m; - - // calculate offset of the remaining sequence - int s2 = offset_recurse(data+prefix, len-prefix, nv-m); - // return the sum - return s1+s2; -} - -bool -ltfmi::operator()(const FoldMultiIndex &i1, const FoldMultiIndex &i2) const -{ - return i1 < i2; -} - -FormulaDerEvaluator::FormulaDerEvaluator(const FormulaParser &fp) - : etree(fp.otree, -1) -{ - for (const auto &der : fp.ders) - ders.push_back(der.get()); - - der_atoms = fp.atoms.variables(); -} - -void -FormulaDerEvaluator::eval(const AtomValues &av, FormulaDerEvalLoader &loader, int order) -{ - if (ders.size() == 0) - return; - int maxorder = ders[0]->order; - - if (order > maxorder) - throw ogu::Exception(__FILE__, __LINE__, - "Wrong order in FormulaDerEvaluator::eval"); - - etree.reset_all(); - av.setValues(etree); - - auto vars = std::make_unique(order); - - for (unsigned int i = 0; i < ders.size(); i++) - { - for (const auto &it : ders[i]->ind2der) - { - const FoldMultiIndex &mi = it.first; - if (mi.order() == order) - { - // set vars from multiindex mi and variables - for (int k = 0; k < order; k++) - vars[k] = der_atoms[mi[k]]; - // evaluate - double res = etree.eval(ders[i]->tder[it.second]); - // load - loader.load(i, order, vars.get(), res); - } - } - } -} - -void -FormulaDerEvaluator::eval(const vector &mp, const AtomValues &av, - FormulaDerEvalLoader &loader, int order) -{ - etree.reset_all(); - av.setValues(etree); - - int nvar_glob = der_atoms.size(); - int nvar = mp.size(); - auto vars = std::make_unique(order); - - for (unsigned int i = 0; i < ders.size(); i++) - { - FoldMultiIndex mi(nvar, order); - do - { - // find index of the derivative in the tensor - FoldMultiIndex mi_glob(nvar_glob, mi, mp); - int der = ders[i]->derivative(mi_glob); - if (der != OperationTree::zero) - { - // set vars from the global multiindex - for (int k = 0; k < order; k++) - vars[k] = der_atoms[mi_glob[k]]; - // evaluate derivative - double res = etree.eval(der); - // load - loader.load(i, order, vars.get(), res); - } - mi.increment(); - } - while (!mi.past_the_end()); - } -} diff --git a/dynare++/parser/cc/formula_parser.hh b/dynare++/parser/cc/formula_parser.hh deleted file mode 100644 index 09a9e37d6..000000000 --- a/dynare++/parser/cc/formula_parser.hh +++ /dev/null @@ -1,497 +0,0 @@ -/* - * Copyright © 2005-2011 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef OGP_FORMULA_PARSER_H -#define OGP_FORMULA_PARSER_H - -#include -#include -#include - -#include "tree.hh" - -namespace ogp -{ - using std::vector; - - /** Pure virtual class defining a minimal interface for - * representation of nulary terms within FormulaParser. */ - class Atoms - { - public: - Atoms() = default; - virtual ~Atoms() = default; - /** This returns previously assigned internal index to the - * given atom, or returns -1 if the atom has not been assigned - * yet. The method can raise an exception, if the Atoms - * implementation is strict and the name is not among - * prescribed possible values. */ - virtual int check(const std::string &name) const = 0; - /** This method assigns an internal index to the nulary term - * described by the name. The internal index is allocated by - * OperationTree class. */ - virtual void assign(const std::string &name, int t) = 0; - /** Returns a number of variables which will be used for - * differentiations. */ - virtual int nvar() const = 0; - /** Returns a vector of variable's internal indices which will - * be used for differentiations. */ - virtual vector variables() const = 0; - /** Debug print. */ - virtual void print() const = 0; - }; - - /** Pure virtual class defining interface for all classes able to - * set nulary terms to evaluation tree EvalTree. The - * implementations of this class will have to be connected with - * Atoms to have knowledge about the atoms and their indices in - * the tree, and will call EvalTree::set_nulary. */ - class AtomValues - { - public: - virtual ~AtomValues() = default; - virtual void setValues(EvalTree &et) const = 0; - }; - - class FormulaDerEvaluator; - class FoldMultiIndex; - /** For ordering FoldMultiIndex in the std::map. */ - struct ltfmi - { - bool operator()(const FoldMultiIndex &i1, const FoldMultiIndex &i2) const; - }; - - /** This class stores derivatives (tree indices) of one formula - * for all orders upto a given one. It stores the derivatives as a - * sequence (vector) of these tree indices and sequence of the - * multidimensional indices of variables wrt which the derivatives - * were taken. In order to speed up querying for a derivative - * given the variables, we have a map mapping the multidimensional - * index to the order of the derivative in the sequence. - * - * The only reason we do not have only this map is that the - * iterators of the map do not survive the insertions to the map, - * and implementation of the constructor has to be very difficult. - */ - class FormulaDerivatives - { - friend class FormulaDerEvaluator; - protected: - /** Vector of derivatives. This is a list of derivatives (tree - * indices), the ordering is given by the algorithm used to - * create it. Currently, it starts with zero-th derivative, - * the formula itself and carries with first order, second, - * etc. */ - vector tder; - /** Vector of multiindices corresponding to the vector of - * derivatives. */ - vector indices; - /** For retrieving derivatives via a multiindex, we have a map - * mapping a multiindex to a derivative in the tder - * ordering. This means that indices[ind2der[index]] == index. */ - using Tfmiintmap = map; - Tfmiintmap ind2der; - /** The number of variables. */ - int nvar; - /** The maximum order of derivatives. */ - int order; - public: - /** The constructor allocates and fills the sequence of the - * indices of derivatives for a formula. - * @param otree the OperationTree for which all work is done - * and to which the derivatives are added. - * @param vars the vector of nulary terms in the tree; the - * derivatives are taken with respect to these variables in - * the ordering given by the vector. - * @param f the index of the formula being differentiated. The - * zero derivative is set to f. - * @param max_order the maximum order of differentiation. - */ - FormulaDerivatives(OperationTree &otree, const vector &vars, int f, int max_order); - /** Copy constructor. */ - FormulaDerivatives(const FormulaDerivatives &fd); - virtual ~FormulaDerivatives() = default; - /** Random access to the derivatives via multiindex. */ - int derivative(const FoldMultiIndex &mi) const; - /** Return the order. */ - int - get_order() const - { - return order; - } - /** Debug print. */ - void print(const OperationTree &otree) const; - }; - - class FormulaEvaluator; - - /** This class is able to parse a number of formulas and - * differentiate them. The life cycle of the object is as follows: - * After it is created, a few calls to parse will add formulas - * (zero derivatives) to the object. Then a method differentiate() - * can be called and a vector of pointers to derivatives for each - * formula is created. After this, no one should call other - * parse() or differentiate(). A const reference of the object can - * be used in constructors of FormulaEvaluator and - * FormulaDerEvaluator in order to evaluate formulas (zero - * derivatives) and higher derivatives resp. */ - class FormulaParser - { - friend class FormulaCustomEvaluator; - friend class FormulaDerEvaluator; - protected: - /** The OperationTree of all formulas, including derivatives. */ - OperationTree otree; - /** Reference to Atoms. The Atoms are filled with nulary terms - * during execution of parse(). */ - Atoms &atoms; - /** Vector of formulas (zero derivatives) in the order as they - * have been parsed. */ - vector formulas; - /** The vector to derivatives, each vector corresponds to a - * formula in the vector formulas. */ - vector> ders; - public: - /** Construct an empty formula parser. */ - FormulaParser(Atoms &a) - : atoms(a) - { - } - FormulaParser(const FormulaParser &fp) = delete; - /** Copy constructor using a different instance of Atoms. */ - FormulaParser(const FormulaParser &fp, Atoms &a); - virtual ~FormulaParser() = default; - - /** Requires an addition of the formula; called from the - * parser. */ - void add_formula(int t); - /** Requires an addition of the binary operation; called from - * the parser. */ - int add_binary(code_t code, int t1, int t2); - /** Requires an addition of the unary operation; called from - * the parser. */ - int add_unary(code_t code, int t); - /** Requires an addition of the nulary operation given by the - * string. The Atoms are consulted for uniquness and are given - * an internal index generated by the OperationTree. This is - * the channel through which the Atoms are filled. */ - int add_nulary(const std::string &str); - - /** Adds a derivative to the tree. This just calls - * OperationTree::add_derivative. */ - int - add_derivative(int t, int v) - { - return otree.add_derivative(t, v); - } - /** Adds a substitution. This just calls - * OperationTree::add_substitution. */ - int - add_substitution(int t, const map &subst) - { - return otree.add_substitution(t, subst); - } - /** Add the substitution given by the map where left sides of - * substitutions come from another parser. The right sides are - * from this object. The given t is from the given parser fp. */ - int - add_substitution(int t, const map &subst, - const FormulaParser &fp) - { - return otree.add_substitution(t, subst, fp.otree); - } - /** This adds formulas from the given parser with (possibly) - * different atoms applying substitutions from the given map - * mapping atoms from fp to atoms of the object. */ - void add_subst_formulas(const map &subst, const FormulaParser &fp); - /** Substitute formulas. For each i from 1 through all - * formulas, it adds a substitution of the i-th formula and - * make it to be i-th formula.*/ - void substitute_formulas(const std::map &subst); - /** This method turns the given term to nulary operation. It - * should be used with caution, since this method does not - * anything do with atoms, but usually some action is also - * needed (at leat to assign the tree index t to some - * atom). */ - void - nularify(int t) - { - otree.nularify(t); - } - /** Returns a set of nulary terms of the given term. Just - * calls OperationTree::nulary_of_term. */ - const unordered_set & - nulary_of_term(int t) const - { - return otree.nulary_of_term(t); - } - - /** Parse a given string containing one or more formulas. The - * formulas are parsed and added to the OperationTree and to - * the formulas vector. */ - void parse(const std::string &stream); - /** Processes a syntax error from bison. */ - void error(std::string mes) const; - /** Differentiate all the formulas up to the given order. The - * variables with respect to which the derivatives are taken - * are obtained by Atoms::variables(). If the derivates exist, - * they are destroyed and created again (with possibly - * different order). */ - void differentiate(int max_order); - /** Return i-th formula derivatives. */ - const FormulaDerivatives &derivatives(int i) const; - - /** This returns a maximum index of zero derivative formulas - * including all nulary terms. This is a mimumum length of the - * tree for which it is safe to evaluate zero derivatives of - * the formulas. */ - int last_formula() const; - /** This returns a tree index of the i-th formula in the - * vector. */ - int - formula(int i) const - { - return formulas[i]; - } - - /** This returns a tree index of the last formula and pops its - * item from the formulas vector. The number of formulas is - * then less by one. Returns -1 if there is no formula. If - * there are derivatives of the last formula, they are - * destroyed and the vector ders is popped from the back. */ - int pop_last_formula(); - - /** This returns a number of formulas. */ - int - nformulas() const - { - return static_cast(formulas.size()); - } - - /** This returns a reference to atoms. */ - const Atoms & - getAtoms() const - { - return atoms; - } - Atoms & - getAtoms() - { - return atoms; - } - /** This returns the tree. */ - const OperationTree & - getTree() const - { - return otree; - } - OperationTree & - getTree() - { - return otree; - } - - /** Debug print. */ - void print() const; - }; - - /** This is a pure virtual class defining an interface for all - * classes which will load the results of formula (zero - * derivative) evaluations. A primitive implementation of this - * class can be a vector of doubles. */ - class FormulaEvalLoader - { - public: - virtual ~FormulaEvalLoader() = default; - /** Set the value res for the given formula. The formula is - * identified by an index corresponding to the ordering in - * which the formulas have been parsed (starting from - * zero). */ - virtual void load(int i, double res) = 0; - }; - - /** This class evaluates a selected subset of terms of the - * tree. In the protected constructor, one can constraint the - * initialization of the evaluation tree to a given number of - * terms in the beginning. Using this constructor, one has to make - * sure, that the terms in the beginning do not refer to terms - * behind the initial part. */ - class FormulaCustomEvaluator - { - protected: - /** The evaluation tree. */ - EvalTree etree; - /** The custom tree indices to be evaluated. */ - vector terms; - public: - /** Construct from FormulaParser and given list of terms. */ - FormulaCustomEvaluator(const FormulaParser &fp, vector ts) - : etree(fp.otree), terms(std::move(ts)) - { - } - /** Construct from OperationTree and given list of terms. */ - FormulaCustomEvaluator(const OperationTree &ot, vector ts) - : etree(ot), terms(std::move(ts)) - { - } - /** Evaluate the terms using the given AtomValues and load the - * results using the given loader. The loader is called for - * each term in the order of the terms. */ - void eval(const AtomValues &av, FormulaEvalLoader &loader); - protected: - FormulaCustomEvaluator(const FormulaParser &fp) - : etree(fp.otree, fp.last_formula()), terms(fp.formulas) - { - } - }; - - /** This class evaluates zero derivatives of the FormulaParser. */ - class FormulaEvaluator : public FormulaCustomEvaluator - { - public: - /** Construct from FormulaParser. */ - FormulaEvaluator(const FormulaParser &fp) - : FormulaCustomEvaluator(fp) - { - } - }; - - /** This is a pure virtual class defining an interface for all - * classes which will load the results of formula derivative - * evaluations. */ - class FormulaDerEvalLoader - { - public: - virtual ~FormulaDerEvalLoader() = default; - /** This loads the result of the derivative of the given - * order. The semantics of i is the same as in - * FormulaEvalLoader::load. The indices of variables with - * respect to which the derivative was taken are stored in - * memory pointed by vars. These are the tree indices of the - * variables. */ - virtual void load(int i, int order, const int *vars, double res) = 0; - }; - - /** This class is a utility class representing the tensor - * multindex. It can basically increment itself, and calculate - * its offset in the folded tensor. */ - class FoldMultiIndex - { - /** Number of variables. */ - int nvar; - /** Dimension. */ - int ord; - /** The multiindex. */ - std::unique_ptr data; - public: - /** Initializes to the zero derivative. Order is 0, data is - * empty. */ - FoldMultiIndex(int nv); - /** Initializes the multiindex to zeros or given i. */ - FoldMultiIndex(int nv, int order, int i = 0); - /** Makes a new multiindex of the same order applying a given - * mapping to the indices. The mapping is supposed to be monotone. */ - FoldMultiIndex(int nv, const FoldMultiIndex &mi, const vector &mp); - /** Shifting constructor. This adds a given number of orders - * to the end, copying the last item to the newly added items, - * keeping the index ordered. If the index was empty (zero-th - * dimension), then zeros are added. */ - FoldMultiIndex(const FoldMultiIndex &fmi, int new_orders); - /** Copy constructor. */ - FoldMultiIndex(const FoldMultiIndex &fmi); - /** Desctructor. */ - virtual ~FoldMultiIndex() = default; - /** Assignment operator. */ - const FoldMultiIndex &operator=(const FoldMultiIndex &fmi); - /** Operator < implementing lexicographic ordering within one - * order, increasing order across orders. */ - bool operator<(const FoldMultiIndex &fmi) const; - bool operator==(const FoldMultiIndex &fmi) const; - /** Increment the multiindex. */ - void increment(); - /** Return offset of the multiindex in the folded tensor. */ - int offset() const; - const int & - operator[](int i) const - { - return data[i]; - } - /** Return order of the multiindex, i.e. dimension of the - * tensor. */ - int - order() const - { - return ord; - } - /** Return the number of variables. */ - int - nv() const - { - return nvar; - } - /** Return the data. */ - const int * - ind() const - { - return data.get(); - } - /** Return true if the end of the tensor is reached. The - * result of a subsequent increment should be considered - * unpredictable. */ - bool - past_the_end() const - { - return (ord == 0) || (data[0] == nvar); - } - /** Prints the multiindex in the brackets. */ - void print() const; - private: - static int offset_recurse(int *data, int len, int nv); - }; - - /** This class evaluates derivatives of the FormulaParser. */ - class FormulaDerEvaluator - { - /** Its own instance of EvalTree. */ - EvalTree etree; - /** The indices of derivatives for each formula. This is a - * const copy FormulaParser::ders. We do not allocate nor - * deallocate anything here. */ - vector ders; - /** A copy of tree indices corresponding to atoms to with - * respect the derivatives were taken. */ - vector der_atoms; - public: - /** Construct the object from FormulaParser. */ - FormulaDerEvaluator(const FormulaParser &fp); - /** Evaluate the derivatives from the FormulaParser wrt to all - * atoms in variables vector at the given AtomValues. The - * given loader is used for output. */ - void eval(const AtomValues &av, FormulaDerEvalLoader &loader, int order); - /** Evaluate the derivatives from the FormulaParser wrt to a - * selection of atoms of the atoms in der_atoms vector at the - * given AtomValues. The selection is given by a monotone - * mapping to the indices (not values) of the der_atoms. */ - void eval(const vector &mp, const AtomValues &av, FormulaDerEvalLoader &loader, - int order); - }; -}; - -#endif diff --git a/dynare++/parser/cc/location.hh b/dynare++/parser/cc/location.hh deleted file mode 100644 index 43a2839ce..000000000 --- a/dynare++/parser/cc/location.hh +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright © 2006, Ondra Kamenik - -// $Id: location.h 762 2006-05-22 13:00:07Z kamenik $ - -// Purpose: This file defines macros for lex and bison so that the -// very primitive location tracking would be enabled. The location of -// a token is given by offset of its first character. The offset is -// relative to the number which is (and must be) initialized before -// parsing. This file is to be included to the top of bison and lex -// sources. - -// How to use: in preamble of bison and flex, you must include this -// file and declare extern YYLTYPE prefix##lloc. In addition, in flex, -// you must define int prefix##ll =0; and use macro SET_LLOC(prefix) -// in EVERY action consuming material (this can be done with #define -// YY_USER_ACTION) and in bison you must use option %locations. - -#ifndef OG_LOCATION_H -#define OG_LOCATION_H - -namespace ogp -{ - struct location_type - { - int off{0}; // offset of the token - int ll{0}; // length ot the token - location_type() = default; - }; -}; - -// set current off to the first off and add all lengths -#define YYLLOC_DEFAULT(Current, Rhs, N) \ - { \ - (Current).off = (Rhs)[1].off; \ - (Current).ll = 0; \ - for (int i = 1; i <= N; i++) \ - (Current).ll += (Rhs)[i].ll; \ - } - -#define SET_LLOC(prefix) (prefix ## lloc.off += prefix ## lloc.ll, prefix ## lloc.ll = prefix ## leng) - -#endif diff --git a/dynare++/parser/cc/matrix.ll b/dynare++/parser/cc/matrix.ll deleted file mode 100644 index ca710f258..000000000 --- a/dynare++/parser/cc/matrix.ll +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- C++ -*- */ -/* - * Copyright © 2006-2011 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -%{ -#include - -#include "location.hh" -#include "matrix_tab.hh" - -extern void matrix_error(std::string); - -#define YY_USER_ACTION SET_LLOC(matrix_); -%} - -%option nounput -%option noyy_top_state -%option stack -%option yylineno -%option prefix="matrix_" -%option never-interactive -%x CMT - -%% - - /* comments */ -<*>"/*" {yy_push_state(CMT);} -[^*\n]* -"*"+[^*/\n]* -"*"+"/" {yy_pop_state();} -[\n] -"//".*\n - - /* ignore spaces and commas */ -[ \t,] - /* new row */ -\r\n {return NEW_ROW;} -\n {return NEW_ROW;} -;[ \t]*\n {return NEW_ROW;} -;[ \t]*\r\n {return NEW_ROW;} -; {return NEW_ROW;} - -[+-]?(([0-9]*\.?[0-9]+)|([0-9]+\.))([edED][-+]?[0-9]+)? { - matrix_lval.val = strtod(matrix_text, NULL); - return DNUMBER; -} - -. { - using namespace std::string_literals; - matrix_error("Unrecognized character "s + matrix_text); -} - -%% - -int -matrix_wrap() -{ - return 1; -} - -void -matrix__destroy_buffer(void* p) -{ - matrix__delete_buffer(static_cast(p)); -} diff --git a/dynare++/parser/cc/matrix.yy b/dynare++/parser/cc/matrix.yy deleted file mode 100644 index b80f3aef7..000000000 --- a/dynare++/parser/cc/matrix.yy +++ /dev/null @@ -1,89 +0,0 @@ -// -*- C++ -*- -/* - * Copyright © 2006-2011 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -%code requires -{ -#include "location.hh" -#define MATRIX_LTYPE ogp::location_type -} - -%code -{ -#include "matrix_parser.hh" - -void matrix_error(std::string); -int matrix_lex(); -extern ogp::MatrixParser* mparser; -} - -%union -{ - double val; - int integer; -} - -%token NEW_ROW -%token DNUMBER - -%define api.prefix {matrix_}; - -%locations -%defines -%define parse.error verbose - -%% - -matrix : first_row other_rows - | first_row other_rows empty_rows - | first_row empty_rows other_rows empty_rows - | first_row empty_rows other_rows - | empty_rows first_row other_rows - | empty_rows first_row other_rows empty_rows - | empty_rows first_row empty_rows other_rows empty_rows - | empty_rows first_row empty_rows - | first_row empty_rows - | empty_rows first_row - | first_row - | empty_rows - ; - -empty_rows : empty_rows NEW_ROW | NEW_ROW; - -lod : DNUMBER {mparser->add_item($1);} - | lod DNUMBER {mparser->add_item($2);} - ; - -first_row : lod; - -other_rows : other_rows one_row | other_rows empty_rows one_row |one_row ; - -one_row : NEW_ROW {mparser->start_row();} lod; - - -%% - -void -matrix_error(std::string s) -{ - mparser->error(std::move(s)); -} - - diff --git a/dynare++/parser/cc/matrix_parser.cc b/dynare++/parser/cc/matrix_parser.cc deleted file mode 100644 index 91d90a01f..000000000 --- a/dynare++/parser/cc/matrix_parser.cc +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "parser_exception.hh" -#include "matrix_parser.hh" -#include "location.hh" -#include "matrix_tab.hh" - -#include - -using namespace ogp; - -/** A global symbol for passing info to the MatrixParser from - * matrix_parse(). */ -MatrixParser *mparser; - -/** The declaration of functions defined in matrix_ll.cc and - * matrix_tab.cc generated from matrix.lex and matrix.y. */ -void *matrix__scan_string(const char *); -void matrix__destroy_buffer(void *); -int matrix_parse(); -extern ogp::location_type matrix_lloc; - -void -MatrixParser::parse(const string &stream) -{ - // reinitialize the object - data.clear(); - row_lengths.clear(); - nc = 0; - // allocate temporary buffer and parse - matrix_lloc.off = 0; - matrix_lloc.ll = 0; - void *p = matrix__scan_string(stream.c_str()); - mparser = this; - matrix_parse(); - matrix__destroy_buffer(p); -} - -void -MatrixParser::add_item(double v) -{ - data.push_back(v); - if (row_lengths.size() == 0) - row_lengths.push_back(0); - (row_lengths.back())++; - nc = std::max(nc, row_lengths.back()); -} - -void -MatrixParser::start_row() -{ - row_lengths.push_back(0); -} - -void -MatrixParser::error(string mes) const -{ - throw ParserException(std::move(mes), matrix_lloc.off); -} - -int -MatrixParser::find_first_non_empty_row(int start) const -{ - int r = start; - while (r < static_cast(row_lengths.size()) && row_lengths[r] == 0) - r++; - return r; -} - -MPIterator -MatrixParser::begin() const -{ - MPIterator it(*this); - return it; -} - -MPIterator -MatrixParser::end() const -{ - MPIterator it(*this, "end"); - return it; -} - -MPIterator::MPIterator(const MatrixParser &mp) - : p(&mp), i(0), r(mp.find_first_non_empty_row()) -{ -} - -MPIterator::MPIterator(const MatrixParser &mp, const char *dummy) - : p(&mp), i(mp.data.size()), r(mp.row_lengths.size()) -{ -} - -MPIterator & -MPIterator::operator++() -{ - i++; - c++; - if (p->row_lengths[r] <= c) - { - c = 0; - r = p->find_first_non_empty_row(r+1); - } - return *this; -} diff --git a/dynare++/parser/cc/matrix_parser.hh b/dynare++/parser/cc/matrix_parser.hh deleted file mode 100644 index 3a7c9c296..000000000 --- a/dynare++/parser/cc/matrix_parser.hh +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef OGP_MATRIX_PARSER -#define OGP_MATRIX_PARSER - -#include -#include - -namespace ogp -{ - using std::vector; - - /** This class reads the given string and parses it as a - * matrix. The matrix is read row by row. The row delimiter is - * either a newline character or semicolon (first newline - * character after the semicolon is ignored), the column delimiter - * is either blank character or comma. A different number of items - * in the row is not reconciliated, we do not construct a matrix - * here. The class provides only an iterator to go through all - * read items, the iterator provides information on row number and - * column number of the item. */ - class MPIterator; - class MatrixParser - { - friend class MPIterator; - protected: - /** Raw data as they were read. */ - vector data; - /** Number of items in each row. */ - vector row_lengths; - /** Maximum number of row lengths. */ - int nc{0}; - public: - MatrixParser() = default; - MatrixParser(const MatrixParser &mp) = default; - virtual ~MatrixParser() = default; - /** Return a number of read rows. */ - int - nrows() const - { - return static_cast(row_lengths.size()); - } - /** Return a maximum number of items in the rows. */ - int - ncols() const - { - return nc; - } - /** Parses a given data. This initializes the object data. */ - void parse(const std::string &stream); - /** Adds newly read item. This should be called from bison - * parser. */ - void add_item(double v); - /** Starts a new row. This should be called from bison - * parser. */ - void start_row(); - /** Process a parse error from the parser. */ - void error(std::string mes) const; - /** Return begin iterator. */ - MPIterator begin() const; - /** Return end iterator. */ - MPIterator end() const; - protected: - /** Returns an index of the first non-empty row starting at - * start. If the start row is non-empty, returns the start. If - * there is no other non-empty row, returns - * row_lengths.size(). */ - int find_first_non_empty_row(int start = 0) const; - }; - - /** This is an iterator intended to iterate through a matrix parsed - * by MatrixParser. The iterator provides only read-only access. */ - class MPIterator - { - friend class MatrixParser; - protected: - /** Reference to the matrix parser. */ - const MatrixParser *p{nullptr}; - /** The index of the pointed item in the matrix parser. */ - unsigned int i{0}; - /** The column number of the pointed item starting from zero. */ - int c{0}; - /** The row number of the pointed item starting from zero. */ - int r{0}; - - public: - MPIterator() = default; - /** Constructs an iterator pointing to the beginning of the - * parsed matrix. */ - MPIterator(const MatrixParser &mp); - /** Constructs an iterator pointing to the past-the-end of the - * parsed matrix. */ - MPIterator(const MatrixParser &mp, const char *dummy); - /** Return read-only reference to the pointed item. */ - const double & - operator*() const - { - return p->data[i]; - } - /** Return a row index of the pointed item. */ - int - row() const - { - return r; - } - /** Return a column index of the pointed item. */ - int - col() const - { - return c; - } - /** Assignment operator. */ - MPIterator &operator=(const MPIterator &it) = default; - /** Return true if the iterators are the same, this is if they - * have the same underlying object and the same item index. */ - bool - operator==(const MPIterator &it) const - { - return it.p == p && it.i == i; - } - /** Negative of the operator==. */ - bool - operator!=(const MPIterator &it) const - { - return !(it == *this); - } - /** Increment operator. */ - MPIterator &operator++(); - }; -}; - -#endif diff --git a/dynare++/parser/cc/parser_exception.cc b/dynare++/parser/cc/parser_exception.cc deleted file mode 100644 index 8659c3336..000000000 --- a/dynare++/parser/cc/parser_exception.cc +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "parser_exception.hh" - -using namespace ogp; - -ParserException::ParserException(string m, int offset) - : mes(std::move(m)), off(offset), - aux_i1(-1), aux_i2(-1), aux_i3(-1) -{ -} - -ParserException::ParserException(string m, const char *dum, int i1) - : mes(std::move(m)), off(0), - aux_i1(i1), aux_i2(-1), aux_i3(-1) -{ -} - -ParserException::ParserException(string m, const char *dum, int i1, int i2) - : mes(std::move(m)), off(0), - aux_i1(i1), aux_i2(i2), aux_i3(-1) -{ -} - -ParserException::ParserException(string m, const char *dum, int i1, int i2, int i3) - : mes(std::move(m)), off(0), - aux_i1(i1), aux_i2(i2), aux_i3(i3) -{ -} - -ParserException::ParserException(const ParserException &m, int plus_offset) - : aux_i1(-1), aux_i2(-1), aux_i3(-1) -{ - copy(m); - off += plus_offset; -} - -ParserException::ParserException(const ParserException &m, const char *dum, int i) - : aux_i1(-1), aux_i2(-1), aux_i3(-1) -{ - copy(m); - aux_i3 = m.aux_i2; - aux_i2 = m.aux_i1; - aux_i1 = i; -} - -ParserException::ParserException(const ParserException &m, const char *dum, int i1, int i2) - : aux_i1(-1), aux_i2(-1), aux_i3(-1) -{ - copy(m); - aux_i3 = m.aux_i1; - aux_i2 = i2; - aux_i1 = i1; -} - -ParserException::ParserException(const ParserException &m, const char *dum, int i1, int i2, int i3) - : aux_i1(-1), aux_i2(-1), aux_i3(-1) -{ - copy(m); - aux_i3 = i3; - aux_i2 = i2; - aux_i1 = i1; -} - -void -ParserException::copy(const ParserException &e) -{ - mes = e.mes; - off = e.off; - aux_i1 = e.aux_i1; - aux_i2 = e.aux_i2; - aux_i3 = e.aux_i3; -} diff --git a/dynare++/parser/cc/parser_exception.hh b/dynare++/parser/cc/parser_exception.hh deleted file mode 100644 index d8b69fe1f..000000000 --- a/dynare++/parser/cc/parser_exception.hh +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef OG_FORMULA_PARSER_H -#define OG_FORMULA_PARSER_H - -#include - -namespace ogp -{ - using std::string; - - /** This is an easy exception, which, besides the message, stores - * also an offset of the parse error. Since we might need to track - * the argument number and for example the filed in the argument - * which caused the error, we add three integers, which have no - * semantics here. They should be documented in the function which - * throws an exception and sets them. Their default value is -1, - * which means they have not been set. */ - class ParserException - { - protected: - string mes; - int off; - int aux_i1; - int aux_i2; - int aux_i3; - public: - ParserException(string m, int offset); - ParserException(string m, const char *dum, int i1); - ParserException(string m, const char *dum, int i1, int i2); - ParserException(string m, const char *dum, int i1, int i2, int i3); - ParserException(const ParserException &e, int plus_offset); - /** Makes a copy and pushes given integer to aux_i1 shuffling - * others and forgetting the last. */ - ParserException(const ParserException &e, const char *dum, int i); - /** Makes a copy and pushes given two integers to aux_i1 and aux_i2 shuffling - * others and forgetting the last two. */ - ParserException(const ParserException &e, const char *dum, int i1, int i2); - /** Makes a copy and pushes given three integers to aux_i1, aux_i2, aus_i3 shuffling - * others and forgetting the last three. */ - ParserException(const ParserException &e, const char *dum, int i1, int i2, int i3); - ParserException(const ParserException &e) = default; - virtual ~ParserException() = default; - const string & - message() const - { - return mes; - } - int - offset() const - { - return off; - } - const int & - i1() const - { - return aux_i1; - } - int & - i1() - { - return aux_i1; - } - const int & - i2() const - { - return aux_i2; - } - int & - i2() - { - return aux_i2; - } - const int & - i3() const - { - return aux_i3; - } - int & - i3() - { - return aux_i3; - } - protected: - void copy(const ParserException &e); - }; -}; - -#endif diff --git a/dynare++/parser/cc/static_atoms.cc b/dynare++/parser/cc/static_atoms.cc deleted file mode 100644 index cc64d9897..000000000 --- a/dynare++/parser/cc/static_atoms.cc +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "static_atoms.hh" -#include "utils/cc/exception.hh" - -using namespace ogp; - -void -StaticAtoms::import_atoms(const DynamicAtoms &da, OperationTree &otree, Tintintmap &tmap) -{ - Constants::import_constants(da, otree, tmap); - - for (int i = 0; i < da.get_name_storage().num(); i++) - { - const string &name = da.get_name_storage().get_name(i); - register_name(name); - int tnew = otree.add_nulary(); - assign(name, tnew); - if (da.is_referenced(name)) - { - const DynamicAtoms::Tlagmap &lmap = da.lagmap(name); - for (const auto &it : lmap) - { - int told = it.second; - tmap.emplace(told, tnew); - } - } - } -} - -int -StaticAtoms::check(const string &name) const -{ - if (DynamicAtoms::is_string_constant(name)) - return Constants::check(name); - else - return check_variable(name); -} - -int -StaticAtoms::index(const string &name) const -{ - auto it = vars.find(name); - if (it == vars.end()) - return -1; - else - return it->second; -} - -void -StaticAtoms::assign(const string &name, int t) -{ - if (DynamicAtoms::is_string_constant(name)) - { - double val = std::stod(name); - add_constant(t, val); - } - else - { - varnames.insert(name); - vars.emplace(name, t); - indices.emplace(t, name); - } -} - -vector -StaticAtoms::variables() const -{ - vector res; - for (const auto &var : vars) - res.push_back(var.second); - return res; -} - -void -StaticAtoms::register_name(string name) -{ - varnames.insert(name); - varorder.push_back(std::move(name)); -} - -void -StaticAtoms::print() const -{ - std::cout << "constants:\n"; - Constants::print(); - std::cout << "variable names:\n"; - varnames.print(); - std::cout << "map to tree indices:\n"; - for (auto var : vars) - std::cout << var.first << "\t→\t" << var.second << "\n"; -} diff --git a/dynare++/parser/cc/static_atoms.hh b/dynare++/parser/cc/static_atoms.hh deleted file mode 100644 index bb2d954fe..000000000 --- a/dynare++/parser/cc/static_atoms.hh +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef OGP_STATIC_ATOMS -#define OGP_STATIC_ATOMS - -#include "dynamic_atoms.hh" - -namespace ogp -{ - class StaticAtoms : public Atoms, public Constants - { - protected: - using Tvarmap = map; - using Tinvmap = map; - /** Storage for names. */ - NameStorage varnames; - /** Outer order of variables. */ - vector varorder; - /** This is the map mapping a variable name to the tree - * index. */ - Tvarmap vars; - /** This is the inverse mapping. It maps a tree index to the - * variable name. */ - Tinvmap indices; - public: - StaticAtoms() = default; - /** Conversion from DynamicAtoms. This takes all atoms from - * the DynamicAtoms and adds its static version. The new tree - * indices are allocated in the passed OperationTree. Whole - * the process is traced in the map mapping old tree indices - * to new tree indices. */ - StaticAtoms(const DynamicAtoms &da, OperationTree &otree, Tintintmap &tmap) - : Atoms(), Constants(), varnames(), varorder(), vars() - { - import_atoms(da, otree, tmap); - } - /* Destructor. */ - ~StaticAtoms() override = default; - /** This imports atoms from dynamic atoms inserting the new - * tree indices to the given tree (including constants). The - * mapping from old atoms to new atoms is traced in tmap. */ - void import_atoms(const DynamicAtoms &da, OperationTree &otree, - Tintintmap &tmap); - /** If the name is constant, it returns its tree index if the - * constant is registered in Constants, it returns -1 - * otherwise. If the name is not constant, it returns result - * from check_variable, which is implemented by a subclass. */ - int check(const string &name) const override; - /** This assigns a given tree index to the variable name. The - * name should have been checked before the call. */ - void assign(const string &name, int t) override; - int - nvar() const override - { - return varnames.num(); - } - /** This returns a vector of all variables. */ - vector variables() const override; - /** This returns a tree index of the given variable. */ - int index(const string &name) const; - /** This returns a name in a outer ordering. (There is no other ordering.) */ - const string & - name(int i) const - { - return varorder[i]; - } - /** Debug print. */ - void print() const override; - /** This registers a variable. A subclass can reimplement - * this, for example, to ensure uniqueness of the - * name. However, this method should be always called in - * overriding methods to do the registering job. */ - virtual void register_name(string name); - /** Return the name storage to allow querying to other - * classes. */ - const NameStorage & - get_name_storage() const - { - return varnames; - } - protected: - /** This checks the variable. The implementing subclass might - * want to throw an exception if the variable has not been - * registered. */ - virtual int check_variable(const string &name) const = 0; - }; -}; - -#endif diff --git a/dynare++/parser/cc/static_fine_atoms.cc b/dynare++/parser/cc/static_fine_atoms.cc deleted file mode 100644 index 4d7406c14..000000000 --- a/dynare++/parser/cc/static_fine_atoms.cc +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "utils/cc/exception.hh" - -#include "static_fine_atoms.hh" -#include "parser_exception.hh" - -using namespace ogp; - -void -StaticFineAtoms::import_atoms(const FineAtoms &fa, OperationTree &otree, Tintintmap &tmap) -{ - StaticAtoms::import_atoms(fa, otree, tmap); - - // we just need to put parameters, endovars, and exovars to - // respective vectors, the names are already in the storage - - // parameters - auto &fa_params = fa.get_params(); - for (const auto &fa_param : fa_params) - register_param(fa_param); - - // endogenous - auto &fa_endovars = fa.get_endovars(); - for (const auto &fa_endovar : fa_endovars) - register_endo(fa_endovar); - - // exogenous - auto &fa_exovars = fa.get_exovars(); - for (const auto &fa_exovar : fa_exovars) - register_exo(fa_exovar); - - parsing_finished(); -} - -void -StaticFineAtoms::import_atoms(const FineAtoms &fa, OperationTree &otree, Tintintmap &tmap, - const char *dummy) -{ - StaticAtoms::import_atoms(fa, otree, tmap); - - // we just need to put parameters, endovars, and exovars to - // respective vectors, the names are already in the storage - - // parameters - auto &fa_params = fa.get_params(); - for (const auto &fa_param : fa_params) - register_param(fa_param); - - // endogenous - auto &fa_endovars = fa.get_endovars(); - for (unsigned int i = 0; i < fa_endovars.size(); i++) - register_endo(fa_endovars[fa.y2outer_endo()[i]]); - - // exogenous - auto &fa_exovars = fa.get_exovars(); - for (unsigned int i = 0; i < fa_exovars.size(); i++) - register_exo(fa_exovars[fa.y2outer_exo()[i]]); - - parsing_finished(); -} - -int -StaticFineAtoms::check_variable(const string &name) const -{ - if (!varnames.query(name)) - throw ParserException("Variable <"+name+"> not declared.", 0); - return index(name); -} - -void -StaticFineAtoms::parsing_finished() -{ - // build der_atoms, and endo_atoms_map and exo_atoms_map - der_atoms.clear(); - endo_atoms_map.clear(); - exo_atoms_map.clear(); - - // go through all endo and exo insert tree indices, ignore names - // whose tree index is -1 (those which are not referenced) - for (auto &endovar : endovars) - { - int t = index(endovar); - if (t != -1) - { - endo_atoms_map.push_back(der_atoms.size()); - der_atoms.push_back(t); - } - } - for (auto &exovar : exovars) - { - int t = index(exovar); - if (t != -1) - { - exo_atoms_map.push_back(der_atoms.size()); - der_atoms.push_back(t); - } - } -} - -int -StaticFineAtoms::name2outer_param(const string &name) const -{ - auto it = param_outer_map.find(name); - if (it == param_outer_map.end()) - throw ogu::Exception(__FILE__, __LINE__, - "Name is not a parameter in StaticFineAtoms::name2outer_param"); - return it->second; -} - -int -StaticFineAtoms::name2outer_endo(const string &name) const -{ - auto it = endo_outer_map.find(name); - if (it == endo_outer_map.end()) - throw ogu::Exception(__FILE__, __LINE__, - "Name is not an endogenous variable in StaticFineAtoms::name2outer_endo"); - return it->second; -} - -int -StaticFineAtoms::name2outer_exo(const string &name) const -{ - auto it = exo_outer_map.find(name); - if (it == exo_outer_map.end()) - throw ogu::Exception(__FILE__, __LINE__, - "Name is not an exogenous variable in StaticFineAtoms::name2outer_exo"); - return it->second; -} - -void -StaticFineAtoms::register_uniq_endo(string name) -{ - if (varnames.query(name)) - throw ogp::ParserException("Endogenous variable <"+name+"> is not unique.", 0); - varnames.insert(name); - register_endo(std::move(name)); -} - -void -StaticFineAtoms::register_uniq_exo(string name) -{ - if (varnames.query(name)) - throw ogp::ParserException("Exogenous variable <"+name+"> is not unique.", 0); - varnames.insert(name); - register_exo(std::move(name)); -} - -void -StaticFineAtoms::register_uniq_param(string name) -{ - if (varnames.query(name)) - throw ogp::ParserException("Parameter <"+name+"> is not unique.", 0); - varnames.insert(name); - register_param(std::move(name)); -} - -void -StaticFineAtoms::print() const -{ - StaticAtoms::print(); - std::cout << "endo atoms map:\n"; - for (unsigned int i = 0; i < endo_atoms_map.size(); i++) - std::cout << i << " → " << endo_atoms_map[i] << "\n"; - std::cout << "exo atoms map:\n"; - for (unsigned int i = 0; i < exo_atoms_map.size(); i++) - std::cout << i << " → " << exo_atoms_map[i] << "\n"; - std::cout << "der atoms:\n"; - for (unsigned int i = 0; i < der_atoms.size(); i++) - std::cout << i << "\t" << der_atoms[i] << "\n"; -} - -void -StaticFineAtoms::register_endo(string name) -{ - if (!varnames.query(name)) - throw ogp::ParserException("Endogenous variable <"+name+"> not found in storage.", 0); - endovars.push_back(name); - endo_outer_map.emplace(std::move(name), endovars.size()-1); -} - -void -StaticFineAtoms::register_exo(string name) -{ - if (!varnames.query(name)) - throw ogp::ParserException("Exogenous variable <"+name+"> not found in storage.", 0); - exovars.push_back(name); - exo_outer_map.emplace(std::move(name), exovars.size()-1); -} - -void -StaticFineAtoms::register_param(string name) -{ - if (!varnames.query(name)) - throw ogp::ParserException("Parameter <"+name+"> not found in storage.", 0); - params.push_back(name); - param_outer_map.emplace(std::move(name), params.size()-1); -} diff --git a/dynare++/parser/cc/static_fine_atoms.hh b/dynare++/parser/cc/static_fine_atoms.hh deleted file mode 100644 index 482d5e33d..000000000 --- a/dynare++/parser/cc/static_fine_atoms.hh +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef OGP_STATIC_FINE_ATOMS_H -#define OGP_STATIC_FINE_ATOMS_H - -#include "static_atoms.hh" -#include "fine_atoms.hh" - -namespace ogp -{ - /** This class represents static atoms distinguishing between - * parameters, endogenous and exogenous variables. The class - * maintains also ordering of all three categories (referenced as - * outer or inner, since there is only one ordering). It can be - * constructed either from scratch, or from fine dynamic atoms. In - * the latter case, one can decide if the ordering of this static - * atoms should be internal or external ordering of the original - * dynamic fine atoms. */ - class StaticFineAtoms : public StaticAtoms - { - public: - using Tintintmap = map; - protected: - using Tvarintmap = map; - private: - /** The vector of parameter names, gives the parameter - * ordering. */ - vector params; - /** A map mappping a parameter name to an index in the ordering. */ - Tvarintmap param_outer_map; - /** The vector of endogenous variables. This defines the order - * like parameters. */ - vector endovars; - /** A map mapping a name of an endogenous variable to an index - * in the ordering. */ - Tvarintmap endo_outer_map; - /** The vector of exogenous variables. Also defines the order - * like parameters and endovars. */ - vector exovars; - /** A map mapping a name of an exogenous variable to an index - * in the outer ordering. */ - Tvarintmap exo_outer_map; - /** This vector defines a set of atoms as tree indices used - * for differentiation. The order of the atoms in is the - * concatenation of the outer ordering of endogenous and - * exogenous. This vector is setup by parsing_finished() and - * is returned by variables(). */ - vector der_atoms; - /** This is a mapping from endogenous atoms to all atoms in - * der_atoms member. The mapping maps index in endogenous atom - * ordering to index (not value) in der_atoms. It is useful if - * one wants to evaluate derivatives wrt only endogenous - * variables. It is set by parsing_finished(). By definition, - * it is monotone. */ - vector endo_atoms_map; - /** This is a mapping from exogenous atoms to all atoms in - * der_atoms member. It is the same as endo_atoms_map for - * atoms of exogenous variables. */ - vector exo_atoms_map; - public: - StaticFineAtoms() = default; - /** Conversion from dynamic FineAtoms taking its outer - * ordering as ordering of parameters, endogenous and - * exogenous. A biproduct is an integer to integer map mapping - * tree indices of the dynamic atoms to tree indices of the - * static atoms. */ - StaticFineAtoms(const FineAtoms &fa, OperationTree &otree, Tintintmap &tmap) - { - StaticFineAtoms::import_atoms(fa, otree, tmap); - } - /** Conversion from dynamic FineAtoms taking its internal - * ordering as ordering of parameters, endogenous and - * exogenous. A biproduct is an integer to integer map mapping - * tree indices of the dynamic atoms to tree indices of the - * static atoms. */ - StaticFineAtoms(const FineAtoms &fa, OperationTree &otree, Tintintmap &tmap, - const char *dummy) - { - StaticFineAtoms::import_atoms(fa, otree, tmap, dummy); - } - ~StaticFineAtoms() override = default; - /** This adds atoms from dynamic atoms inserting new tree - * indices to the given tree and tracing the mapping from old - * atoms to new atoms in tmap. The ordering of the static - * atoms is the same as outer ordering of dynamic atoms. */ - void import_atoms(const FineAtoms &fa, OperationTree &otree, Tintintmap &tmap); - /** This adds atoms from dynamic atoms inserting new tree - * indices to the given tree and tracing the mapping from old - * atoms to new atoms in tmap. The ordering of the static - * atoms is the same as internal ordering of dynamic atoms. */ - void import_atoms(const FineAtoms &fa, OperationTree &otree, Tintintmap &tmap, - const char *dummy); - /** Overrides StaticAtoms::check_variable so that the error - * would be raised if the variable name is not declared. A - * variable is declared by inserting it to - * StaticAtoms::varnames, which is done with registering - * methods. This a responsibility of a subclass. */ - int check_variable(const string &name) const override; - /** Return an (external) ordering of parameters. */ - const vector & - get_params() const - { - return params; - } - /** Return an external ordering of endogenous variables. */ - const vector & - get_endovars() const - { - return endovars; - } - /** Return an external ordering of exogenous variables. */ - const vector & - get_exovars() const - { - return exovars; - } - /** This constructs der_atoms, and the endo_endoms_map and - * exo_atoms_map, which can be created only after the parsing - * is finished. */ - void parsing_finished(); - /** Return the atoms with respect to which we are going to - * differentiate. */ - vector - variables() const override - { - return der_atoms; - } - /** Return the endo_atoms_map. */ - const vector & - get_endo_atoms_map() const - { - return endo_atoms_map; - } - /** Return the exo_atoms_map. */ - const vector & - get_exo_atoms_map() const - { - return endo_atoms_map; - } - /** Return an index in the outer ordering of a given - * parameter. An exception is thrown if the name is not a - * parameter. */ - int name2outer_param(const string &name) const; - /** Return an index in the outer ordering of a given - * endogenous variable. An exception is thrown if the name is not a - * and endogenous variable. */ - int name2outer_endo(const string &name) const; - /** Return an index in the outer ordering of a given - * exogenous variable. An exception is thrown if the name is not a - * and exogenous variable. */ - int name2outer_exo(const string &name) const; - /** Return the number of endogenous variables. */ - int - ny() const - { - return endovars.size(); - } - /** Return the number of exogenous variables. */ - int - nexo() const - { - return static_cast(exovars.size()); - } - /** Return the number of parameters. */ - int - np() const - { - return static_cast(params.size()); - } - /** Register unique endogenous variable name. The order of - * calls defines the endo outer ordering. The method is - * virtual, since a superclass may want to do some additional - * action. */ - virtual void register_uniq_endo(string name); - /** Register unique exogenous variable name. The order of - * calls defines the exo outer ordering. The method is - * virtual, since a superclass may want to do somem additional - * action. */ - virtual void register_uniq_exo(string name); - /** Register unique parameter name. The order of calls defines - * the param outer ordering. The method is - * virtual, since a superclass may want to do somem additional - * action. */ - virtual void register_uniq_param(string name); - /** Debug print. */ - void print() const override; - private: - /** Add endogenous variable name, which is already in the name - * storage. */ - void register_endo(string name); - /** Add exogenous variable name, which is already in the name - * storage. */ - void register_exo(string name); - /** Add parameter name, which is already in the name - * storage. */ - void register_param(string name); - }; -}; - -#endif diff --git a/dynare++/parser/cc/tree.cc b/dynare++/parser/cc/tree.cc deleted file mode 100644 index 7d05a13e3..000000000 --- a/dynare++/parser/cc/tree.cc +++ /dev/null @@ -1,1011 +0,0 @@ -/* - * Copyright © 2005-2011 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "utils/cc/exception.hh" - -#include "tree.hh" - -#include -#include -#include -#include - -using namespace ogp; - -/** Here we initialize OperationTree to contain only zero, one, nan - * and two_over_pi terms. */ -OperationTree::OperationTree() -{ - last_nulary = -1; - // allocate space for the constants - for (int i = 0; i < num_constants; i++) - add_nulary(); -} - -int -OperationTree::add_nulary() -{ - int op = terms.size(); - terms.push_back({}); - _Tintset s; - s.insert(op); - nul_incidence.push_back(s); - derivatives.push_back({}); - last_nulary = op; - return op; -} - -int -OperationTree::add_unary(code_t code, int op) -{ - if (op == zero - && (code == code_t::UMINUS - || code == code_t::SIN - || code == code_t::TAN - || code == code_t::SQRT - || code == code_t::ERF)) - return zero; - if ((op == zero && code == code_t::LOG) || op == nan) - return nan; - if (op == zero && (code == code_t::EXP - || code == code_t::COS - || code == code_t::ERFC)) - return one; - - Operation unary(code, op); - auto i = opmap.find(unary); - if (i == opmap.end()) - { - int newop = terms.size(); - // add to the terms - terms.push_back(unary); - // copy incidence of the operand - nul_incidence.push_back(nul_incidence[op]); - // insert it to opmap - opmap.emplace(unary, newop); - // add empty map of derivatives - _Tderivmap empty; - derivatives.push_back(empty); - return newop; - } - return i->second; -} - -int -OperationTree::add_binary(code_t code, int op1, int op2) -{ - // quick exits for special values - if (op1 == nan || op2 == nan) - return nan; - // for plus - if (code == code_t::PLUS) - { - if (op1 == zero && op2 == zero) - return zero; - else if (op1 == zero) - return op2; - else if (op2 == zero) - return op1; - } - // for minus - if (code == code_t::MINUS) - { - if (op1 == zero && op2 == zero) - return zero; - else if (op1 == zero) - return add_unary(code_t::UMINUS, op2); - else if (op2 == zero) - return op1; - } - // for times - if (code == code_t::TIMES) - { - if (op1 == zero || op2 == zero) - return zero; - else if (op1 == one) - return op2; - else if (op2 == one) - return op1; - } - // for divide - if (code == code_t::DIVIDE) - { - if (op1 == op2) - return one; - else if (op1 == zero) - return zero; - else if (op2 == zero) - return nan; - } - // for power - if (code == code_t::POWER) - { - if (op1 == zero && op2 == zero) - return nan; - else if (op1 == zero) - return zero; - else if (op2 == zero) - return one; - else if (op1 == one) - return one; - else if (op2 == one) - return op1; - } - - // order operands of commutative operations - if (code == code_t::TIMES || code == code_t::PLUS) - if (op1 > op2) - { - int tmp = op1; - op1 = op2; - op2 = tmp; - } - - // construct operation and check/add it - Operation binary(code, op1, op2); - auto i = opmap.find(binary); - if (i == opmap.end()) - { - int newop = terms.size(); - terms.push_back(binary); - // sum both sets of incidenting nulary operations - nul_incidence.push_back(nul_incidence[op1]); - nul_incidence.back().insert(nul_incidence[op2].begin(), nul_incidence[op2].end()); - // add to opmap - opmap.emplace(binary, newop); - // add empty map of derivatives - _Tderivmap empty; - derivatives.push_back(empty); - return newop; - } - return i->second; -} - -int -OperationTree::add_derivative(int t, int v) -{ - if (t < 0 || t >= static_cast(terms.size())) - throw ogu::Exception(__FILE__, __LINE__, - "Wrong value for tree index in OperationTree::add_derivative"); - - // quick returns for nulary terms or empty incidence - if (terms[t].nary() == 0 && t != v) - return zero; - - if (terms[t].nary() == 0 && t == v) - return one; - - if (nul_incidence[t].end() == nul_incidence[t].find(v)) - return zero; - - // quick return if the derivative has been registered - auto i = derivatives[t].find(v); - if (i != derivatives[t].end()) - return i->second; - - int res = -1; - switch (terms[t].getCode()) - { - case code_t::UMINUS: - { - int tmp = add_derivative(terms[t].getOp1(), v); - res = add_unary(code_t::UMINUS, tmp); - break; - } - case code_t::LOG: - { - int tmp = add_derivative(terms[t].getOp1(), v); - res = add_binary(code_t::DIVIDE, tmp, terms[t].getOp1()); - break; - } - case code_t::EXP: - { - int tmp = add_derivative(terms[t].getOp1(), v); - res = add_binary(code_t::TIMES, t, tmp); - break; - } - case code_t::SIN: - { - int tmp = add_derivative(terms[t].getOp1(), v); - res = add_binary(code_t::TIMES, add_unary(code_t::COS, terms[t].getOp1()), tmp); - break; - } - case code_t::COS: - { - int tmp = add_derivative(terms[t].getOp1(), v); - res = add_unary(code_t::UMINUS, add_binary(code_t::TIMES, add_unary(code_t::SIN, terms[t].getOp1()), tmp)); - break; - } - case code_t::TAN: - { - int tmp = add_derivative(terms[t].getOp1(), v); - int tmp2 = add_unary(code_t::COS, terms[t].getOp1()); - res = add_binary(code_t::DIVIDE, tmp, add_binary(code_t::TIMES, tmp2, tmp2)); - break; - } - case code_t::SQRT: - { - int tmp = add_derivative(terms[t].getOp1(), v); - res = add_binary(code_t::DIVIDE, tmp, - add_binary(code_t::PLUS, t, t)); - break; - } - case code_t::ERF: - { - int tmp = add_binary(code_t::TIMES, terms[t].getOp1(), terms[t].getOp1()); - tmp = add_unary(code_t::UMINUS, tmp); - tmp = add_unary(code_t::EXP, tmp); - int der = add_derivative(terms[t].getOp1(), v); - tmp = add_binary(code_t::TIMES, tmp, der); - res = add_binary(code_t::TIMES, two_over_pi, tmp); - break; - } - case code_t::ERFC: - { - int tmp = add_binary(code_t::TIMES, terms[t].getOp1(), terms[t].getOp1()); - tmp = add_unary(code_t::UMINUS, tmp); - tmp = add_unary(code_t::EXP, tmp); - int der = add_derivative(terms[t].getOp1(), v); - tmp = add_binary(code_t::TIMES, tmp, der); - tmp = add_binary(code_t::TIMES, two_over_pi, tmp); - res = add_unary(code_t::UMINUS, tmp); - break; - } - case code_t::PLUS: - { - int tmp1 = add_derivative(terms[t].getOp1(), v); - int tmp2 = add_derivative(terms[t].getOp2(), v); - res = add_binary(code_t::PLUS, tmp1, tmp2); - break; - } - case code_t::MINUS: - { - int tmp1 = add_derivative(terms[t].getOp1(), v); - int tmp2 = add_derivative(terms[t].getOp2(), v); - res = add_binary(code_t::MINUS, tmp1, tmp2); - break; - } - case code_t::TIMES: - { - int tmp1 = add_derivative(terms[t].getOp1(), v); - int tmp2 = add_derivative(terms[t].getOp2(), v); - int res1 = add_binary(code_t::TIMES, terms[t].getOp1(), tmp2); - int res2 = add_binary(code_t::TIMES, tmp1, terms[t].getOp2()); - res = add_binary(code_t::PLUS, res1, res2); - break; - } - case code_t::DIVIDE: - { - int tmp1 = add_derivative(terms[t].getOp1(), v); - int tmp2 = add_derivative(terms[t].getOp2(), v); - if (tmp2 == zero) - res = add_binary(code_t::DIVIDE, tmp1, terms[t].getOp2()); - else - { - int nom = add_binary(code_t::MINUS, - add_binary(code_t::TIMES, tmp1, terms[t].getOp2()), - add_binary(code_t::TIMES, tmp2, terms[t].getOp1())); - int den = add_binary(code_t::TIMES, terms[t].getOp2(), terms[t].getOp2()); - res = add_binary(code_t::DIVIDE, nom, den); - } - break; - } - case code_t::POWER: - { - int tmp1 = add_derivative(terms[t].getOp1(), v); - int tmp2 = add_derivative(terms[t].getOp2(), v); - int s1 = add_binary(code_t::TIMES, tmp2, - add_binary(code_t::TIMES, t, - add_unary(code_t::LOG, terms[t].getOp1()))); - int s2 = add_binary(code_t::TIMES, tmp1, - add_binary(code_t::TIMES, terms[t].getOp2(), - add_binary(code_t::POWER, terms[t].getOp1(), - add_binary(code_t::MINUS, terms[t].getOp2(), one)))); - res = add_binary(code_t::PLUS, s1, s2); - break; - } - case code_t::NONE: - break; - } - - if (res == -1) - throw ogu::Exception(__FILE__, __LINE__, - "Unknown operation code."); - - register_derivative(t, v, res); - - return res; -} - -int -OperationTree::add_substitution(int t, const map &subst) -{ - return add_substitution(t, subst, *this); -} - -int -OperationTree::add_substitution(int t, const map &subst, - const OperationTree &otree) -{ - // return substitution of t if it is in the map - auto it = subst.find(t); - if (subst.end() != it) - return it->second; - - int nary = otree.terms[t].nary(); - if (nary == 2) - { - // return the binary operation of the substituted terms - int t1 = add_substitution(otree.terms[t].getOp1(), subst, otree); - int t2 = add_substitution(otree.terms[t].getOp2(), subst, otree); - return add_binary(otree.terms[t].getCode(), t1, t2); - } - else if (nary == 1) - { - // return the unary operation of the substituted term - int t1 = add_substitution(otree.terms[t].getOp1(), subst, otree); - return add_unary(otree.terms[t].getCode(), t1); - } - else - { - // if t is not the first num_constants, and otree is not this - // tree, then raise and exception. Otherwise return t, since - // it is either a special term (having the same semantics in - // both trees), or the trees are the same, hence t has the - // same semantics - if (t < num_constants || this == &otree) - return t; - else - { - throw ogu::Exception(__FILE__, __LINE__, - "Incomplete substitution map in OperationTree::add_substitution"); - return -1; - } - } -} - -void -OperationTree::nularify(int t) -{ - // remove the original operation from opmap - auto it = opmap.find(terms[t]); - if (it != opmap.end()) - opmap.erase(it); - // turn the operation to nulary - Operation nulary_op; - terms[t] = nulary_op; - // update last nulary - if (last_nulary < t) - last_nulary = t; - // update nul_incidence information for all terms including t - update_nul_incidence_after_nularify(t); -} - -void -OperationTree::register_derivative(int t, int v, int tder) -{ - // todo: might check that the insert inserts a new pair - derivatives[t].emplace(v, tder); -} - -unordered_set -OperationTree::select_terms(int t, const opselector &sel) const -{ - unordered_set subterms; - select_terms(t, sel, subterms); - return subterms; -} - -void -OperationTree::select_terms(int t, const opselector &sel, unordered_set &subterms) const -{ - const Operation &op = terms[t]; - - if (sel(t)) - subterms.insert(t); - else - if (op.nary() == 2) - { - select_terms(op.getOp1(), sel, subterms); - select_terms(op.getOp2(), sel, subterms); - } - else if (op.nary() == 1) - select_terms(op.getOp1(), sel, subterms); -} - -unordered_set -OperationTree::select_terms_inv(int t, const opselector &sel) const -{ - unordered_set subterms; - select_terms_inv(t, sel, subterms); - return subterms; -} - -bool -OperationTree::select_terms_inv(int t, const opselector &sel, unordered_set &subterms) const -{ - const Operation &op = terms[t]; - - if (op.nary() == 2) - { - bool a1 = select_terms_inv(op.getOp1(), sel, subterms); - bool a2 = select_terms_inv(op.getOp2(), sel, subterms); - if (a1 && a2 && sel(t)) - { - subterms.insert(t); - return true; - } - } - else if (op.nary() == 1) - { - bool a1 = select_terms_inv(op.getOp1(), sel, subterms); - if (a1 && sel(t)) - { - subterms.insert(t); - return true; - } - } - else - { - if (sel(t)) - { - subterms.insert(t); - return true; - } - } - - return false; -} - -void -OperationTree::forget_derivative_maps() -{ - for (auto &derivative : derivatives) - derivative.clear(); -} - -void -OperationTree::print_operation_tree(int t, std::ostream &os, OperationFormatter &f) const -{ - f.format(terms[t], t, os); -} - -void -OperationTree::print_operation(int t) const -{ - DefaultOperationFormatter dof(*this); - print_operation_tree(t, std::cout, dof); -} - -void -OperationTree::update_nul_incidence_after_nularify(int t) -{ - unordered_set updated; - for (int tnode = num_constants; tnode < static_cast(terms.size()); tnode++) - { - const Operation &op = terms[tnode]; - if (op.nary() == 2) - { - int op1 = op.getOp1(); - int op2 = op.getOp2(); - if (op1 >= tnode || op2 >= tnode) - throw ogu::Exception(__FILE__, __LINE__, - "Tree disorder asserted"); - bool updated1 = (updated.end() != updated.find(op1)); - bool updated2 = (updated.end() != updated.find(op2)); - if (updated1 || updated2) - { - nul_incidence[tnode] = nul_incidence[op1]; - nul_incidence[tnode].insert(nul_incidence[op2].begin(), nul_incidence[op2].end()); - updated.insert(tnode); - } - } - else if (op.nary() == 1) - { - int op1 = op.getOp1(); - if (op1 >= tnode) - throw ogu::Exception(__FILE__, __LINE__, - "Tree disorder asserted"); - bool updated1 = (updated.end() != updated.find(op1)); - if (updated1) - { - nul_incidence[tnode] = nul_incidence[op1]; - updated.insert(tnode); - } - } - else if (op.nary() == 0) - { - if (tnode == t) - { - nul_incidence[tnode].clear(); - nul_incidence[tnode].insert(tnode); - updated.insert(tnode); - } - } - } -} - -EvalTree::EvalTree(const OperationTree &ot, int last) - : otree(ot), - values(std::make_unique((last == -1) ? ot.terms.size() : last+1)), - flags(std::make_unique((last == -1) ? ot.terms.size() : last+1)), - last_operation((last == -1) ? ot.terms.size()-1 : last) -{ - if (last_operation < OperationTree::num_constants-1 - || last_operation > static_cast(ot.terms.size())-1) - throw ogu::Exception(__FILE__, __LINE__, - "Wrong last in EvalTree constructor."); - - values[0] = 0.0; - flags[0] = true; - values[1] = 1.0; - flags[1] = true; - values[2] = std::numeric_limits::quiet_NaN(); - flags[2] = true; - values[3] = 2.0/std::sqrt(M_PI); - flags[3] = true; - // this sets from num_constants on - reset_all(); -} - -void -EvalTree::reset_all() -{ - for (int i = OperationTree::num_constants; i <= last_operation; i++) - flags[i] = false; -} - -void -EvalTree::set_nulary(int t, double val) -{ - if (t < 0 || t > last_operation) - throw ogu::Exception(__FILE__, __LINE__, - "The tree index out of bounds in EvalTree::set_nulary"); - if (t < OperationTree::num_constants || otree.terms[t].nary() != 0) - throw ogu::Exception(__FILE__, __LINE__, - "The term is not nulary assignable in EvalTree::set_nulary"); - - values[t] = val; - flags[t] = true; -} - -double -EvalTree::eval(int t) -{ - if (t < 0 || t > last_operation) - throw ogu::Exception(__FILE__, __LINE__, - "The tree index out of bounds in EvalTree::eval"); - if (otree.terms[t].nary() == 0 && flags[t] == false) - throw ogu::Exception(__FILE__, __LINE__, - "Nulary term has not been assigned a value in EvalTree::eval"); - - if (!flags[t]) - { - const Operation &op = otree.terms[t]; - if (op.nary() == 1) - { - double r1 = eval(op.getOp1()); - double res; - if (op.getCode() == code_t::UMINUS) - res = -r1; - else if (op.getCode() == code_t::LOG) - res = log(r1); - else if (op.getCode() == code_t::EXP) - res = exp(r1); - else if (op.getCode() == code_t::SIN) - res = sin(r1); - else if (op.getCode() == code_t::COS) - res = cos(r1); - else if (op.getCode() == code_t::TAN) - res = tan(r1); - else if (op.getCode() == code_t::SQRT) - res = sqrt(r1); - else if (op.getCode() == code_t::ERF) - res = erf(r1); - else if (op.getCode() == code_t::ERFC) - res = erfc(r1); - else - { - throw ogu::Exception(__FILE__, __LINE__, - "Unknown unary operation code in EvalTree::eval"); - res = 0.0; - } - values[t] = res; - flags[t] = true; - } - else if (op.nary() == 2) - { - double res; - if (op.getCode() == code_t::PLUS) - { - double r1 = eval(op.getOp1()); - double r2 = eval(op.getOp2()); - res = r1 + r2; - } - else if (op.getCode() == code_t::MINUS) - { - double r1 = eval(op.getOp1()); - double r2 = eval(op.getOp2()); - res = r1 - r2; - } - else if (op.getCode() == code_t::TIMES) - { - // pickup less complex formula first - unsigned int nul1 = otree.nulary_of_term(op.getOp1()).size(); - unsigned int nul2 = otree.nulary_of_term(op.getOp2()).size(); - if (nul1 < nul2) - { - double r1 = eval(op.getOp1()); - if (r1 == 0.0) - res = 0.0; - else - { - double r2 = eval(op.getOp2()); - res = r1 * r2; - } - } - else - { - double r2 = eval(op.getOp2()); - if (r2 == 0) - res = 0.0; - else - { - double r1 = eval(op.getOp1()); - res = r1*r2; - } - } - } - else if (op.getCode() == code_t::DIVIDE) - { - double r1 = eval(op.getOp1()); - if (r1 == 0) - res = 0.0; - else - { - double r2 = eval(op.getOp2()); - res = r1 / r2; - } - } - else if (op.getCode() == code_t::POWER) - { - // suppose that more complex is the first op in average - double r2 = eval(op.getOp2()); - if (r2 == 0.0) - res = 1.0; - else - { - double r1 = eval(op.getOp1()); - res = pow(r1, r2); - } - } - else - { - throw ogu::Exception(__FILE__, __LINE__, - "Unknown binary operation code in EvalTree::eval"); - res = 0.0; - } - values[t] = res; - flags[t] = true; - } - return values[t]; - } - - return values[t]; -} - -void -EvalTree::print() const -{ - std::cout << "last_op=" << last_operation << '\n' - << " 0 1 2 3 4 5 6 7 8 9\n" - << "────────────────────────────────────────────────────────────────\n"; - for (int i = 0; i <= (last_operation+1)/10; i++) - { - std::cout << std::setw(3) << i << "│"; - int j = 0; - while (j < 10 && 10*i+j < last_operation+1) - { - int k = 10*i+j; - if (flags[k]) - std::cout << " " << std::setw(5) << std::setprecision(1) << values[k]; - else - std::cout << " ─────"; - j++; - } - std::cout << "\n"; - } -} - -void -DefaultOperationFormatter::format(const Operation &op, int t, std::ostream &os) -{ - // add to the stop_set - if (stop_set.end() == stop_set.find(t)) - stop_set.insert(t); - else - return; - - // call recursively non-nulary terms of the operation - if (op.nary() == 2) - { - int t1 = op.getOp1(); - const Operation &op1 = otree.terms[t1]; - int t2 = op.getOp2(); - const Operation &op2 = otree.terms[t2]; - if (op1.nary() > 0) - format(op1, t1, os); - if (op2.nary() > 0) - format(op2, t2, os); - } - if (op.nary() == 1) - { - int t1 = op.getOp1(); - const Operation &op1 = otree.terms[t1]; - if (op1.nary() > 0) - format(op1, t1, os); - } - - // print 'term =' - format_term(t, os); - os << " = "; - if (op.nary() == 0) - format_nulary(t, os); - else if (op.nary() == 1) - { - int t1 = op.getOp1(); - const Operation &op1 = otree.terms[t1]; - std::string opname = "unknown"; - switch (op.getCode()) - { - case code_t::UMINUS: - opname = "-"; - break; - case code_t::LOG: - opname = "log"; - break; - case code_t::EXP: - opname = "exp"; - break; - case code_t::SIN: - opname = "sin"; - break; - case code_t::COS: - opname = "cos"; - break; - case code_t::TAN: - opname = "tan"; - break; - case code_t::SQRT: - opname = "sqrt"; - break; - case code_t::ERF: - opname = "erf"; - break; - case code_t::ERFC: - opname = "erfc"; - break; - default: - break; - } - os << opname << '('; - if (op1.nary() == 0) - format_nulary(t1, os); - else - format_term(t1, os); - os << ")"; - } - else - { - int t1 = op.getOp1(); - const Operation &op1 = otree.terms[t1]; - int t2 = op.getOp2(); - const Operation &op2 = otree.terms[t2]; - std::string opname = "unknown"; - switch (op.getCode()) - { - case code_t::PLUS: - opname = "+"; - break; - case code_t::MINUS: - opname = "-"; - break; - case code_t::TIMES: - opname = "*"; - break; - case code_t::DIVIDE: - opname = "/"; - break; - case code_t::POWER: - opname = "^"; - break; - default: - break; - } - if (op1.nary() == 0) - format_nulary(t1, os); - else - format_term(t1, os); - os << ' ' << opname << ' '; - if (op2.nary() == 0) - format_nulary(t2, os); - else - format_term(t2, os); - } - - print_delim(os); -} - -void -DefaultOperationFormatter::format_term(int t, std::ostream &os) const -{ - os << '$' << t; -} - -void -DefaultOperationFormatter::format_nulary(int t, std::ostream &os) const -{ - if (t == OperationTree::zero) - os << '0'; - else if (t == OperationTree::one) - os << '1'; - else if (t == OperationTree::nan) - os << "NaN"; - else - os << '$' << t; -} - -void -DefaultOperationFormatter::print_delim(std::ostream &os) const -{ - os << ";\n"; -} - -std::string -OperationStringConvertor::convert(const Operation &op, int t) const -{ - if (op.nary() == 0) - { - if (t < OperationTree::num_constants) - if (t == OperationTree::zero) - return "0"; - else if (t == OperationTree::one) - return "1"; - else if (t == OperationTree::nan) - return "NaN"; - else if (t == OperationTree::two_over_pi) - { - std::ostringstream buf; - buf << std::setprecision(std::numeric_limits::max_digits10) - << 2.0/std::sqrt(M_PI); - return buf.str(); - } - else - return "error!error"; - else - return nulsc.convert(t); - } - else if (op.nary() == 1) - { - int t1 = op.getOp1(); - const Operation &op1 = otree.operation(t1); - std::string opname = "unknown"; - switch (op.getCode()) - { - case code_t::UMINUS: - opname = "-"; - break; - case code_t::LOG: - opname = "log"; - break; - case code_t::EXP: - opname = "exp"; - break; - case code_t::SIN: - opname = "sin"; - break; - case code_t::COS: - opname = "cos"; - break; - case code_t::TAN: - opname = "tan"; - break; - case code_t::SQRT: - opname = "sqrt"; - break; - case code_t::ERF: - opname = "erf"; - break; - case code_t::ERFC: - opname = "erfc"; - break; - default: - break; - } - std::string s1 = convert(op1, t1); - return opname + "(" + s1 + ")"; - } - else - { - int t1 = op.getOp1(); - const Operation &op1 = otree.operation(t1); - int t2 = op.getOp2(); - const Operation &op2 = otree.operation(t2); - std::string opname = "unknown"; - switch (op.getCode()) - { - case code_t::PLUS: - opname = "+"; - break; - case code_t::MINUS: - opname = "-"; - break; - case code_t::TIMES: - opname = "*"; - break; - case code_t::DIVIDE: - opname = "/"; - break; - case code_t::POWER: - opname = "^"; - break; - default: - break; - } - // decide about parenthesis - bool op1_par = true; - bool op2_par = true; - if (op.getCode() == code_t::PLUS) - { - op1_par = false; - op2_par = false; - } - else if (op.getCode() == code_t::MINUS) - { - op1_par = false; - if (op2.getCode() != code_t::MINUS && op2.getCode() != code_t::PLUS) - op2_par = false; - } - else - { - if (op1.nary() < 2) - op1_par = false; - if (op2.nary() < 2) - op2_par = false; - } - - std::string res; - if (op1_par) - res += "("; - res += convert(op1, t1); - if (op1_par) - res += ")"; - res += " "; - res += opname; - res += " "; - if (op2_par) - res += "("; - res += convert(op2, t2); - if (op2_par) - res += ")"; - - return res; - } -} diff --git a/dynare++/parser/cc/tree.hh b/dynare++/parser/cc/tree.hh deleted file mode 100644 index 88474b369..000000000 --- a/dynare++/parser/cc/tree.hh +++ /dev/null @@ -1,502 +0,0 @@ -/* - * Copyright © 2005-2011 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef OGP_TREE_H -#define OGP_TREE_H - -#include -#include -#include -#include -#include -#include -#include - -namespace ogp -{ - using std::unordered_set; - using std::unordered_map; - using std::vector; - using std::set; - using std::map; - - /** Enumerator representing nulary, unary and binary operation - * codes. For nulary, 'none' is used. When one is adding a new - * codes, he should update the code of #OperationTree::add_unary, - * #OperationTree::add_binary, and of course - * #OperationTree::add_derivative. */ - enum class code_t { NONE, UMINUS, LOG, EXP, SIN, COS, TAN, SQRT, ERF, - ERFC, PLUS, MINUS, TIMES, DIVIDE, POWER }; - - /** Class representing a nulary, unary, or binary operation. */ - class Operation - { - protected: - /** Code of the operation. */ - code_t code{code_t::NONE}; - /** First operand. If none, then it is -1. */ - int op1{-1}; - /** Second operand. If none, then it is -1. */ - int op2{-1}; - - public: - /** Constructs a binary operation. */ - Operation(code_t cd, int oper1, int oper2) - : code(cd), op1(oper1), op2(oper2) - { - } - /** Constructs a unary operation. */ - Operation(code_t cd, int oper1) - : code(cd), op1(oper1) - { - } - /** Constructs a nulary operation. */ - Operation() = default; - /** A copy constructor. */ - Operation(const Operation &op) = default; - - /** Operator =. */ - Operation &operator=(const Operation &op) = default; - /** Operator ==. */ - bool - operator==(const Operation &op) const - { - return code == op.code && op1 == op.op1 && op2 == op.op2; - } - /** Operator < implementing lexicographic ordering. */ - bool - operator<(const Operation &op) const - { - return (code < op.code - || (code == op.code - && (op1 < op.op1 || (op1 == op.op1 && op2 < op.op2)))); - } - /** Returns a number of operands. */ - int - nary() const - { - return (op2 == -1) ? ((op1 == -1) ? 0 : 1) : 2; - } - /** Returns a hash value of the operation. */ - size_t - hashval() const - { - return (op2+1 + op1+1)^(15 + static_cast(code))^30; - } - - code_t - getCode() const - { - return code; - } - int - getOp1() const - { - return op1; - } - int - getOp2() const - { - return op2; - } - }; - - /** This struct is a predicate for ordering of the operations in - * OperationTree class. now obsolete */ - struct ltoper - { - bool - operator()(const Operation &oper1, const Operation &oper2) const - { - return oper1 < oper2; - } - }; - - /** Hash function object for Operation. */ - struct ophash - { - size_t - operator()(const Operation &op) const - { - return op.hashval(); - } - }; - - /** This struct is a function object selecting some - * operations. The operation is given by a tree index. */ - struct opselector - { - virtual bool operator()(int t) const = 0; - virtual ~opselector() = default; - }; - - /** Forward declaration of OperationFormatter. */ - class OperationFormatter; - class DefaultOperationFormatter; - - /** Forward declaration of EvalTree to make it friend of OperationTree. */ - class EvalTree; - - /** Class representing a set of trees for terms. Each term is - * given a unique non-negative integer. The terms are basically - * operations whose (integer) operands point to another terms in - * the tree. The terms are stored in the vector. Equivalent unary - * and binary terms are stored only once. This class guarantees - * the uniqueness. The uniqueness of nulary terms is guaranteed by - * the caller, since at this level of Operation abstraction, one - * cannot discriminate between different nulary operations - * (constants, variables). The uniqueness is enforced by the - * unordered_map whose keys are operations and values are integers - * (indices of the terms). - - * This class can also make derivatives of a given term with - * respect to a given nulary term. I order to be able to quickly - * recognize zero derivativates, we maintain a list of nulary - * terms contained in the term. A possible zero derivative is then quickly - * recognized by looking at the list. The list is implemented as a - * unordered_set of integers. - * - * In addition, many term can be differentiated multiple times wrt - * one variable since they can be referenced multiple times. To - * avoid this, for each term we maintain a map mapping variables - * to the derivatives of the term. As the caller will - * differentiate wrt more and more variables, these maps will - * become richer and richer. - */ - class OperationTree - { - friend class EvalTree; - friend class DefaultOperationFormatter; - protected: - /** This is the vector of the terms. An index to this vector - * uniquelly determines the term. */ - vector terms; - - /** This defines a type for a map mapping the unary and binary - * operations to their indices. */ - using _Topmap = unordered_map; - - /** This is the map mapping the unary and binary operations to - * the indices of the terms.*/ - _Topmap opmap; - - /** This is a type for a set of integers. */ - using _Tintset = unordered_set; - /** This is a vector of integer sets corresponding to the - * nulary terms contained in the term. */ - vector<_Tintset> nul_incidence; - - /** This is a type of the map from variables (nulary terms) to - * the terms. */ - using _Tderivmap = unordered_map; - /** This is a vector of derivative mappings. For each term, it - * maps variables to the derivatives of the term with respect - * to the variables. */ - vector<_Tderivmap> derivatives; - - /** The tree index of the last nulary term. */ - int last_nulary; - public: - /** Enumeration for special terms. We need zero, one, nan and - * 2/pi. These will be always first four terms having indices - * zero, one and two, three. If adding anything to this - * enumeration, make sure ‘num_constants’ remains the last one.*/ - enum { zero, one, nan, two_over_pi, num_constants }; - - /** The unique constructor which initializes the object to - * contain only zero, one and nan and two_over_pi.*/ - OperationTree(); - - /** Copy constructor. */ - OperationTree(const OperationTree &ot) = default; - - /** Add a nulary operation. The caller is responsible for not - * inserting two semantically equivalent nulary operations. - * @return newly allocated index - */ - int add_nulary(); - - /** Add a unary operation. The uniqness is checked, if it - * already exists, then it is not added. - * @param code the code of the unary operation - * @param op the index of the operand - * @return the index of the operation - */ - int add_unary(code_t code, int op); - - /** Add a binary operation. The uniqueness is checked, if it - * already exists, then it is not added. - * @param code the code of the binary operation - * @param op1 the index of the first operand - * @param op2 the index of the second operand - * @return the index of the operation - */ - int add_binary(code_t code, int op1, int op2); - - /** Add the derivative of the given term with respect to the - * given nulary operation. - * @param t the index of the operation being differentiated - * @param v the index of the nulary operation - * @return the index of the derivative - */ - int add_derivative(int t, int v); - - /** Add the substitution given by the map. This adds a new - * term which is equal to the given term with applied - * substitutions given by the map replacing each term on the - * left by a term on the right. We do not check that the terms - * on the left are not subterms of the terms on the right. If - * so, the substituted terms are not subject of further - * substitution. */ - int add_substitution(int t, const map &subst); - - /** Add the substitution given by the map where left sides of - * substitutions come from another tree. The right sides are - * from this tree. The given t is from the given otree. */ - int add_substitution(int t, const map &subst, - const OperationTree &otree); - - /** This method turns the given term to a nulary - * operation. This is an only method, which changes already - * existing term (all other methods add something new). User - * should use this with caution and must make sure that - * something similar has happened for atoms. In addition, it - * does not do anything with derivatives, so it should not be - * used after some derivatives were created, and derivatives - * already created and saved in derivatives mappings should be - * forgotten with forget_derivative_maps. */ - void nularify(int t); - - /** Return the set of nulary terms of the given term. */ - const unordered_set & - nulary_of_term(int t) const - { - return nul_incidence[t]; - } - - /** Select subterms of the given term according a given - * operation selector and return the set of terms that - * correspond to the compounded operations. The given term is - * a compound function of the returned subterms and the - * function consists only from operations which yield false in - * the selector. */ - unordered_set select_terms(int t, const opselector &sel) const; - - /** Select subterms of the given term according a given - * operation selector and return the set of terms that - * correspond to the compounded operations. The given term is - * a compound function of the returned subterms and the - * subterms are maximal subterms consisting from operations - * yielding true in the selector. */ - unordered_set select_terms_inv(int t, const opselector &sel) const; - - /** This forgets all the derivative mappings. It is used after - * a term has been nularified, and then the derivative - * mappings carry wrong information. Note that the derivatives - * mappings serve only as a tool for quick returns in - * add_derivative. Resseting the mappings is harmless, all the - * information is rebuilt in add_derivative without any - * additional nodes (trees). */ - void forget_derivative_maps(); - - /** This returns an operation of a given term. */ - const Operation & - operation(int t) const - { - return terms[t]; - } - - /** This outputs the operation to the given file descriptor - * using the given OperationFormatter. */ - void print_operation_tree(int t, std::ostream &os, OperationFormatter &f) const; - - /** Debug print of a given operation: */ - void print_operation(int t) const; - - /** Return the last tree index of a nulary term. */ - int - get_last_nulary() const - { - return last_nulary; - } - - /** Get the number of all operations. */ - int - get_num_op() const - { - return static_cast(terms.size()); - } - private: - /** This registers a calculated derivative of the term in the - * #derivatives vector. - * @param t the index of the term for which we register the derivative - * @param v the index of the nulary term (variable) to which - * respect the derivative was taken - * @param tder the index of the resulting derivative - */ - void register_derivative(int t, int v, int tder); - /** This does the same job as select_terms with the only - * difference, that it adds the terms to the given set and - * hence can be used recursivelly. */ - void select_terms(int t, const opselector &sel, unordered_set &subterms) const; - /** This does the same job as select_terms_inv with the only - * difference, that it adds the terms to the given set and - * hence can be used recursivelly and returns true if the term - * was selected. */ - bool select_terms_inv(int t, const opselector &sel, unordered_set &subterms) const; - /** This updates nul_incidence information after the term t - * was turned to a nulary term in all terms. It goes through - * the tree from simplest terms to teh more complex ones and - * changes the nul_incidence information where necesary. It - * maintains a set where the changes have been made.*/ - void update_nul_incidence_after_nularify(int t); - }; - - /** EvalTree class allows for an evaluation of the given tree for - * a given values of nulary terms. For each term in the - * OperationTree the class maintains a resulting value and a flag - * if the value has been calculated or set. The life cycle of the - * class is the following: After it is initialized, the user must - * set values for necessary nulary terms. Then the object can be - * requested to evaluate particular terms. During this process, - * the number of evaluated terms is increasing. Then the user can - * request overall reset of evaluation flags, set the nulary terms - * to new values and evaluate a number of terms. - * - * Note that currently the user cannot request a reset of - * evaluation flags only for those terms depending on a given - * nulary term. This might be added in future and handeled by a - * subclasses of OperationTree and EvalTree, since we need a - * support for this in OperationTree. - */ - class EvalTree - { - protected: - /** Reference to the OperationTree over which all evaluations - * are done. */ - const OperationTree &otree; - /** The array of values. */ - const std::unique_ptr values; - /** The array of evaluation flags. */ - const std::unique_ptr flags; - /** The index of last operation in the EvalTree. Length of - * values and flags will be then last_operation+1. */ - int last_operation; - public: - /** Initializes the evaluation tree for the given operation - * tree. If last is greater than -1, that the evaluation tree - * will contain only formulas up to the given last index - * (included). */ - EvalTree(const OperationTree &otree, int last = -1); - EvalTree(const EvalTree &) = delete; - virtual ~EvalTree() = default; - /** Set evaluation flag to all terms (besides the first - * special terms) to false. */ - void reset_all(); - /** Set value for a given nulary term. */ - void set_nulary(int t, double val); - /** Evaluate the given term with nulary terms set so far. */ - double eval(int t); - /** Debug print. */ - void print() const; - /* Return the operation tree. */ - const OperationTree & - getOperationTree() const - { - return otree; - } - }; - - /** This is an interface describing how a given operation is - * formatted for output. */ - class OperationFormatter - { - public: - /** Empty virtual destructor. */ - virtual ~OperationFormatter() = default; - /** Print the formatted operation op with a given tree index t - * to a given descriptor. (See class OperationTree to know - * what is a tree index.) This prints all the tree. This - * always writes equation, left hand side is a string - * represenation (a variable, temporary, whatever) of the - * term, the right hand side is a string representation of the - * operation (which will refer to other string representation - * of subterms). */ - virtual void format(const Operation &op, int t, std::ostream &os) = 0; - }; - - /** The default formatter formats the formulas with a usual syntax - * (for example Matlab). A formatting of atoms and terms might be - * reimplemented by a subclass. In addition, during its life, the - * object maintains a set of tree indices which have been output - * and they are not output any more. */ - class DefaultOperationFormatter : public OperationFormatter - { - protected: - const OperationTree &otree; - set stop_set; - public: - DefaultOperationFormatter(const OperationTree &ot) - : otree(ot) - { - } - /** Format the operation with the default syntax. */ - void format(const Operation &op, int t, std::ostream &os) override; - /** This prints a string represenation of the given term, for - * example 'tmp10' for term 10. In this implementation it - * prints $10. */ - virtual void format_term(int t, std::ostream &os) const; - /** Print a string representation of the nulary term. */ - virtual void format_nulary(int t, std::ostream &os) const; - /** Print a delimiter between two statements. By default it is - * "\n". */ - virtual void print_delim(std::ostream &os) const; - }; - - class NularyStringConvertor - { - public: - virtual ~NularyStringConvertor() = default; - /** Return the string representation of the atom with the tree - * index t. */ - virtual std::string convert(int t) const = 0; - }; - - /** This class converts the given term to its mathematical string representation. */ - class OperationStringConvertor - { - protected: - const NularyStringConvertor &nulsc; - const OperationTree &otree; - public: - OperationStringConvertor(const NularyStringConvertor &nsc, const OperationTree &ot) - : nulsc(nsc), otree(ot) - { - } - /** Empty virtual destructor. */ - virtual ~OperationStringConvertor() = default; - /** Convert the operation to the string mathematical - * representation. This does not write any equation, just - * returns a string representation of the formula. */ - std::string convert(const Operation &op, int t) const; - }; -}; - -#endif diff --git a/dynare++/src/Makefile.am b/dynare++/src/Makefile.am deleted file mode 100644 index 85abffa34..000000000 --- a/dynare++/src/Makefile.am +++ /dev/null @@ -1,39 +0,0 @@ -bin_PROGRAMS = dynare++ - -GENERATED_FILES = dynglob_ll.cc dynglob_tab.cc dynglob_tab.hh - -dynare___SOURCES = \ - main.cc \ - dynare3.cc \ - dynare_atoms.hh \ - dynare_model.hh \ - forw_subst_builder.hh \ - planner_builder.cc \ - dynare3.hh \ - dynare_exception.hh \ - dynare_params.cc \ - planner_builder.hh \ - dynare_atoms.cc \ - dynare_model.cc \ - dynare_params.hh \ - forw_subst_builder.cc \ - nlsolve.cc \ - nlsolve.hh \ - $(GENERATED_FILES) - -dynare___CPPFLAGS = -I../sylv/cc -I../tl/cc -I../kord -I../integ/cc -I../utils/cc -I.. -I$(top_srcdir)/mex/sources $(BOOST_CPPFLAGS) $(CPPFLAGS_MATIO) -dynare___LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_MATIO) $(BOOST_LDFLAGS) -dynare___LDADD = ../kord/libkord.a ../integ/cc/libinteg.a ../tl/cc/libtl.a ../parser/cc/libparser.a ../utils/cc/libutils.a ../sylv/cc/libsylv.a $(LIBADD_MATIO) $(noinst_LIBRARIES) $(LAPACK_LIBS) $(BLAS_LIBS) $(LIBS) $(FLIBS) - -BUILT_SOURCES = $(GENERATED_FILES) -EXTRA_DIST = dynglob.ll dynglob.yy - -dynglob_tab.cc dynglob_tab.hh: dynglob.yy - $(YACC) -W -odynglob_tab.cc dynglob.yy - -dynare__-dynglob_tab.$(OBJEXT): CXXFLAGS += -Wno-old-style-cast - -dynglob_ll.cc: dynglob.ll - $(LEX) -i -odynglob_ll.cc dynglob.ll - -dynare__-dynglob_ll.$(OBJEXT): CXXFLAGS += -Wno-old-style-cast diff --git a/dynare++/src/dynare3.cc b/dynare++/src/dynare3.cc deleted file mode 100644 index 746cf21ff..000000000 --- a/dynare++/src/dynare3.cc +++ /dev/null @@ -1,383 +0,0 @@ -/* - * Copyright © 2004-2011 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include -#include - -#include "dynare3.hh" -#include "dynare_exception.hh" -#include "planner_builder.hh" -#include "forw_subst_builder.hh" - -#include "utils/cc/exception.hh" -#include "parser/cc/parser_exception.hh" -#include "parser/cc/atom_substitutions.hh" -#include "../tl/cc/tl_exception.hh" -#include "../kord/kord_exception.hh" - -/**************************************************************************************/ -/* DynareNameList class */ -/**************************************************************************************/ -std::vector -DynareNameList::selectIndices(const std::vector &ns) const -{ - std::vector res; - for (const auto &n : ns) - { - int j = 0; - while (j < getNum() && n != getName(j)) - j++; - if (j == getNum()) - throw DynareException(__FILE__, __LINE__, - "Couldn't find name for " + n - +" in DynareNameList::selectIndices"); - res.push_back(j); - } - return res; -} - -/**************************************************************************************/ -/* Dynare class */ -/**************************************************************************************/ - -Dynare::Dynare(const std::string &modname, int ord, double sstol, Journal &jr) - : journal(jr), md(1), ss_tol(sstol) -{ - std::ifstream f{modname}; - if (f.fail()) - throw DynareException(__FILE__, __LINE__, "Could not open model file "+modname); - - std::ostringstream buffer; - buffer << f.rdbuf(); - std::string contents{buffer.str()}; - - try - { - model = std::make_unique(contents, ord); - } - catch (const ogp::ParserException &pe) - { - // Compute line and column, given the offset in the file - int line = 1; - int col = 0; - size_t i = 0; - while (i < contents.length() && i < static_cast(pe.offset())) - { - if (contents[i] == '\n') - { - line++; - col = 0; - } - i++; - col++; - } - throw DynareException(pe.message(), modname, line, col); - } - ysteady = std::make_unique(model->getAtoms().ny()); - dnl = std::make_unique(*this); - denl = std::make_unique(*this); - dsnl = std::make_unique(*this, *dnl, *denl); - fe = std::make_unique(model->getParser()); - fde = std::make_unique(model->getParser()); - writeModelInfo(journal); -} - -Dynare::Dynare(const std::vector &endo, - const std::vector &exo, - const std::vector &par, - const std::string &equations, int ord, - double sstol, Journal &jr) - : journal(jr), md(1), ss_tol(sstol) -{ - try - { - model = std::make_unique(endo, exo, par, equations, ord); - } - catch (const ogp::ParserException &pe) - { - throw DynareException(pe.message(), pe.offset()); - } - ysteady = std::make_unique(model->getAtoms().ny()); - dnl = std::make_unique(*this); - denl = std::make_unique(*this); - dsnl = std::make_unique(*this, *dnl, *denl); - fe = std::make_unique(model->getParser()); - fde = std::make_unique(model->getParser()); - writeModelInfo(journal); -} - -Dynare::Dynare(const Dynare &dynare) - : journal(dynare.journal), md(dynare.md), ss_tol(dynare.ss_tol) -{ - model = dynare.model->clone(); - ysteady = std::make_unique(*(dynare.ysteady)); - dnl = std::make_unique(*this); - denl = std::make_unique(*this); - dsnl = std::make_unique(*this, *dnl, *denl); - fe = std::make_unique(model->getParser()); - fde = std::make_unique(model->getParser()); -} - -void -Dynare::writeMat(mat_t *fd, const std::string &prefix) const -{ - getAllEndoNames().writeMat(fd, prefix + "_vars"); - getAllEndoNames().writeMatIndices(fd, prefix); - getStateNames().writeMat(fd, prefix + "_state_vars"); - getExogNames().writeMat(fd, prefix + "_shocks"); - getExogNames().writeMatIndices(fd, prefix); - model->getVcov().writeMat(fd, prefix + "_vcov_exo"); - TwoDMatrix aux(1, 1); - aux.get(0, 0) = nstat(); - aux.writeMat(fd, prefix + "_nstat"); - aux.get(0, 0) = npred(); - aux.writeMat(fd, prefix + "_npred"); - aux.get(0, 0) = nboth(); - aux.writeMat(fd, prefix + "_nboth"); - aux.get(0, 0) = nforw(); - aux.writeMat(fd, prefix + "_nforw"); -} - -void -Dynare::writeDump(const std::string &basename) const -{ - std::string fname(basename + ".dump"); - std::ofstream out(fname); - model->dump_model(out); - out.close(); -} - -void -Dynare::solveDeterministicSteady(Vector &steady) -{ - JournalRecordPair pa(journal); - pa << "Non-linear solver for deterministic steady state" << endrec; - steady = const_cast(model->getInit()); - DynareVectorFunction dvf(*this); - DynareJacobian dj(*this); - ogu::NLSolver nls(dvf, dj, 500, ss_tol, journal); - int iter; - if (!nls.solve(steady, iter)) - throw DynareException(__FILE__, __LINE__, - "Could not obtain convergence in non-linear solver"); -} - -// Evaluate system at given yₜ=yₜ₊₁=yₜ₋₁, and given shocks xₜ -void -Dynare::evaluateSystem(Vector &out, const ConstVector &yy, const Vector &xx) -{ - ConstVector yym(yy, nstat(), nys()); - ConstVector yyp(yy, nstat()+npred(), nyss()); - evaluateSystem(out, yym, yy, yyp, xx); -} - -/* Evaluate system at given y*ₜ₋₁, yₜ, y**ₜ₊₁ and at exogenous xₜ, all three - vectors yym, yy, and yyp have the respective lengths of y*ₜ₋₁, yₜ, y**ₜ₊₁ */ -void -Dynare::evaluateSystem(Vector &out, const ConstVector &yym, const ConstVector &yy, - const ConstVector &yyp, const Vector &xx) -{ - ogdyn::DynareAtomValues dav(model->getAtoms(), model->getParams(), yym, yy, yyp, xx); - DynareEvalLoader del(model->getAtoms(), out); - fe->eval(dav, del); -} - -void -Dynare::calcDerivatives(const Vector &yy, const Vector &xx) -{ - ConstVector yym(yy, nstat(), nys()); - ConstVector yyp(yy, nstat()+npred(), nyss()); - ogdyn::DynareAtomValues dav(model->getAtoms(), model->getParams(), yym, yy, yyp, xx); - DynareDerEvalLoader ddel(model->getAtoms(), md, model->getOrder()); - for (int iord = 1; iord <= model->getOrder(); iord++) - fde->eval(dav, ddel, iord); -} - -void -Dynare::calcDerivativesAtSteady() -{ - Vector xx(nexog()); - xx.zeros(); - calcDerivatives(*ysteady, xx); -} - -void -Dynare::writeModelInfo(Journal &jr) const -{ - // write info on variables - { - JournalRecordPair rp(journal); - rp << "Information on variables" << endrec; - JournalRecord rec1(journal); - rec1 << "Number of endogenous: " << ny() << endrec; - JournalRecord rec2(journal); - rec2 << "Number of exogenous: " << nexog() << endrec; - JournalRecord rec3(journal); - rec3 << "Number of static: " << nstat() << endrec; - JournalRecord rec4(journal); - rec4 << "Number of predetermined: " << npred()+nboth() << endrec; - JournalRecord rec5(journal); - rec5 << "Number of forward looking: " << nforw()+nboth() << endrec; - JournalRecord rec6(journal); - rec6 << "Number of both: " << nboth() << endrec; - } - - // write info on planner variables - const ogdyn::PlannerInfo *pinfo = model->get_planner_info(); - if (pinfo) - { - JournalRecordPair rp(journal); - rp << "Information on planner variables" << endrec; - JournalRecord rec1(journal); - rec1 << "Number of Lagrange multipliers: " << pinfo->num_lagrange_mults << endrec; - JournalRecord rec2(journal); - rec2 << "Number of auxiliary variables: " << pinfo->num_aux_variables << endrec; - JournalRecord rec3(journal); - rec3 << "Number of new terms in the tree: " << pinfo->num_new_terms << endrec; - } - - // write info on forward substitutions - const ogdyn::ForwSubstInfo *finfo = model->get_forw_subst_info(); - if (finfo) - { - JournalRecordPair rp(journal); - rp << "Information on forward substitutions" << endrec; - JournalRecord rec1(journal); - rec1 << "Number of affected equations: " << finfo->num_affected_equations << endrec; - JournalRecord rec2(journal); - rec2 << "Number of substituted terms: " << finfo->num_subst_terms << endrec; - JournalRecord rec3(journal); - rec3 << "Number of auxiliary variables: " << finfo->num_aux_variables << endrec; - JournalRecord rec4(journal); - rec4 << "Number of new terms in the tree: " << finfo->num_new_terms << endrec; - } - - // write info on substitutions - const ogp::SubstInfo *sinfo = model->get_subst_info(); - if (sinfo) - { - JournalRecordPair rp(journal); - rp << "Information on substitutions" << endrec; - JournalRecord rec1(journal); - rec1 << "Number of substitutions: " << sinfo->num_substs << endrec; - } -} - -DynareNameList::DynareNameList(const Dynare &dynare) -{ - for (int i = 0; i < dynare.ny(); i++) - { - int j = dynare.model->getAtoms().y2outer_endo()[i]; - const std::string &name = dynare.model->getAtoms().get_endovars()[j]; - names.push_back(name); - } -} - -DynareStateNameList::DynareStateNameList(const Dynare &dynare, const DynareNameList &dnl, - const DynareExogNameList &denl) -{ - for (int i = 0; i < dynare.nys(); i++) - names.push_back(dnl.getName(i+dynare.nstat())); - for (int i = 0; i < dynare.nexog(); i++) - names.push_back(denl.getName(i)); -} - -DynareExogNameList::DynareExogNameList(const Dynare &dynare) -{ - for (int i = 0; i < dynare.nexog(); i++) - { - int j = dynare.model->getAtoms().y2outer_exo()[i]; - const std::string &name = dynare.model->getAtoms().get_exovars()[j]; - names.push_back(name); - } -} - -DynareEvalLoader::DynareEvalLoader(const ogp::FineAtoms &a, Vector &out) - : Vector(out) -{ - if (a.ny() != out.length()) - throw DynareException(__FILE__, __LINE__, "Wrong length of out vector in DynareEvalLoader constructor"); -} - -/* This clears the container of model derivatives and initializes it inserting - empty sparse tensors up to the given order. */ -DynareDerEvalLoader::DynareDerEvalLoader(const ogp::FineAtoms &a, - TensorContainer &mod_ders, - int order) - : atoms(a), md(mod_ders) -{ - md.clear(); - for (int iord = 1; iord <= order; iord++) - { - auto t = std::make_unique(iord, atoms.ny()+atoms.nys()+atoms.nyss()+atoms.nexo(), atoms.ny()); - md.insert(std::move(t)); - } -} - -void -DynareDerEvalLoader::load(int i, int iord, const int *vars, double res) -{ - FSSparseTensor &t = md.get(Symmetry{iord}); - IntSequence s(iord, 0); - for (int j = 0; j < iord; j++) - s[j] = atoms.get_pos_of_all(vars[j]); - t.insert(s, i, res); -} - -DynareJacobian::DynareJacobian(Dynare &dyn) - : Jacobian(dyn.ny()), d(dyn) -{ - zeros(); -} - -void -DynareJacobian::eval(const Vector &yy) -{ - ogdyn::DynareSteadyAtomValues - dav(d.getModel().getAtoms(), d.getModel().getParams(), yy); - zeros(); - d.fde->eval(dav, *this, 1); -} - -void -DynareJacobian::load(int i, int iord, const int *vars, double res) -{ - if (iord != 1) - throw DynareException(__FILE__, __LINE__, - "Derivative order different from order=1 in DynareJacobian::load"); - - int t = vars[0]; - int j = d.getModel().getAtoms().get_pos_of_all(t); - if (j < d.nyss()) - get(i, j+d.nstat()+d.npred()) += res; - else if (j < d.nyss()+d.ny()) - get(i, j-d.nyss()) += res; - else if (j < d.nyss()+d.ny()+d.nys()) - get(i, j-d.nyss()-d.ny()+d.nstat()) += res; -} - -void -DynareVectorFunction::eval(const ConstVector &in, Vector &out) -{ - check_for_eval(in, out); - Vector xx(d.nexog()); - xx.zeros(); - d.evaluateSystem(out, in, xx); -} diff --git a/dynare++/src/dynare3.hh b/dynare++/src/dynare3.hh deleted file mode 100644 index d0c209872..000000000 --- a/dynare++/src/dynare3.hh +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright © 2005 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef DYNARE3_H -#define DYNARE3_H - -#include "../tl/cc/t_container.hh" -#include "../tl/cc/sparse_tensor.hh" -#include "../kord/decision_rule.hh" -#include "../kord/dynamic_model.hh" - -#include "dynare_model.hh" -#include "nlsolve.hh" - -#include -#include - -#include - -class Dynare; - -class DynareNameList : public NameList -{ - std::vector names; -public: - DynareNameList(const Dynare &dynare); - int - getNum() const override - { - return static_cast(names.size()); - } - const std::string & - getName(int i) const override - { - return names[i]; - } - /* This for each string of the input vector calculates its index in the - names. And returns the resulting vector of indices. If the name cannot be - found, then an exception is raised. */ - std::vector selectIndices(const std::vector &ns) const; -}; - -class DynareExogNameList : public NameList -{ - std::vector names; -public: - DynareExogNameList(const Dynare &dynare); - int - getNum() const override - { - return static_cast(names.size()); - } - const std::string & - getName(int i) const override - { - return names[i]; - } -}; - -class DynareStateNameList : public NameList -{ - std::vector names; -public: - DynareStateNameList(const Dynare &dynare, const DynareNameList &dnl, - const DynareExogNameList &denl); - int - getNum() const override - { - return static_cast(names.size()); - } - const std::string & - getName(int i) const override - { - return names[i]; - } -}; - -// The following only implements DynamicModel with help of ogdyn::DynareModel - -class DynareJacobian; -class Dynare : public DynamicModel -{ - friend class DynareNameList; - friend class DynareExogNameList; - friend class DynareStateNameList; - friend class DynareJacobian; - Journal &journal; - std::unique_ptr model; - std::unique_ptr ysteady; - TensorContainer md; - std::unique_ptr dnl; - std::unique_ptr denl; - std::unique_ptr dsnl; - std::unique_ptr fe; - std::unique_ptr fde; - const double ss_tol; -public: - /* Parses the given model file and uses the given order to - override order from the model file (if it is ≠ −1). */ - Dynare(const std::string &modname, int ord, double sstol, Journal &jr); - /** Parses the given equations with explicitly given names. */ - Dynare(const std::vector &endo, - const std::vector &exo, - const std::vector &par, - const std::string &equations, int ord, - double sstol, Journal &jr); - /* Makes a deep copy of the object. */ - Dynare(const Dynare &dyn); - Dynare(Dynare &&) = default; - std::unique_ptr - clone() const override - { - return std::make_unique(*this); - } - - ~Dynare() override = default; - int - nstat() const override - { - return model->getAtoms().nstat(); - } - int - nboth() const override - { - return model->getAtoms().nboth(); - } - int - npred() const override - { - return model->getAtoms().npred(); - } - int - nforw() const override - { - return model->getAtoms().nforw(); - } - int - nexog() const override - { - return model->getAtoms().nexo(); - } - int - nys() const - { - return model->getAtoms().nys(); - } - int - nyss() const - { - return model->getAtoms().nyss(); - } - int - ny() const - { - return model->getAtoms().ny(); - } - int - order() const override - { - return model->getOrder(); - } - - const NameList & - getAllEndoNames() const override - { - return *dnl; - } - const NameList & - getStateNames() const override - { - return *dsnl; - } - const NameList & - getExogNames() const override - { - return *denl; - } - - TwoDMatrix & - getVcov() - { - return model->getVcov(); - } - const TwoDMatrix & - getVcov() const override - { - return model->getVcov(); - } - Vector & - getParams() - { - return model->getParams(); - } - const Vector & - getParams() const - { - return model->getParams(); - } - void - setInitOuter(const Vector &x) - { - model->setInitOuter(x); - } - - const TensorContainer & - getModelDerivatives() const override - { - return md; - } - const Vector & - getSteady() const override - { - return *ysteady; - } - Vector & - getSteady() override - { - return *ysteady; - } - const ogdyn::DynareModel & - getModel() const - { - return *model; - } - - // here is true public interface - void solveDeterministicSteady(Vector &steady); - void - solveDeterministicSteady() override - { - solveDeterministicSteady(*ysteady); - } - void evaluateSystem(Vector &out, const ConstVector &yy, const Vector &xx) override; - void evaluateSystem(Vector &out, const ConstVector &yym, const ConstVector &yy, - const ConstVector &yyp, const Vector &xx) override; - void calcDerivatives(const Vector &yy, const Vector &xx); - void calcDerivativesAtSteady() override; - - void writeMat(mat_t *fd, const std::string &prefix) const; - void writeDump(const std::string &basename) const; -private: - void writeModelInfo(Journal &jr) const; -}; - -class DynareEvalLoader : public ogp::FormulaEvalLoader, public Vector -{ -public: - DynareEvalLoader(const ogp::FineAtoms &a, Vector &out); - void - load(int i, double res) override - { - operator[](i) = res; - } -}; - -class DynareDerEvalLoader : public ogp::FormulaDerEvalLoader -{ -protected: - const ogp::FineAtoms &atoms; - TensorContainer &md; -public: - DynareDerEvalLoader(const ogp::FineAtoms &a, TensorContainer &mod_ders, - int order); - void load(int i, int iord, const int *vars, double res) override; -}; - -class DynareJacobian : public ogu::Jacobian, public ogp::FormulaDerEvalLoader -{ -protected: - Dynare &d; -public: - DynareJacobian(Dynare &dyn); - ~DynareJacobian() override = default; - void load(int i, int iord, const int *vars, double res) override; - void eval(const Vector &in) override; -}; - -class DynareVectorFunction : public ogu::VectorFunction -{ -protected: - Dynare &d; -public: - DynareVectorFunction(Dynare &dyn) - : d(dyn) - { - } - ~DynareVectorFunction() override = default; - int - inDim() const override - { - return d.ny(); - } - int - outDim() const override - { - return d.ny(); - } - void eval(const ConstVector &in, Vector &out) override; -}; - -#endif diff --git a/dynare++/src/dynare_atoms.cc b/dynare++/src/dynare_atoms.cc deleted file mode 100644 index 567dcb28f..000000000 --- a/dynare++/src/dynare_atoms.cc +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "parser/cc/parser_exception.hh" -#include "utils/cc/exception.hh" - -#include "dynare_atoms.hh" - -#include -#include -#include -#include -#include - -using namespace ogdyn; -using std::string; - -void -DynareStaticAtoms::register_name(string name) -{ - if (varnames.query(name)) - throw ogp::ParserException("The name "+name+" is not unique.", 0); - StaticAtoms::register_name(std::move(name)); -} - -int -DynareStaticAtoms::check_variable(const string &name) const -{ - if (!varnames.query(name)) - throw ogp::ParserException("Unknown name <"+name+">", 0); - auto it = vars.find(name); - if (it == vars.end()) - return -1; - else - return it->second; -} - -void -DynareDynamicAtoms::parse_variable(const string &in, std::string &out, int &ll) const -{ - ll = 0; - auto left = in.find_first_of("({"); - if (left != string::npos) - { - out = in.substr(0, left); - left++; - auto right = in.find_first_of(")}", left); - if (string::npos == right) - throw ogp::ParserException("Syntax error when parsing Dynare atom <"+in+">.", 0); - ll = std::stoi(in.substr(left, right-left)); - } - else - out = in; -} - -void -DynareDynamicAtoms::register_uniq_endo(string name) -{ - FineAtoms::register_uniq_endo(name); - atom_type.emplace(std::move(name), atype::endovar); -} - -void -DynareDynamicAtoms::register_uniq_exo(string name) -{ - FineAtoms::register_uniq_exo(name); - atom_type.emplace(std::move(name), atype::exovar); -} - -void -DynareDynamicAtoms::register_uniq_param(string name) -{ - FineAtoms::register_uniq_param(name); - atom_type.emplace(std::move(name), atype::param); -} - -bool -DynareDynamicAtoms::is_type(const string &name, atype tp) const -{ - auto it = atom_type.find(name); - if (it != atom_type.end() && it->second == tp) - return true; - else - return false; -} - -void -DynareDynamicAtoms::print() const -{ - SAtoms::print(); - std::cout << "Name types:\n"; - for (auto it : atom_type) - std::cout << "name=" << it.first << " type=" - << (it.second == atype::endovar ? "endovar" : it.second == atype::exovar ? "exovar" : "param") - << '\n'; -} - -std::string -DynareDynamicAtoms::convert(int t) const -{ - if (t < ogp::OperationTree::num_constants) - { - throw ogu::Exception(__FILE__, __LINE__, - "Tree index is a built-in constant in DynareDynamicAtoms::convert"); - return {}; - } - if (is_constant(t)) - { - double v = get_constant_value(t); - std::ostringstream buf; - buf << std::setprecision(std::numeric_limits::max_digits10) - << v; - return buf.str(); - } - - const string &s = name(t); - if (is_type(s, atype::endovar)) - { - int ll = lead(t); - if (ll) - return s + '(' + std::to_string(ll) + ')'; - } - - return s; -} - -void -DynareAtomValues::setValues(ogp::EvalTree &et) const -{ - // set constants - atoms.setValues(et); - - // set parameteres - for (unsigned int i = 0; i < atoms.get_params().size(); i++) - if (atoms.is_referenced(atoms.get_params()[i])) - { - const ogp::DynamicAtoms::Tlagmap &lmap = atoms.lagmap(atoms.get_params()[i]); - for (auto it : lmap) - { - int t = it.second; - et.set_nulary(t, paramvals[i]); - } - } - - // set endogenous - for (unsigned int outer_i = 0; outer_i < atoms.get_endovars().size(); outer_i++) - if (atoms.is_referenced(atoms.get_endovars()[outer_i])) - { - const ogp::DynamicAtoms::Tlagmap &lmap = atoms.lagmap(atoms.get_endovars()[outer_i]); - for (auto it : lmap) - { - int ll = it.first; - int t = it.second; - int i = atoms.outer2y_endo()[outer_i]; - if (ll == -1) - et.set_nulary(t, yym[i-atoms.nstat()]); - else if (ll == 0) - et.set_nulary(t, yy[i]); - else - et.set_nulary(t, yyp[i-atoms.nstat()-atoms.npred()]); - } - } - - // set exogenous - for (unsigned int outer_i = 0; outer_i < atoms.get_exovars().size(); outer_i++) - if (atoms.is_referenced(atoms.get_exovars()[outer_i])) - { - const ogp::DynamicAtoms::Tlagmap &lmap = atoms.lagmap(atoms.get_exovars()[outer_i]); - for (auto it : lmap) - { - int ll = it.first; - if (ll == 0) // this is always true because of checks - { - int t = it.second; - int i = atoms.outer2y_exo()[outer_i]; - et.set_nulary(t, xx[i]); - } - } - } -} - -void -DynareStaticSteadyAtomValues::setValues(ogp::EvalTree &et) const -{ - // set constants - atoms_static.setValues(et); - - // set parameters - for (auto name : atoms_static.get_params()) - { - int t = atoms_static.index(name); - if (t != -1) - { - int idyn = atoms.name2outer_param(name); - et.set_nulary(t, paramvals[idyn]); - } - } - - // set endogenous - for (auto name : atoms_static.get_endovars()) - { - int t = atoms_static.index(name); - if (t != -1) - { - int idyn = atoms.outer2y_endo()[atoms.name2outer_endo(name)]; - et.set_nulary(t, yy[idyn]); - } - } - - // set exogenous - for (auto name : atoms_static.get_exovars()) - { - int t = atoms_static.index(name); - if (t != -1) - et.set_nulary(t, 0.0); - } -} - -DynareSteadySubstitutions::DynareSteadySubstitutions(const ogp::FineAtoms &a, - const ogp::OperationTree &tree, - const Tsubstmap &subst, - const Vector &pvals, Vector &yy) - : atoms(a), y(yy) -{ - // fill the vector of left and right hand sides - for (auto it : subst) - { - left_hand_sides.push_back(it.first); - right_hand_sides.push_back(it.second); - } - - // evaluate right hand sides - DynareSteadyAtomValues dsav(atoms, pvals, y); - ogp::FormulaCustomEvaluator fe(tree, right_hand_sides); - fe.eval(dsav, *this); -} - -void -DynareSteadySubstitutions::load(int i, double res) -{ - const string &name = left_hand_sides[i]; - int iouter = atoms.name2outer_endo(name); - int iy = atoms.outer2y_endo()[iouter]; - if (!std::isfinite(y[iy])) - y[iy] = res; -} - -DynareStaticSteadySubstitutions:: -DynareStaticSteadySubstitutions(const ogp::FineAtoms &a, const ogp::StaticFineAtoms &sa, - const ogp::OperationTree &tree, - const Tsubstmap &subst, - const Vector &pvals, Vector &yy) - : atoms(a), atoms_static(sa), y(yy) -{ - // fill the vector of left and right hand sides - for (const auto &it : subst) - { - left_hand_sides.push_back(it.first); - right_hand_sides.push_back(it.second); - } - - // evaluate right hand sides - DynareStaticSteadyAtomValues dsav(atoms, atoms_static, pvals, y); - ogp::FormulaCustomEvaluator fe(tree, right_hand_sides); - fe.eval(dsav, *this); -} - -void -DynareStaticSteadySubstitutions::load(int i, double res) -{ - const string &name = left_hand_sides[i]; - int iouter = atoms.name2outer_endo(name); - int iy = atoms.outer2y_endo()[iouter]; - if (!std::isfinite(y[iy])) - y[iy] = res; -} diff --git a/dynare++/src/dynare_atoms.hh b/dynare++/src/dynare_atoms.hh deleted file mode 100644 index 60d824491..000000000 --- a/dynare++/src/dynare_atoms.hh +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef OGDYN_DYNARE_ATOMS_H -#define OGDYN_DYNARE_ATOMS_H - -#include "sylv/cc/Vector.hh" - -#include "parser/cc/static_atoms.hh" -#include "parser/cc/static_fine_atoms.hh" -#include "parser/cc/atom_substitutions.hh" -#include "parser/cc/tree.hh" - -#include -#include - -namespace ogdyn -{ - using std::map; - using std::vector; - using std::string; - - /* A definition of a type mapping a string to an integer. Used as a - substitution map, saying what names are substituted for what expressions - represented by tree indices. */ - using Tsubstmap = map; - - class DynareStaticAtoms : public ogp::StaticAtoms - { - public: - DynareStaticAtoms() - : StaticAtoms() - { - } - DynareStaticAtoms(const DynareStaticAtoms &a) = default; - ~DynareStaticAtoms() override = default; - /* This registers a unique varname identifier. It throws an exception if - the variable name is duplicate. It checks the uniqueness and then it - calls StaticAtoms::register_name. */ - void register_name(string name) override; - protected: - /* This returns a tree index of the given variable, and if the variable has - not been registered, it throws an exception. */ - int check_variable(const string &name) const override; - }; - - class DynareDynamicAtoms : public ogp::SAtoms, public ogp::NularyStringConvertor - { - public: - enum class atype { endovar, exovar, param }; - protected: - using Tatypemap = map; - /* The map assigining a type to each name. */ - Tatypemap atom_type; - public: - DynareDynamicAtoms() - : ogp::SAtoms() - { - } - /* This parses a variable of the forms: varname(+3), varname(3), varname, - varname(-3), varname(0), varname(+0), varname(-0). */ - void parse_variable(const string &in, std::string &out, int &ll) const override; - /* Registers unique name of endogenous variable. */ - void register_uniq_endo(string name) override; - /* Registers unique name of exogenous variable. */ - void register_uniq_exo(string name) override; - /* Registers unique name of parameter. */ - void register_uniq_param(string name) override; - /* Return true if the name is a given type. */ - bool is_type(const string &name, atype tp) const; - /* Debug print. */ - void print() const override; - /* Implement NularyStringConvertor::convert. */ - std::string convert(int t) const override; - }; - - /* This class represents the atom values for dynare, where exogenous - variables can occur only at time t, and endogenous at times t−1, t, and - t+1. */ - class DynareAtomValues : public ogp::AtomValues - { - protected: - /* Reference to the atoms (we suppose that they are only at t−1,t,t+1. */ - const ogp::FineAtoms &atoms; - /* De facto reference to the values of parameters. */ - const ConstVector paramvals; - /* De facto reference to the values of endogenous at time t−1. Only - predetermined and both part. */ - const ConstVector yym; - /* De facto reference to the values of endogenous at time t. Ordering given - by the atoms. */ - const ConstVector yy; - /* De facto reference to the values of endogenous at time t+1. Only both - and forward looking part. */ - const ConstVector yyp; - /* De facto reference to the values of exogenous at time t. */ - const ConstVector xx; - public: - DynareAtomValues(const ogp::FineAtoms &a, const Vector &pvals, const Vector &ym, - const Vector &y, const Vector &yp, const Vector &x) - : atoms(a), paramvals(pvals), yym(ym), yy(y), yyp(yp), xx(x) - { - } - DynareAtomValues(const ogp::FineAtoms &a, const Vector &pvals, const ConstVector &ym, - const ConstVector &y, const ConstVector &yp, const Vector &x) - : atoms(a), paramvals(pvals), yym(ym), yy(y), yyp(yp), xx(x) - { - } - void setValues(ogp::EvalTree &et) const override; - }; - - /* This class represents the atom values at the steady state. It makes only - appropriate subvector yym and yyp of the y vector, makes a vector of zero - exogenous variables and uses DynareAtomValues with more general - interface. */ - class DynareSteadyAtomValues : public ogp::AtomValues - { - protected: - /* Subvector of yy. */ - const ConstVector yym; - /* Subvector of yy. */ - const ConstVector yyp; - /* Vector of zeros for exogenous variables. */ - Vector xx; - /* Atom values using this yym, yyp and xx. */ - DynareAtomValues av; - public: - DynareSteadyAtomValues(const ogp::FineAtoms &a, const Vector &pvals, const Vector &y) - : yym(y, a.nstat(), a.nys()), - yyp(y, a.nstat()+a.npred(), a.nyss()), - xx(a.nexo()), - av(a, pvals, yym, y, yyp, xx) - { - xx.zeros(); - } - void - setValues(ogp::EvalTree &et) const override - { - av.setValues(et); - } - }; - - class DynareStaticSteadyAtomValues : public ogp::AtomValues - { - protected: - /* Reference to static atoms over which the tree, where the values go, is - defined. */ - const ogp::StaticFineAtoms &atoms_static; - /* Reference to dynamic atoms for which the class gets input data. */ - const ogp::FineAtoms &atoms; - /* De facto reference to input data, this is a vector of endogenous - variables in internal ordering of the dynamic atoms. */ - ConstVector yy; - /* De facto reference to input parameters corresponding to ordering defined - by the dynamic atoms. */ - ConstVector paramvals; - public: - /* Construct the object. */ - DynareStaticSteadyAtomValues(const ogp::FineAtoms &a, const ogp::StaticFineAtoms &sa, - const Vector &pvals, const Vector &yyy) - : atoms_static(sa), - atoms(a), - yy(yyy), - paramvals(pvals) - { - } - /* Set the values to the tree defined over the static atoms. */ - void setValues(ogp::EvalTree &et) const override; - }; - - /* This class takes a vector of endogenous variables and a substitution map. - It supposes that variables at the right hand sides of the substitutions - are set in the endogenous vector. It evaluates the substitutions and if - the variables corresponding to left hand sides are not set in the - endogenous vector it sets them to calculated values. If a variable is - already set, it does not override its value. It has no methods, everything - is done in the constructor. */ - class DynareSteadySubstitutions : public ogp::FormulaEvalLoader - { - protected: - const ogp::FineAtoms &atoms; - public: - DynareSteadySubstitutions(const ogp::FineAtoms &a, const ogp::OperationTree &tree, - const Tsubstmap &subst, - const Vector &pvals, Vector &yy); - void load(int i, double res) override; - protected: - Vector &y; - vector left_hand_sides; - vector right_hand_sides; - }; - - /* This class is a static version of DynareSteadySustitutions. It works for - static atoms and static tree and substitution map over the static tree. It - also needs dynamic version of the atoms, since it defines ordering of the - vectors pvals, and yy. */ - class DynareStaticSteadySubstitutions : public ogp::FormulaEvalLoader - { - protected: - const ogp::FineAtoms &atoms; - const ogp::StaticFineAtoms &atoms_static; - public: - DynareStaticSteadySubstitutions(const ogp::FineAtoms &a, - const ogp::StaticFineAtoms &sa, - const ogp::OperationTree &tree, - const Tsubstmap &subst, - const Vector &pvals, Vector &yy); - void load(int i, double res) override; - protected: - Vector &y; - vector left_hand_sides; - vector right_hand_sides; - }; - -}; - -#endif diff --git a/dynare++/src/dynare_model.cc b/dynare++/src/dynare_model.cc deleted file mode 100644 index ce9e48dcb..000000000 --- a/dynare++/src/dynare_model.cc +++ /dev/null @@ -1,968 +0,0 @@ -/* - * Copyright © 2006-2011 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "parser/cc/parser_exception.hh" -#include "parser/cc/location.hh" -#include "utils/cc/exception.hh" -#include "dynare_model.hh" -#include "dynare_exception.hh" -#include "planner_builder.hh" -#include "forw_subst_builder.hh" - -#include -#include -#include -#include -#include -#include -#include - -using namespace ogdyn; - -ParsedMatrix::ParsedMatrix(const ogp::MatrixParser &mp) - : TwoDMatrix(mp.nrows(), mp.ncols()) -{ - zeros(); - for (ogp::MPIterator it = mp.begin(); it != mp.end(); ++it) - get(it.row(), it.col()) = *it; -} - -DynareModel::DynareModel() - : atoms(), eqs(atoms) -{ -} - -DynareModel::DynareModel(const DynareModel &dm) - : atoms(dm.atoms), eqs(dm.eqs, atoms), order(dm.order), - t_plobjective(dm.t_plobjective), - t_pldiscount(dm.t_pldiscount) -{ - if (dm.param_vals) - param_vals = std::make_unique(const_cast(*dm.param_vals)); - if (dm.init_vals) - init_vals = std::make_unique(const_cast(*dm.init_vals)); - if (dm.vcov_mat) - vcov_mat = std::make_unique(const_cast(*dm.vcov_mat)); - if (dm.old_atoms) - old_atoms = std::make_unique(static_cast(*dm.old_atoms)); - if (dm.atom_substs) - atom_substs = std::make_unique(*dm.atom_substs, *old_atoms, atoms); - if (dm.pbuilder) - pbuilder = std::make_unique(*dm.pbuilder, *this); - if (dm.fbuilder) - fbuilder = std::make_unique(*dm.fbuilder, *this); -} - -const PlannerInfo * -DynareModel::get_planner_info() const -{ - if (pbuilder) - return &(pbuilder->get_info()); - return nullptr; -} - -const ForwSubstInfo * -DynareModel::get_forw_subst_info() const -{ - if (fbuilder) - return &(fbuilder->get_info()); - return nullptr; -} - -const ogp::SubstInfo * -DynareModel::get_subst_info() const -{ - if (atom_substs) - return &(atom_substs->get_info()); - return nullptr; -} - -void -DynareModel::setInitOuter(const Vector &x) -{ - if (x.length() != atoms.ny()) - throw DynareException(__FILE__, __LINE__, - "Wrong length of vector in DynareModel::setInitOuter"); - for (int i = 0; i < atoms.ny(); i++) - (*init_vals)[i] = x[atoms.y2outer_endo()[i]]; -} - -void -DynareModel::print() const -{ - std::cout << "all atoms:\n"; - atoms.print(); - std::cout << "formulas:\n"; - DebugOperationFormatter dof(*this); - for (int i = 0; i < eqs.nformulas(); i++) - { - int tf = eqs.formula(i); - std::cout << "formula " << tf << "%d:\n"; - eqs.getTree().print_operation_tree(tf, std::cout, dof); - } -} - -void -DynareModel::dump_model(std::ostream &os) const -{ - // endogenous variable declaration - os << "var"; - for (auto i : atoms.get_endovars()) - os << " " << i; - os << ";\n\n"; - - // exogenous variables - os << "varexo"; - for (auto i : atoms.get_exovars()) - os << " " << i; - os << ";\n\n"; - - // parameters - os << "parameters"; - for (auto i : atoms.get_params()) - os << " " << i; - os << ";\n\n"; - - // parameter values - os.precision(16); - for (int i = 0; i < static_cast(atoms.get_params().size()); i++) - os << atoms.get_params()[i] << "=" << getParams()[i] << ";\n"; - os << "\n\n"; - - // model section - ogp::OperationStringConvertor osc(atoms, getParser().getTree()); - os << "model;\n"; - for (int i = 0; i < getParser().nformulas(); i++) - { - os << "// Equation " << i << "\n0 = "; - int t = getParser().formula(i); - os << osc.convert(getParser().getTree().operation(t), t); - os << ";\n"; - } - os << "end;\n"; - - // initval as steady state - os << "initval;\n"; - for (int i = 0; i < static_cast(atoms.get_endovars().size()); i++) - os << atoms.get_endovars()[atoms.y2outer_endo()[i]] << "=" << getInit()[i] << ";\n"; - os << "end;\n"; -} - -void -DynareModel::add_name(std::string name, int flag) -{ - if (flag == 1) - // endogenous - atoms.register_uniq_endo(name); - else if (flag == 2) - // exogenous - atoms.register_uniq_exo(name); - else if (flag == 3) - // parameter - atoms.register_uniq_param(name); - else - throw DynareException(__FILE__, __LINE__, "Unrecognized flag value."); -} - -void -DynareModel::check_model() const -{ - if (order == -1) - throw DynareException(__FILE__, __LINE__, - "Order of approximation not set in DynareModel::check_model"); - - if (atoms.ny() != eqs.nformulas()) - throw DynareException(__FILE__, __LINE__, "Model has " + std::to_string(eqs.nformulas()) - + " equations for " + std::to_string(atoms.ny()) + " endogenous variables"); - - /* check whether all nulary terms of all formulas in eqs are either constant - or assigned to a name */ - for (int i = 0; i < eqs.nformulas(); i++) - { - int ft = eqs.formula(i); - const unordered_set &nuls = eqs.nulary_of_term(ft); - for (int nul : nuls) - if (!atoms.is_constant(nul) && !atoms.is_named_atom(nul)) - throw DynareException(__FILE__, __LINE__, - "Dangling nulary term found, internal error."); - } - - int mlag, mlead; - atoms.exovarspan(mlead, mlag); - if (atoms.nexo() > 0 && (mlead != 0 || mlag != 0)) - throw DynareException(__FILE__, __LINE__, - "The model contains occurrences of lagged/leaded exogenous variables"); - - atoms.endovarspan(mlead, mlag); - if (mlead > 1 || mlag < -1) - throw DynareException(__FILE__, __LINE__, - "The model contains occurrences of too lagged/leaded endogenous variables"); - - // check the dimension of vcov matrix - if (getAtoms().nexo() != getVcov().nrows()) - throw DynareException(__FILE__, __LINE__, - "Dimension of VCOV matrix does not correspond to the shocks"); -} - -int -DynareModel::variable_shift(int t, int tshift) -{ - const string &name = atoms.name(t); - if (atoms.is_type(name, DynareDynamicAtoms::atype::param) - || atoms.is_constant(t)) - throw DynareException(__FILE__, __LINE__, - "The tree index is not a variable in DynareModel::variable_shift"); - int ll = atoms.lead(t) + tshift; - int res = atoms.index(name, ll); - if (res == -1) - res = eqs.add_nulary(name + '(' + std::to_string(ll) + ')'); - return res; -} - -void -DynareModel::variable_shift_map(const unordered_set &a_set, int tshift, - map &s_map) -{ - s_map.clear(); - for (int t : a_set) - // make shift map only for non-constants and non-parameters - if (!atoms.is_constant(t)) - { - const string &name = atoms.name(t); - if (atoms.is_type(name, DynareDynamicAtoms::atype::endovar) - || atoms.is_type(name, DynareDynamicAtoms::atype::exovar)) - { - int tt = variable_shift(t, tshift); - s_map.emplace(t, tt); - } - } -} - -void -DynareModel::termspan(int t, int &mlead, int &mlag) const -{ - mlead = std::numeric_limits::min(); - mlag = std::numeric_limits::max(); - const unordered_set &nul_terms = eqs.nulary_of_term(t); - for (int nul_term : nul_terms) - { - if (!atoms.is_constant(nul_term) - && (atoms.is_type(atoms.name(nul_term), DynareDynamicAtoms::atype::endovar) - || atoms.is_type(atoms.name(nul_term), DynareDynamicAtoms::atype::exovar))) - { - int ll = atoms.lead(nul_term); - mlag = std::min(ll, mlag); - mlead = std::max(ll, mlead); - } - } -} - -bool -DynareModel::is_constant_term(int t) const -{ - const unordered_set &nul_terms = eqs.nulary_of_term(t); - for (int nul_term : nul_terms) - if (!atoms.is_constant(nul_term) - && !atoms.is_type(atoms.name(nul_term), DynareDynamicAtoms::atype::param)) - return false; - return true; -} - -unordered_set -DynareModel::get_nonlinear_subterms(int t) const -{ - NLSelector nls(*this); - return eqs.getTree().select_terms(t, nls); -} - -void -DynareModel::substitute_atom_for_term(const string &name, int ll, int t) -{ - /* if the term t is itself a named atom (parameter, exo, endo), then we have - to unassign it first */ - if (atoms.is_named_atom(t)) - atoms.unassign_variable(atoms.name(t), atoms.lead(t), t); - /* assign allocated tree index for the term now to name(ll) */ - atoms.assign_variable(name, ll, t); - // make operation t nulary in operation tree - eqs.nularify(t); -} - -void -DynareModel::final_job() -{ - if (t_plobjective != -1 && t_pldiscount != -1) - { - /* at this moment include all equations and all variables; in future we - will exclude purely exogenous processes; TODO */ - PlannerBuilder::Tvarset vset; - for (int i = 0; i < atoms.ny(); i++) - vset.insert(atoms.get_endovars()[i]); - PlannerBuilder::Teqset eset; - for (int i = 0; i < eqs.nformulas(); i++) - eset.push_back(i); - - // construct the planner builder, this adds a lot of stuff to the model - pbuilder = std::make_unique(*this, vset, eset); - } - - // construct ForwSubstBuilder - fbuilder = std::make_unique(*this); - - // call parsing_finished (this will define an outer ordering of all variables) - atoms.parsing_finished(ogp::VarOrdering::bfspbfpb); - // make a copy of atoms and name it old_atoms - old_atoms = std::make_unique(atoms); - // construct empty substitutions from old_atoms to atoms - atom_substs = std::make_unique(*old_atoms, atoms); - /* do the actual substitution, it will also call parsing_finished for atoms - which creates internal orderings */ - atoms.substituteAllLagsAndExo1Leads(eqs, *atom_substs); -} - -extern ogp::location_type dynglob_lloc; - -DynareParser::DynareParser(const string &stream, int ord) - : DynareModel(), - pa_atoms(), paramset(pa_atoms), - ia_atoms(), initval(ia_atoms), vcov(), - model_beg(0), model_end(-1), - paramset_beg(0), paramset_end(-1), - initval_beg(0), initval_end(-1), - vcov_beg(0), vcov_end(-1), - order_beg(0), order_end(-1), - plobjective_beg(0), plobjective_end(-1), - pldiscount_beg(0), pldiscount_end(-1) -{ - // global parse - try - { - parse_glob(stream); - } - catch (const ogp::ParserException &e) - { - throw ogp::ParserException(e, dynglob_lloc.off); - } - // setting parameters parse - try - { - if (paramset_end > paramset_beg) - paramset.parse(stream.substr(paramset_beg, paramset_end-paramset_beg)); - } - catch (const ogp::ParserException &e) - { - throw ogp::ParserException(e, paramset_beg); - } - // model parse - try - { - if (model_end > model_beg) - eqs.parse(stream.substr(model_beg, model_end-model_beg)); - else - throw ogp::ParserException("Model section not found.", 0); - } - catch (const ogp::ParserException &e) - { - throw ogp::ParserException(e, model_beg); - } - // initval setting parse - try - { - if (initval_end > initval_beg) - initval.parse(stream.substr(initval_beg, initval_end-initval_beg)); - } - catch (const ogp::ParserException &e) - { - throw ogp::ParserException(e, initval_beg); - } - // vcov parse - try - { - if (vcov_end > vcov_beg) - vcov.parse(stream.substr(vcov_beg, vcov_end-vcov_beg)); - } - catch (const ogp::ParserException &e) - { - throw ogp::ParserException(e, vcov_beg); - } - // planner objective parse - try - { - if (plobjective_end > plobjective_beg) - { - eqs.parse(stream.substr(plobjective_beg, plobjective_end-plobjective_beg)); - t_plobjective = eqs.pop_last_formula(); - } - } - catch (const ogp::ParserException &e) - { - throw ogp::ParserException(e, plobjective_beg); - } - // planner discount parse - try - { - if (pldiscount_end > pldiscount_beg) - t_pldiscount = parse_pldiscount(stream.substr(pldiscount_beg, pldiscount_end - pldiscount_beg)); - } - catch (const ogp::ParserException &e) - { - throw ogp::ParserException(e, pldiscount_beg); - } - // order parse - try - { - if (order_end > order_beg) - order = parse_order(stream.substr(order_beg, order_end - order_beg)); - } - catch (const ogp::ParserException &e) - { - throw ogp::ParserException(e, order_beg); - } - - // check the overridden order - if (ord != -1) - order = ord; - - // end parsing job, add planner's FOCs, make substitutions - DynareModel::final_job(); - - // calculate parameters - calc_params(); - // calculate initial values - calc_init(); - - if (vcov_end > vcov_beg) - vcov_mat = std::make_unique(vcov); - else - { - // vcov has not been asserted, set it to unit matrix - vcov_mat = std::make_unique(atoms.nexo(), atoms.nexo()); - vcov_mat->unit(); - } - - // check the model - check_model(); - - // differentiate - if (order >= 1) - eqs.differentiate(order); -} - -DynareParser::DynareParser(const DynareParser &dp) - : DynareModel(dp), - pa_atoms(dp.pa_atoms), paramset(dp.paramset, pa_atoms), - ia_atoms(dp.ia_atoms), initval(dp.initval, ia_atoms), vcov(dp.vcov), - model_beg(dp.model_beg), model_end(dp.model_end), - paramset_beg(dp.paramset_beg), paramset_end(dp.paramset_end), - initval_beg(dp.initval_beg), initval_end(dp.initval_end), - vcov_beg(dp.vcov_beg), vcov_end(dp.vcov_end), - order_beg(dp.order_beg), order_end(dp.order_end), - plobjective_beg(dp.plobjective_beg), plobjective_end(dp.plobjective_end), - pldiscount_beg(dp.pldiscount_beg), pldiscount_end(dp.pldiscount_end) -{ -} - -void -DynareParser::add_name(string name, int flag) -{ - DynareModel::add_name(name, flag); - // register with static atoms used for atom assignements - if (flag == 1) - // endogenous - ia_atoms.register_name(std::move(name)); - else if (flag == 2) - // exogenous - ia_atoms.register_name(std::move(name)); - else if (flag == 3) - { - // parameter - pa_atoms.register_name(name); - ia_atoms.register_name(std::move(name)); - } - else - throw DynareException(__FILE__, __LINE__, "Unrecognized flag value."); -} - -void -DynareParser::error(string mes) -{ - // throwing zero offset since this exception will be caugth at constructor - throw ogp::ParserException(std::move(mes), 0); -} - -void -DynareParser::print() const -{ - DynareModel::print(); - std::cout << "parameter atoms:\n"; - paramset.print(); - std::cout << "initval atoms:\n"; - initval.print(); - std::cout << "model position: " << model_beg << ' ' << model_end << '\n' - << "paramset position: " << paramset_beg << ' ' << paramset_end << '\n' - << "initval position: " << initval_beg << ' ' << initval_end << '\n'; -} - -/* A global symbol for passing info to the DynareParser from parser. */ -DynareParser *dynare_parser; - -/* The declarations of functions defined in dynglob_ll.cc and dynglob_tab.cc - generated from dynglob.lex and dynglob.y */ -void *dynglob__scan_string(const char *); -void dynglob__destroy_buffer(void *); -void dynglob_parse(); -extern ogp::location_type dynglob_lloc; - -void -DynareParser::parse_glob(const string &stream) -{ - void *p = dynglob__scan_string(stream.c_str()); - dynare_parser = this; - dynglob_parse(); - dynglob__destroy_buffer(p); -} - -int -DynareParser::parse_order(const string &str) -{ - return std::stoi(str); -} - -int -DynareParser::parse_pldiscount(const string &str) -{ - if (!atoms.is_type(str, DynareDynamicAtoms::atype::param)) - throw ogp::ParserException("Name " + str + " is not a parameter", 0); - - int t = atoms.index(str, 0); - if (t == -1) - t = eqs.add_nulary(str); - - return t; -} - -void -DynareParser::calc_params() -{ - param_vals = std::make_unique(atoms.np()); - ogp::AtomAsgnEvaluator aae(paramset); - aae.eval(); - for (int i = 0; i < atoms.np(); i++) - (*param_vals)[i] = aae.get_value(atoms.get_params()[i]); - - for (unsigned int i = 0; i < atoms.get_params().size(); i++) - if (!std::isfinite((*param_vals)[i])) - std::cout << "dynare++: warning: value for parameter " << atoms.get_params()[i] << " is not finite\n"; -} - -void -DynareParser::calc_init() -{ - // update initval atoms assignings according to substitutions - if (atom_substs) - initval.apply_subst(atom_substs->get_old2new()); - - // calculate the vector of initial values - init_vals = std::make_unique(atoms.ny()); - ogp::AtomAsgnEvaluator aae(initval); - // set parameters - for (int ip = 0; ip < atoms.np(); ip++) - aae.set_user_value(atoms.get_params()[ip], (*param_vals)[ip]); - // set exogenous to zeros - for (int ie = 0; ie < atoms.nexo(); ie++) - aae.set_user_value(atoms.get_exovars()[ie], 0.0); - // evaluate - aae.eval(); - // set results to internally ordered vector init_vals - for (int outer = 0; outer < atoms.ny(); outer++) - { - int i = atoms.outer2y_endo()[outer]; - (*init_vals)[i] = aae.get_value(atoms.get_endovars()[outer]); - } - - /* if the planner's FOCs have been added, then add estimate of Lagrange - multipliers to the vector */ - if (pbuilder) - MultInitSS mis(*pbuilder, *param_vals, *init_vals); - - /* if forward substitution builder has been created, we have to its - substitutions and evaluate them */ - if (fbuilder) - ogdyn::DynareSteadySubstitutions dss(atoms, eqs.getTree(), - fbuilder->get_aux_map(), *param_vals, *init_vals); - - for (unsigned int i = 0; i < atoms.get_endovars().size(); i++) - if (!std::isfinite((*init_vals)[i])) - std::cout << "dynare++: warning: initval for <" << atoms.get_endovars()[atoms.y2outer_endo()[i]] << "> is not finite\n"; -} - -// this returns false for linear functions -bool -NLSelector::operator()(int t) const -{ - const ogp::Operation &op = model.getParser().getTree().operation(t); - const DynareDynamicAtoms &atoms = model.getAtoms(); - // if the term is constant, return false - if (model.is_constant_term(t)) - return false; - int nary = op.nary(); - if (nary == 0) - { - if (atoms.is_type(atoms.name(t), DynareDynamicAtoms::atype::endovar) - || atoms.is_type(atoms.name(t), DynareDynamicAtoms::atype::exovar)) - return true; - else - return false; - } - else if (nary == 1) - { - if (op.getCode() == ogp::code_t::UMINUS) - return false; - else - return true; - } - else - { - if (op.getCode() == ogp::code_t::TIMES) - // if at least one operand is constant, than the TIMES is linear - if (model.is_constant_term(op.getOp1()) - || model.is_constant_term(op.getOp2())) - return false; - else - return true; - // both PLUS and MINUS are linear - if (op.getCode() == ogp::code_t::PLUS - || op.getCode() == ogp::code_t::MINUS) - return false; - // POWER is linear if exponent or base is 0 or one - if (op.getCode() == ogp::code_t::POWER - && (op.getOp1() == ogp::OperationTree::zero - || op.getOp1() == ogp::OperationTree::one - || op.getOp2() == ogp::OperationTree::zero - || op.getOp2() == ogp::OperationTree::one)) - return false; - else - return true; - /* DIVIDE is linear if the denominator is constant, or if the nominator - is zero */ - if (op.getCode() == ogp::code_t::DIVIDE - && (op.getOp1() == ogp::OperationTree::zero - || model.is_constant_term(op.getOp2()))) - return false; - else - return true; - } - - throw DynareException(__FILE__, __LINE__, - "Wrong operation in operation tree"); - return false; -} - -DynareSPModel::DynareSPModel(const std::vector &endo, - const std::vector &exo, - const std::vector &par, - const string &equations, - int ord) - : DynareModel() -{ - // set the order - order = ord; - - // add names - for (const auto &it : endo) - add_name(it, 1); - for (const auto &it : exo) - add_name(it, 2); - for (const auto &it : par) - add_name(it, 3); - - // parse the equations - eqs.parse(equations); - - // parsing finished - atoms.parsing_finished(ogp::VarOrdering::bfspbfpb); - - // create what has to be created from DynareModel - param_vals = std::make_unique(atoms.np()); - init_vals = std::make_unique(atoms.ny()); - vcov_mat = std::make_unique(atoms.nexo(), atoms.nexo()); - - // check the model - check_model(); - - // differentiate - if (order >= 1) - eqs.differentiate(order); -} - -void -ModelSSWriter::write_der0(std::ostream &os) -{ - write_der0_preamble(os); - write_atom_assignment(os); - - stop_set.clear(); - for (int fi = 0; fi < model.eqs.nformulas(); fi++) - otree.print_operation_tree(model.eqs.formula(fi), os, *this); - - write_der0_assignment(os); -} - -void -ModelSSWriter::write_der1(std::ostream &os) -{ - write_der1_preamble(os); - write_atom_assignment(os); - - stop_set.clear(); - - const vector &variables = model.getAtoms().variables(); - const vector &eam = model.getAtoms().get_endo_atoms_map(); - for (int i = 0; i < model.getParser().nformulas(); i++) - { - const ogp::FormulaDerivatives &fder = model.getParser().derivatives(i); - for (int j : eam) - { - int t = fder.derivative(ogp::FoldMultiIndex(variables.size(), 1, j)); - if (t > 0) - otree.print_operation_tree(t, os, *this); - } - } - - write_der1_assignment(os); -} - -MatlabSSWriter::MatlabSSWriter(const DynareModel &dm, std::string id_arg) - : ModelSSWriter(dm), id(std::move(id_arg)) -{ -} - -void -MatlabSSWriter::write_der0_preamble(std::ostream &os) const -{ - os << "% Usage:\n" - << "% out = " << id << "_f(params, y)\n" - << "% where\n" - << "% out is a (" << model.getAtoms().ny() << ",1) column vector of the residuals\n" - << "% of the static system\n"; - write_common1_preamble(os); - os << "function out = " << id << "_f(params, y)\n"; - write_common2_preamble(os); -} - -void -MatlabSSWriter::write_der1_preamble(std::ostream &os) const -{ - os << "% Usage:\n" - << "% out = " << id << "_ff(params, y)\n" - << "% where\n" - << "% out is a (" << model.getAtoms().ny() << "," << model.getAtoms().ny() << ") matrix of the first order\n" - << "% derivatives of the static system residuals\n" - << "% columns correspond to endo variables in\n" - << "% the ordering as declared\n"; - write_common1_preamble(os); - os << "function out = " << id << "_ff(params, y)\n"; - write_common2_preamble(os); -} - -void -MatlabSSWriter::write_common1_preamble(std::ostream &os) const -{ - os << "% params is a (" << model.getAtoms().np() << ",1) vector of parameter values\n" - << "% in the ordering as declared\n" - << "% y is a (" << model.getAtoms().ny() << ",1) vector of endogenous variables\n" - << "% in the ordering as declared\n" - << "%\n" - << "% Created by Dynare++ v. " << VERSION << "\n"; - // write ordering of parameters - os << "\n% params ordering\n% =====================\n"; - for (auto parname : model.getAtoms().get_params()) - os << "% " << parname << "\n"; - - // write endogenous variables - os << "%\n% y ordering\n% =====================\n"; - for (auto endoname : model.getAtoms().get_endovars()) - os << "% " << endoname << "\n"; - os << "\n"; -} - -void -MatlabSSWriter::write_common2_preamble(std::ostream &os) const -{ - os << "if size(y) ~= [" << model.getAtoms().ny() << ",1]\n" - << "\terror('Wrong size of y, must be [" << model.getAtoms().ny() << ",1]');\nend\n" - << "if size(params) ~= [" << model.getAtoms().np() << ",1]\n" - << "\terror('Wrong size of params, must be [" << model.getAtoms().np() << ",1]');\nend\n\n"; -} - -void -MatlabSSWriter::write_atom_assignment(std::ostream &os) const -{ - // write OperationTree::num_constants - os << "% hardwired constants\n"; - ogp::EvalTree etree(model.getParser().getTree(), ogp::OperationTree::num_constants-1); - for (int i = 0; i < ogp::OperationTree::num_constants; i++) - { - format_nulary(i, os); - double g = etree.eval(i); - if (std::isnan(g)) - os << " = NaN;\n"; - else - os << " = " << std::defaultfloat << std::setprecision(8) << etree.eval(i) << ";\n"; - } - // write numerical constants - os << "% numerical constants\n"; - const ogp::Constants::Tconstantmap &cmap = model.getAtoms().get_constantmap(); - for (auto it : cmap) - { - format_nulary(it.first, os); - os << " = " << std::defaultfloat << std::setprecision(8) << it.second << ";\n"; - } - // write parameters - os << "% parameter values\n"; - for (unsigned int ip = 0; ip < model.getAtoms().get_params().size(); ip++) - { - const string &parname = model.getAtoms().get_params()[ip]; - int t = model.getAtoms().index(parname, 0); - if (t == -1) - os << "% " << parname << " not used in the model\n"; - else - { - format_nulary(t, os); - os << " = params(" << ip+1 << "); % " << parname << "\n"; - } - } - // write exogenous variables - os << "% exogenous variables to zeros\n"; - for (unsigned int ie = 0; ie < model.getAtoms().get_exovars().size(); ie++) - { - const string &exoname = model.getAtoms().get_exovars()[ie]; - try - { - const ogp::DynamicAtoms::Tlagmap &lmap = model.getAtoms().lagmap(exoname); - for (auto it : lmap) - { - format_nulary(it.second, os); - os << " = 0.0; % " << exoname << "\n"; - } - } - catch (const ogu::Exception &e) - { - // ignore the error of not found variable in the tree - } - } - // write endogenous variables - os << "% endogenous variables to y\n"; - for (unsigned int ie = 0; ie < model.getAtoms().get_endovars().size(); ie++) - { - const string &endoname = model.getAtoms().get_endovars()[ie]; - const ogp::DynamicAtoms::Tlagmap &lmap = model.getAtoms().lagmap(endoname); - for (auto it : lmap) - { - format_nulary(it.second, os); - os << " = y(" << ie+1 << "); % " << endoname << "\n"; - } - } - os << "\n"; -} - -void -MatlabSSWriter::write_der0_assignment(std::ostream &os) const -{ - - // initialize out variable - os << "% setting the output variable\n" - << "out = zeros(" << model.getParser().nformulas() << ", 1);\n"; - - // fill out with the terms - for (int i = 0; i < model.getParser().nformulas(); i++) - { - os << "out(" << i+1 << ") = "; - format_term(model.getParser().formula(i), os); - os << ";\n"; - } -} - -void -MatlabSSWriter::write_der1_assignment(std::ostream &os) const -{ - // initialize out variable - os << "% setting the output variable\n"; - os << "out = zeros(" << model.getParser().nformulas() << ", " << model.getAtoms().ny() << ");\n"; - - // fill out with the terms - const vector &variables = model.getAtoms().variables(); - const vector &eam = model.getAtoms().get_endo_atoms_map(); - for (int i = 0; i < model.getParser().nformulas(); i++) - { - const ogp::FormulaDerivatives &fder = model.getParser().derivatives(i); - for (int j : eam) - { - int tvar = variables[j]; - const string &name = model.getAtoms().name(tvar); - int yi = model.getAtoms().name2outer_endo(name); - int t = fder.derivative(ogp::FoldMultiIndex(variables.size(), 1, j)); - if (t != ogp::OperationTree::zero) - { - os << "out(" << i+1 << "," << yi+1 << ") = out("<< i+1 << "," << yi+1 << ") + "; - format_term(t, os); - os << "; % " << name << "(" << model.getAtoms().lead(tvar) << ")\n"; - } - } - } -} - -void -MatlabSSWriter::format_term(int t, std::ostream &os) const -{ - os << 't' << t; -} - -void -MatlabSSWriter::format_nulary(int t, std::ostream &os) const -{ - os << 'a' << t; -} - -void -DebugOperationFormatter::format_nulary(int t, std::ostream &os) const -{ - const DynareDynamicAtoms &a = model.getAtoms(); - - if (t == ogp::OperationTree::zero) - os << '0'; - else if (t == ogp::OperationTree::one) - os << '1'; - else if (t == ogp::OperationTree::nan) - os << "NaN"; - else if (t == ogp::OperationTree::two_over_pi) - os << "2/sqrt(PI)"; - else if (a.is_constant(t)) - os << a.get_constant_value(t); - else - { - int ll = a.lead(t); - const std::string &name = a.name(t); - if (ll == 0) - os << name; - else - os << name << '(' << ll << ')'; - } -} diff --git a/dynare++/src/dynare_model.hh b/dynare++/src/dynare_model.hh deleted file mode 100644 index a4498d9de..000000000 --- a/dynare++/src/dynare_model.hh +++ /dev/null @@ -1,463 +0,0 @@ -/* - * Copyright © 2005-2011 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef OGDYN_DYNARE_MODEL -#define OGDYN_DYNARE_MODEL - -#include "parser/cc/matrix_parser.hh" -#include "parser/cc/atom_assignings.hh" - -#include "dynare_atoms.hh" -#include "twod_matrix.hh" -#include "planner_builder.hh" -#include "forw_subst_builder.hh" - -#include "Vector.hh" -#include "GeneralMatrix.hh" - -#include -#include -#include -#include -#include - -namespace ogdyn -{ - using std::unordered_set; - using std::map; - - /* This represents an interval in a string by the pair of positions - (including the first, excluding the second). A position is given by the - line and the column within the line (both starting from 1). */ - struct PosInterval - { - int fl; - int fc; - int ll; - int lc; - PosInterval() = default; - PosInterval(int ifl, int ifc, int ill, int ilc) - : fl(ifl), fc(ifc), ll(ill), lc(ilc) - { - } - PosInterval &operator=(const PosInterval &pi) = default; - /* Debug print. */ - void - print() const - { - std::cout << "fl=" << fl << " fc=" << fc << " ll=" << ll << " lc=" << lc << '\n'; - } - }; - - /* This class is basically a GeneralMatrix but is created from parsed matrix - data. */ - class ParsedMatrix : public TwoDMatrix - { - public: - /* Construct the object from the parsed data of ogp::MatrixParser. */ - ParsedMatrix(const ogp::MatrixParser &mp); - }; - - class PlannerBuilder; - class PlannerInfo; - class ForwSubstBuilder; - class ForwSubstInfo; - class MultInitSS; - class ModelSSWriter; - - /* A subclass is responsible for creating param_vals, init_vals, and - vcov_mat. */ - class DynareModel - { - friend class PlannerBuilder; - friend class ForwSubstBuilder; - friend class MultInitSS; - friend class ModelSSWriter; - protected: - /* All atoms for whole model. */ - DynareDynamicAtoms atoms; - /* Parsed model equations. */ - ogp::FormulaParser eqs; - /* Order of approximation. */ - int order{-1}; - /* A vector of parameters values created by a subclass. It is stored with - natural ordering (outer) of the parameters given by atoms. */ - std::unique_ptr param_vals; - /* A vector of initial values created by a subclass. It is stored with - internal ordering given by atoms. */ - std::unique_ptr init_vals; - /* A matrix for vcov. It is created by a subclass. */ - std::unique_ptr vcov_mat; - /* Tree index of the planner objective. If there was no planner objective - keyword, the value is set to −1. */ - int t_plobjective{-1}; - /* Tree index of the planner discount. If there was no planner discount - keyword, the value is set to −1. */ - int t_pldiscount{-1}; - /* Pointer to PlannerBuilder, which is created only if the planner's FOC - are added to the model. */ - std::unique_ptr pbuilder; - /* Pointer to an object which builds auxiliary variables and equations to - rewrite a model containing multiple leads to an equivalent model having - only +1 leads. */ - std::unique_ptr fbuilder; - /* Pointer to AtomSubstitutions which are created when the atoms are being - substituted because of multiple lags etc. It uses also an old copy of - atoms, which is created. */ - std::unique_ptr atom_substs; - /* Pointer to a copy of original atoms before substitutions took place. */ - std::unique_ptr old_atoms; - public: - /* Initializes the object to an empty state. */ - DynareModel(); - /* Construct a new deep copy. */ - DynareModel(const DynareModel &dm); - virtual ~DynareModel() = default; - virtual std::unique_ptr clone() const = 0; - const DynareDynamicAtoms & - getAtoms() const - { - return atoms; - } - const ogp::FormulaParser & - getParser() const - { - return eqs; - } - int - getOrder() const - { - return order; - } - /* Return the vector of parameter values. */ - const Vector & - getParams() const - { - return *param_vals; - } - Vector & - getParams() - { - return *param_vals; - } - /* Return the vector of initial values of endo variables. */ - const Vector & - getInit() const - { - return *init_vals; - } - Vector & - getInit() - { - return *init_vals; - } - /* Return the vcov matrix. */ - const TwoDMatrix & - getVcov() const - { - return *vcov_mat; - } - TwoDMatrix & - getVcov() - { - return *vcov_mat; - } - /* Return planner info. */ - const PlannerInfo *get_planner_info() const; - /* Return forward substitutions info. */ - const ForwSubstInfo *get_forw_subst_info() const; - /* Return substitutions info. */ - const ogp::SubstInfo *get_subst_info() const; - /* This sets initial values given in outer ordering. */ - void setInitOuter(const Vector &x); - /* This returns true if the given term is a function of hardwired - constants, numerical constants and parameters. */ - bool is_constant_term(int t) const; - /* Debug print. */ - void print() const; - /* Dump the model to the output stream. This includes variable - declarations, parameter values, model code, initval, vcov and order. */ - void dump_model(std::ostream &os) const; - protected: - /* Adds a name of endogenous, exogenous or a parameter. The sort is - governed by the flag. See dynglob.yy for values of the flag. This is - used by a subclass when declaring the names. */ - void add_name(std::string name, int flag); - /* This checks the model consistency. Thus includes: number of endo - variables and number of equations, min and max lag of endogenous - variables and occurrrences of exogenous variables. It throws an - exception, if there is a problem. */ - void check_model() const; - /* This shifts the given variable identified by the tree index in time. So - if the given tree index represents a(+3) and the tshift is −4, the - method returns tree index of the a(-1). If a(-1) doesn't exist, it is - added to the tree. If it exists, its tree index is returned. If the tree - index doesn't correspond to an endogenous nor exogenous variable, an - exception is thrown. */ - int variable_shift(int t, int tshift); - /* For the given set of atoms identified by tree indices and given time - shift, this method returns a map mapping each variable in the given set - to its time shifted variable. The map is passed through the reference - and is cleared in the beginning. */ - void variable_shift_map(const unordered_set &a_set, int tshift, - map &s_map); - /* This returns maximum lead and minimum lag of an endogenous or exogenous - variable in the given term. If there are no endo or exo variables, than - it returns the least integer as max lead and the greatest integer as min - lag. */ - void termspan(int t, int &mlead, int &mlag) const; - /* This function returns a set of non-linear subterms of the given term, - these are terms whose linear combination constitutes the given term. */ - unordered_set get_nonlinear_subterms(int t) const; - /* This method assigns already used tree index of some term to the not-yet - used atom name with the given lead/lag. In this way, all occurrences of - term t are substituted with the atom name(ll). The method handles also - rewriting operation tree including derivatives of the term t. */ - void substitute_atom_for_term(const string &name, int ll, int t); - /* This performs a final job after the model is parsed. It creates the - PlannerBuilder object if the planner's FOC are needed, then it creates - ForwSubstBuilder handling multiple leads and finally it creates the - substitution object saving old atoms and performs the substitutions. */ - void final_job(); - }; - - /* This class constructs DynareModel from dynare++ model file. It parses - variable declarations, model equations, parameter assignments, initval - assignments, vcov matrix and order of approximation. */ - class DynareParser : public DynareModel - { - protected: - /* Static atoms for parameter assignments. */ - DynareStaticAtoms pa_atoms; - /* Assignments for the parameters. */ - ogp::AtomAssignings paramset; - /* Static atoms for initval assignments. */ - DynareStaticAtoms ia_atoms; - /* Assignments for the initval. */ - ogp::AtomAssignings initval; - /* Matrix parser for vcov. */ - ogp::MatrixParser vcov; - public: - /* This, in fact, creates DynareModel from the given string of the given - length corresponding to the Dynare++ model file. If the given ord is not - −1, then it overrides setting in the model file. */ - DynareParser(const string &str, int ord); - DynareParser(const DynareParser &dp); - std::unique_ptr - clone() const override - { - return std::make_unique(*this); - } - /* Adds a name of endogenous, exogenous or a parameter. This addss the name - to the parent class DynareModel and also registers the name to either - paramset, or initval. */ - void add_name(string name, int flag); - /* Sets position of the model section. Called from dynglob.yy. */ - void - set_model_pos(int off1, int off2) - { - model_beg = off1; - model_end = off2; - } - /* Sets position of the section setting parameters. Called from - dynglob.yy. */ - void - set_paramset_pos(int off1, int off2) - { - paramset_beg = off1; - paramset_end = off2; - } - /* Sets position of the initval section. Called from dynglob.yy. */ - void - set_initval_pos(int off1, int off2) - { - initval_beg = off1; - initval_end = off2; - } - /* Sets position of the vcov section. Called from dynglob.yy. */ - void - set_vcov_pos(int off1, int off2) - { - vcov_beg = off1; - vcov_end = off2; - } - /* Parser the given string as integer and set to as the order. */ - void - set_order_pos(int off1, int off2) - { - order_beg = off1; - order_end = off2; - } - /* Sets position of the planner_objective section. Called from - dynglob.yy. */ - void - set_pl_objective_pos(int off1, int off2) - { - plobjective_beg = off1; - plobjective_end = off2; - } - /* Sets position of the planner_discount section. Called from - dynglob.yy. */ - void - set_pl_discount_pos(int off1, int off2) - { - pldiscount_beg = off1; - pldiscount_end = off2; - } - /* Processes a syntax error from bison. */ - void error(string mes); - /* Debug print. */ - void print() const; - protected: - void parse_glob(const string &stream); - int parse_order(const string &stream); - int parse_pldiscount(const string &stream); - /* Evaluate paramset assignings and set param_vals. */ - void calc_params(); - /* Evaluate initval assignings and set init_vals. */ - void calc_init(); - /* Do the final job. This includes building the planner problem (if any) - and substituting for multiple lags, and one period leads of exogenous - variables, and calculating initial guess of lagrange multipliers in the - social planner problem. Precondtion: everything parsed and calculated - parameters, postcondition: calculated initvals vector and - parsing_finished for expanded vectors. */ - void final_job(); - private: - int model_beg, model_end; - int paramset_beg, paramset_end; - int initval_beg, initval_end; - int vcov_beg, vcov_end; - int order_beg, order_end; - int plobjective_beg, plobjective_end; - int pldiscount_beg, pldiscount_end; - }; - - /* Semiparsed model. The equations are given by a string, everything other by - C++ objects. The initial values are set manually after the creation of - this object. This implies that no automatic substitutions cannot be done - here, which in turn implies that we cannot do here a social planner nor - substitutions of multiple lags. */ - class DynareSPModel : public DynareModel - { - public: - DynareSPModel(const std::vector &endo, - const std::vector &exo, - const std::vector &par, - const string &equations, int ord); - DynareSPModel(const DynareSPModel &dm) = default; - ~DynareSPModel() override = default; - std::unique_ptr - clone() const override - { - return std::make_unique(*this); - } - }; - - /* This class implements a selector of operations which correspond to - non-linear functions. This inherits from ogp::opselector and is used to - calculate non-linear subterms in DynareModel::get_nonlinear_subterms(). */ - class NLSelector : public ogp::opselector - { - private: - const DynareModel &model; - public: - NLSelector(const DynareModel &m) : model(m) - { - } - bool operator()(int t) const override; - }; - - /* This class writes a mathematical code evaluating the system of equations - and the first derivatives at zero shocks and at the given (static) state. - Static means that lags and leads are ignored. */ - class ModelSSWriter : public ogp::DefaultOperationFormatter - { - protected: - const DynareModel &model; - public: - ModelSSWriter(const DynareModel &m) - : DefaultOperationFormatter(m.eqs.getTree()), - model(m) - { - } - /* This writes the evaluation of the system. It calls pure virtual methods - for writing a preamble, then assignment of atoms, and then assignment - for resulting object. These are language dependent and are implemented - in the subclass. */ - void write_der0(std::ostream &os); - /* This writes the evaluation of the first order derivative of the system. - It calls pure virtual methods for writing a preamble, assignment, and - assignemnt of the resulting objects. */ - void write_der1(std::ostream &os); - protected: - virtual void write_der0_preamble(std::ostream &os) const = 0; - virtual void write_der1_preamble(std::ostream &os) const = 0; - virtual void write_atom_assignment(std::ostream &os) const = 0; - virtual void write_der0_assignment(std::ostream &os) const = 0; - virtual void write_der1_assignment(std::ostream &os) const = 0; - }; - - class MatlabSSWriter : public ModelSSWriter - { - protected: - /* Identifier used in function names. */ - std::string id; - public: - MatlabSSWriter(const DynareModel &dm, std::string id_arg); - protected: - // from ModelSSWriter - void write_der0_preamble(std::ostream &os) const override; - void write_der1_preamble(std::ostream &os) const override; - /* This writes atom assignments. We have four kinds of atoms set here: - endogenous vars coming from one parameter, parameter values given by the - second parameter, constants, and the OperationTree::num_constants - hardwired constants in ogp::OperationTree. */ - void write_atom_assignment(std::ostream &os) const override; - void write_der0_assignment(std::ostream &os) const override; - void write_der1_assignment(std::ostream &os) const override; - /* This prints t10 for t=10. */ - void format_term(int t, std::ostream &os) const override; - /* This prints a10 for t=10. The atoms a10 are supposed to be set by - write_atom_assignments(). */ - void format_nulary(int t, std::ostream &os) const override; - private: - void write_common1_preamble(std::ostream &os) const; - void write_common2_preamble(std::ostream &os) const; - }; - - /* This class implements OperationFormatter for debugging purposes. It - renders atoms in a more friendly way than the - ogp::DefaulOperationFormatter. */ - class DebugOperationFormatter : public ogp::DefaultOperationFormatter - { - protected: - const DynareModel &model; - public: - DebugOperationFormatter(const DynareModel &m) - : DefaultOperationFormatter(m.getParser().getTree()), - model(m) - { - } - void format_nulary(int t, std::ostream &os) const override; - }; -}; - -#endif diff --git a/dynare++/src/dynare_params.cc b/dynare++/src/dynare_params.cc deleted file mode 100644 index 3679ecf38..000000000 --- a/dynare++/src/dynare_params.cc +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright © 2004-2011 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "dynare_params.hh" - -#include "sthread.hh" - -#include -#include -#include - -DynareParams::DynareParams(int argc, char **argv) - : num_per(100), num_burn(0), num_sim(80), - num_rtper(0), num_rtsim(0), - num_condper(0), num_condsim(0), - num_threads(sthread::default_threads_number()), num_steps(0), - prefix("dyn"), seed(934098), order(-1), ss_tol(1.e-13), - check_along_path(false), check_along_shocks(false), - check_on_ellipse(false), check_evals(1000), check_num(10), check_scale(2.0), - do_irfs_all(true), do_centralize(true), qz_criterium(1.0+1e-6), - help(false), version(false) -{ - using namespace std::string_literals; - if (argc == 1 || argv[1] == "--help"s) - { - help = true; - return; - } - if (argc == 1 || argv[1] == "--version"s) - { - version = true; - return; - } - - modname = argv[argc-1]; - argc--; - - struct option const opts[] = - { - {"periods", required_argument, nullptr, static_cast(opt::per)}, - {"per", required_argument, nullptr, static_cast(opt::per)}, - {"burn", required_argument, nullptr, static_cast(opt::burn)}, - {"simulations", required_argument, nullptr, static_cast(opt::sim)}, - {"sim", required_argument, nullptr, static_cast(opt::sim)}, - {"rtperiods", required_argument, nullptr, static_cast(opt::rtper)}, - {"rtper", required_argument, nullptr, static_cast(opt::rtper)}, - {"rtsimulations", required_argument, nullptr, static_cast(opt::rtsim)}, - {"rtsim", required_argument, nullptr, static_cast(opt::rtsim)}, - {"condperiods", required_argument, nullptr, static_cast(opt::condper)}, - {"condper", required_argument, nullptr, static_cast(opt::condper)}, - {"condsimulations", required_argument, nullptr, static_cast(opt::condsim)}, - {"condsim", required_argument, nullptr, static_cast(opt::condsim)}, - {"prefix", required_argument, nullptr, static_cast(opt::prefix)}, - {"threads", required_argument, nullptr, static_cast(opt::threads)}, - {"steps", required_argument, nullptr, static_cast(opt::steps)}, - {"seed", required_argument, nullptr, static_cast(opt::seed)}, - {"order", required_argument, nullptr, static_cast(opt::order)}, - {"ss-tol", required_argument, nullptr, static_cast(opt::ss_tol)}, - {"check", required_argument, nullptr, static_cast(opt::check)}, - {"check-scale", required_argument, nullptr, static_cast(opt::check_scale)}, - {"check-evals", required_argument, nullptr, static_cast(opt::check_evals)}, - {"check-num", required_argument, nullptr, static_cast(opt::check_num)}, - {"qz-criterium", required_argument, nullptr, static_cast(opt::qz_criterium)}, - {"no-irfs", no_argument, nullptr, static_cast(opt::noirfs)}, - {"irfs", no_argument, nullptr, static_cast(opt::irfs)}, - {"centralize", no_argument, nullptr, static_cast(opt::centralize)}, - {"no-centralize", no_argument, nullptr, static_cast(opt::no_centralize)}, - {"help", no_argument, nullptr, static_cast(opt::help)}, - {"version", no_argument, nullptr, static_cast(opt::version)}, - {nullptr, 0, nullptr, 0} - }; - - int ret; - int index; - while (-1 != (ret = getopt_long(argc, argv, "", opts, &index))) - { - if (ret == '?') - { - std::cerr << "Unknown option, ignored\n"; - continue; - } - - try - { - switch (static_cast(ret)) - { - case opt::per: - num_per = std::stoi(optarg); - break; - case opt::burn: - num_burn = std::stoi(optarg); - break; - case opt::sim: - num_sim = std::stoi(optarg); - break; - case opt::rtper: - num_rtper = std::stoi(optarg); - break; - case opt::rtsim: - num_rtsim = std::stoi(optarg); - break; - case opt::condper: - num_condper = std::stoi(optarg); - break; - case opt::condsim: - num_condsim = std::stoi(optarg); - break; - case opt::prefix: - prefix = optarg; - break; - case opt::threads: - num_threads = std::stoi(optarg); - break; - case opt::steps: - num_steps = std::stoi(optarg); - break; - case opt::seed: - seed = std::stoi(optarg); - break; - case opt::order: - order = std::stoi(optarg); - break; - case opt::ss_tol: - ss_tol = std::stod(optarg); - break; - case opt::check: - processCheckFlags(optarg); - break; - case opt::check_scale: - check_scale = std::stod(optarg); - break; - case opt::check_evals: - check_evals = std::stoi(optarg); - break; - case opt::check_num: - check_num = std::stoi(optarg); - break; - case opt::noirfs: - irf_list.clear(); - do_irfs_all = false; - break; - case opt::irfs: - processIRFList(argc, argv); - if (irf_list.empty()) - do_irfs_all = true; - else - do_irfs_all = false; - break; - case opt::centralize: - do_centralize = true; - break; - case opt::no_centralize: - do_centralize = false; - break; - case opt::qz_criterium: - qz_criterium = std::stod(optarg); - break; - case opt::help: - help = true; - break; - case opt::version: - version = true; - break; - } - } - catch (std::invalid_argument &) - { - std::cerr << "Couldn't parse option " << optarg << ", ignored\n"; - } - catch (std::out_of_range &) - { - std::cerr << "Out-of-range value " << optarg << ", ignored\n"; - } - } - - // make basename (get rid of the directory and the extension) - basename = modname; - auto pos = basename.find_last_of(R"(/\)"); - if (pos != std::string::npos) - basename = basename.substr(pos+1); - pos = basename.find_last_of('.'); - if (pos != std::string::npos) - basename.erase(pos); -} - -void -DynareParams::printHelp() const -{ - std::cout << "usage: dynare++ [--help] [--version] [options] \n" - "\n" - " --help print this message and return\n" - " --version print version and return\n" - "\n" - "options:\n" - " --per number of periods simulated after burnt [100]\n" - " --burn number of periods burnt [0]\n" - " --sim number of simulations [80]\n" - " --rtper number of RT periods simulated after burnt [0]\n" - " --rtsim number of RT simulations [0]\n" - " --condper number of periods in cond. simulations [0]\n" - " --condsim number of conditional simulations [0]\n" - " --steps steps towards stoch. SS [0=deter.]\n" - " --centralize centralize the rule [do centralize]\n" - " --no-centralize do not centralize the rule [do centralize]\n" - " --prefix prefix of variables in Mat-4 file [\"dyn\"]\n" - " --seed random number generator seed [934098]\n" - " --order order of approximation [no default]\n" - " --threads number of max parallel threads [1/2 * nb. of logical CPUs]\n" - " --ss-tol steady state calcs tolerance [1.e-13]\n" - " --check pesPES check model residuals [no checks]\n" - " lower/upper case switches off/on\n" - " pP checking along simulation path\n" - " eE checking on ellipse\n" - " sS checking along shocks\n" - " --check-evals max number of evals per residual [1000]\n" - " --check-num number of checked points [10]\n" - " --check-scale scaling of checked points [2.0]\n" - " --no-irfs shuts down IRF simulations [do IRFs]\n" - " --irfs performs IRF simulations [do IRFs]\n" - " --qz-criterium threshold for stable eigenvalues [1.000001]\n" - "\n\n"; -} - -void -DynareParams::processCheckFlags(const std::string &flags) -{ - for (char c : flags) - switch (c) - { - case 'p': - check_along_path = false; - break; - case 'P': - check_along_path = true; - break; - case 'e': - check_on_ellipse = false; - break; - case 'E': - check_on_ellipse = true; - break; - case 's': - check_along_shocks = false; - break; - case 'S': - check_along_shocks = true; - break; - default: - std::cerr << "Unknown check type selection character <" << c << ">, ignored.\n"; - } -} - -void -DynareParams::processIRFList(int argc, char **argv) -{ - irf_list.clear(); - while (optind < argc && *(argv[optind]) != '-') - { - irf_list.push_back(argv[optind]); - optind++; - } -} diff --git a/dynare++/src/dynare_params.hh b/dynare++/src/dynare_params.hh deleted file mode 100644 index 91363356e..000000000 --- a/dynare++/src/dynare_params.hh +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright © 2004 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -/* - along shocks: m mult max_evals - ellipse: m mult max_evals (10·m) (0.5·mult) - simul: m max_evals (10·m) - - --check-scale 2.0 --check-evals 1000 --check-num 10 --check PES -*/ - -#include -#include - -struct DynareParams -{ - std::string modname; - std::string basename; - int num_per; - int num_burn; - int num_sim; - int num_rtper; - int num_rtsim; - int num_condper; - int num_condsim; - int num_threads; - int num_steps; - std::string prefix; - int seed; - int order; - /* Tolerance used for steady state calcs. */ - double ss_tol; - bool check_along_path; - bool check_along_shocks; - bool check_on_ellipse; - int check_evals; - int check_num; - double check_scale; - /* Flag for doing IRFs even if the irf_list is empty. */ - bool do_irfs_all; - /* List of shocks for which IRF will be calculated. */ - std::vector irf_list; - bool do_centralize; - double qz_criterium; - bool help; - bool version; - DynareParams(int argc, char **argv); - void printHelp() const; - int - getCheckShockPoints() const - { - return check_num; - } - double - getCheckShockScale() const - { - return check_scale; - } - int - getCheckEllipsePoints() const - { - return 10*check_num; - } - double - getCheckEllipseScale() const - { - return 0.5*check_scale; - } - int - getCheckPathPoints() const - { - return 10*check_num; - } -private: - enum class opt { per, burn, sim, rtper, rtsim, condper, condsim, - prefix, threads, - steps, seed, order, ss_tol, check, - check_evals, check_scale, check_num, noirfs, irfs, - help, version, centralize, no_centralize, qz_criterium }; - void processCheckFlags(const std::string &flags); - /* This gathers strings from argv[optind] and on not starting with '-' to the - irf_list. It stops one item before the end, since this is the model - file. */ - void processIRFList(int argc, char **argv); -}; diff --git a/dynare++/src/dynglob.ll b/dynare++/src/dynglob.ll deleted file mode 100644 index cbb0341b9..000000000 --- a/dynare++/src/dynglob.ll +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- C++ -*- */ -/* - * Copyright © 2004-2011 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ -%{ -#include "parser/cc/location.hh" -#include "dynglob_tab.hh" - -#define YY_USER_ACTION SET_LLOC(dynglob_); -%} - -%option nounput -%option noyy_top_state -%option stack -%option yylineno -%option prefix="dynglob_" -%option never-interactive -%x CMT - -%% - - /* comments */ -<*>"/*" {yy_push_state(CMT);} -[^*\n]* -"*"+[^*/\n]* -"*"+"/" {yy_pop_state();} -[\n] -"//".*\n - - /* initial spaces or tabs are ignored */ - -[ \t\r\n\0] -var {return VAR;} -varexo {return VAREXO;} -parameters {return PARAMETERS;} -model {return MODEL;} -end {return END;} -initval {return INITVAL;} -order {return ORDER;} -vcov {return VCOV;} -planner_objective {return PLANNEROBJECTIVE;} -planner_discount {return PLANNERDISCOUNT;} - - /* names */ -[A-Za-z_][A-Za-z0-9_]* { - dynglob_lval.string = dynglob_text; - return NAME; -} - -; {return SEMICOLON;} -, {return COMMA;} -= {return EQUAL_SIGN;} -\[ {return LEFT_BRACKET;} -\] {return RIGHT_BRACKET;} -. { - dynglob_lval.character = dynglob_text[0]; - return CHARACTER; -} - -%% - -int -dynglob_wrap() -{ - return 1; -} - -void -dynglob__destroy_buffer(void* p) -{ - dynglob__delete_buffer(static_cast(p)); -} diff --git a/dynare++/src/dynglob.yy b/dynare++/src/dynglob.yy deleted file mode 100644 index dac74dc8c..000000000 --- a/dynare++/src/dynglob.yy +++ /dev/null @@ -1,135 +0,0 @@ -// -*- C++ -*- -/* - * Copyright © 2006-2011 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -%code requires -{ -#include "parser/cc/location.hh" -#define DYNGLOB_LTYPE ogp::location_type -} - -%code -{ -#include - -#include "dynare_model.hh" - -void dynglob_error(std::string); -int dynglob_lex(); -extern ogdyn::DynareParser* dynare_parser; -int symblist_flag; -} - -%union -{ - int integer; - char *string; - char character; -} - -%token END INITVAL MODEL PARAMETERS VAR VAREXO SEMICOLON COMMA EQUAL_SIGN CHARACTER -%token VCOV LEFT_BRACKET RIGHT_BRACKET ORDER PLANNEROBJECTIVE PLANNERDISCOUNT -%token NAME; - -%define api.prefix {dynglob_} - -%locations -%defines -%define parse.error verbose - -%% - -dynare_file : preamble paramset model rest { - dynare_parser->set_paramset_pos(@2.off, @3.off);} - | preamble model rest { - dynare_parser->set_paramset_pos(0, 0);} - | preamble paramset planner model rest { - dynare_parser->set_paramset_pos(@2.off, @3.off);} - ; - -preamble : preamble preamble_statement | preamble_statement; - -preamble_statement : var | varexo | parameters; - -var : VAR {symblist_flag=1;} symblist SEMICOLON; - -varexo : VAREXO {symblist_flag=2;} symblist SEMICOLON; - -parameters : PARAMETERS {symblist_flag=3;} symblist SEMICOLON; - - -symblist : symblist NAME {dynare_parser->add_name($2,symblist_flag);} - | symblist COMMA NAME {dynare_parser->add_name($3,symblist_flag);} - | NAME {dynare_parser->add_name($1,symblist_flag);} - ; - -paramset : recnameset; - -recnameset : recnameset onenameset | onenameset; - -onenameset : NAME EQUAL_SIGN material SEMICOLON; - -material : material CHARACTER | material NAME | NAME | CHARACTER; - -model : MODEL SEMICOLON equations END SEMICOLON { - dynare_parser->set_model_pos(@3.off, @4.off); -}; - -equations : equations equation | equation; - -equation : material EQUAL_SIGN material SEMICOLON | material SEMICOLON; - -rest : rest_statement | rest rest_statement; - -rest_statement : initval | vcov | order | planner; - -initval : INITVAL SEMICOLON recnameset END SEMICOLON { - dynare_parser->set_initval_pos(@3.off, @4.off); -}; - -vcov : VCOV EQUAL_SIGN LEFT_BRACKET m_material RIGHT_BRACKET SEMICOLON { - dynare_parser->set_vcov_pos(@4.off, @5.off); -}; - -m_material : m_material CHARACTER | m_material NAME | m_material SEMICOLON | m_material COMMA | CHARACTER | NAME | SEMICOLON | COMMA; - -order : ORDER EQUAL_SIGN material SEMICOLON { - dynare_parser->set_order_pos(@3.off, @4.off); -}; - -planner : planner_objective planner_discount - | planner_discount planner_objective -; - -planner_objective : PLANNEROBJECTIVE material SEMICOLON { - dynare_parser->set_pl_objective_pos(@2.off, @3.off); -}; - -planner_discount : PLANNERDISCOUNT NAME SEMICOLON { - dynare_parser->set_pl_discount_pos(@2.off, @3.off); -}; - -%% - -void -dynglob_error(std::string mes) -{ - dynare_parser->error(mes); -} diff --git a/dynare++/src/forw_subst_builder.cc b/dynare++/src/forw_subst_builder.cc deleted file mode 100644 index 08ebd8a1e..000000000 --- a/dynare++/src/forw_subst_builder.cc +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright © 2006-2011 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "forw_subst_builder.hh" - -#include "dynare_model.hh" - -using namespace ogdyn; - -ForwSubstBuilder::ForwSubstBuilder(DynareModel &m) - : model(m) -{ - info.num_new_terms -= model.getParser().getTree().get_num_op(); - - // go through all equations - int neq = model.eqs.nformulas(); - for (int i = 0; i < neq; i++) - { - int ft = model.eqs.formula(i); - int mlead, mlag; - model.termspan(ft, mlead, mlag); - // if equation is too forward looking - if (mlead > 1) - { - info.num_affected_equations++; - // break it to non-linear terms - unordered_set nlt = model.get_nonlinear_subterms(ft); - int j = 0; // indexes subterms - // and make substitutions for all these non-linear subterms - for (const auto &it : nlt) - substitute_for_term(it, i, j++); - } - } - // unassign all variables with lead greater than 1 - unassign_gt_1_leads(); - - /* Forget the derivatives in the tree because some variables could have been - unassigned */ - model.eqs.getTree().forget_derivative_maps(); - - info.num_new_terms += model.getParser().getTree().get_num_op(); -} - -void -ForwSubstBuilder::substitute_for_term(int t, int i, int j) -{ - int mlead, mlag; - model.termspan(t, mlead, mlag); - if (mlead > 1) - { - info.num_subst_terms++; - // Example for comments: let t = f(x(+4)) - // first make lagsubst be substitution setting f(x(+4)) to f(x(+1)) - // this is lag = -3 (1-mlead) - map lagsubst; - unordered_set nult = model.eqs.nulary_of_term(t); // make copy of nult! - model.variable_shift_map(nult, 1-mlead, lagsubst); - int lagt = model.eqs.add_substitution(t, lagsubst); - - // now maxlead of lagt is +1 - // add AUXLD_*_*_1 = f(x(+1)) to the model - std::string name = "AUXLD_" + std::to_string(i) + '_' + std::to_string(j) + "_1"; - model.atoms.register_uniq_endo(name); - info.num_aux_variables++; - int auxt = model.eqs.add_nulary(name); - model.eqs.add_formula(model.eqs.add_binary(ogp::code_t::MINUS, auxt, lagt)); - aux_map.emplace(name, lagt); - // now add variables and equations - // AUXLD_*_*_2 = AUXLD_*_*_1(+1) through - // AUXLD_*_*_{mlead-1} = AUXLD_*_*_{mlead-2}(+1) - for (int ll = 1; ll <= mlead-2; ll++) - { - // create AUXLD_*_*_{ll}(+1) - name = "AUXLD_" + std::to_string(i) + '_' + std::to_string(j) + '_' + std::to_string(ll) + "(+1)"; - int lastauxt_lead = model.eqs.add_nulary(name); - // create AUXLD_*_*{ll+1} - name = "AUXLD_" + std::to_string(i) + '_' + std::to_string(j) + '_' + std::to_string(ll+1); - model.atoms.register_uniq_endo(name); - info.num_aux_variables++; - auxt = model.eqs.add_nulary(name); - // add AUXLD_*_*_{ll+1} = AUXLD_*_*_{ll}(+1) - model.eqs.add_formula(model.eqs.add_binary(ogp::code_t::MINUS, auxt, lastauxt_lead)); - /* add substitution to the map; TODO: this works well because in the - context where aux_map is used the timing doesn't matter, however, - it is misleading, needs to be changed */ - aux_map.emplace(name, lagt); - } - - // now we have to substitute AUXLD_*_*{mlead-1}(+1) for t - name = "AUXLD_" + std::to_string(i) + '_' + std::to_string(j) + '_' + std::to_string(mlead-1); - model.substitute_atom_for_term(name, +1, t); - } -} - -void -ForwSubstBuilder::unassign_gt_1_leads(const string &name) -{ - int mlead, mlag; - model.atoms.varspan(name, mlead, mlag); - for (int ll = 2; ll <= mlead; ll++) - { - int t = model.atoms.index(name, ll); - if (t != -1) - model.atoms.unassign_variable(name, ll, t); - } -} - -void -ForwSubstBuilder::unassign_gt_1_leads() -{ - auto &endovars = model.atoms.get_endovars(); - for (const auto &endovar : endovars) - unassign_gt_1_leads(endovar); - auto &exovars = model.atoms.get_exovars(); - for (const auto &exovar : exovars) - unassign_gt_1_leads(exovar); -} - -ForwSubstBuilder::ForwSubstBuilder(const ForwSubstBuilder &b, DynareModel &m) - : model(m) -{ - for (auto it : b.aux_map) - aux_map.insert(it); -} diff --git a/dynare++/src/forw_subst_builder.hh b/dynare++/src/forw_subst_builder.hh deleted file mode 100644 index 7bf12f1e7..000000000 --- a/dynare++/src/forw_subst_builder.hh +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef FORW_SUBST_BUILDER_H -#define FORW_SUBST_BUILDER_H - -#include - -#include "dynare_atoms.hh" - -namespace ogdyn -{ - /* This struct encapsulates information about the process of forward - substitutions. */ - struct ForwSubstInfo - { - int num_affected_equations{0}; - int num_subst_terms{0}; - int num_aux_variables{0}; - int num_new_terms{0}; - }; - - class DynareModel; - - class ForwSubstBuilder - { - using Ttermauxmap = map; - protected: - /* Reference to the model, to which we will add equations and change some - equations. */ - DynareModel &model; - /* A map mapping new auxiliary variables to the terms in the tree in the - DynareModel. */ - Tsubstmap aux_map; - /* Information about the substitutions. */ - ForwSubstInfo info; - public: - /* Do all the jobs needed. This scans all equations in the model, and for - equations containing forward looking variables greater than 1 lead, it - makes corresponding substitutions. Basically, it breaks each equation to - its non-linear components and creates substitutions for these - components, not for whole equation. This is because the expectation - operator can go through the linear part of the function. This will save - us many occurrences of other variables involved in the equation. */ - ForwSubstBuilder(DynareModel &m); - ForwSubstBuilder(const ForwSubstBuilder &b) = delete; - /* Copy constructor with a new instance of the model. */ - ForwSubstBuilder(const ForwSubstBuilder &b, DynareModel &m); - /* Return the auxiliary variable mapping. */ - const Tsubstmap & - get_aux_map() const - { - return aux_map; - } - /* Return the information. */ - const ForwSubstInfo & - get_info() const - { - return info; - } - private: - /* This method takes a nonlinear term t, and if it has leads of greater - than 1, then it substitutes the term for the new variable (or string of - variables). Note that the substitution is done by - DynamicAtoms::assign_variable. This means that the substitution is made - for all other ocurrences of t in the model. So there is no need of - tracking already substituted terms. The other two parameters are just - for identification of the new auxiliary variables. When called from the - constructor, i is an equation number, j is an order of the non-linear - term in the equation. */ - void substitute_for_term(int t, int i, int j); - /* This is called just at the end of the job. It unassigns all nulary terms - with a lead greater than 1. */ - void unassign_gt_1_leads(); - /* This unassigns all leads greater than 1 of the given name. */ - void unassign_gt_1_leads(const string &name); - }; -}; - -#endif diff --git a/dynare++/src/main.cc b/dynare++/src/main.cc deleted file mode 100644 index 3d46230ff..000000000 --- a/dynare++/src/main.cc +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright © 2004-2011 Ondra Kamenik - * Copyright © 2019-2022 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "dynare3.hh" -#include "dynare_exception.hh" -#include "dynare_params.hh" - -#include "utils/cc/exception.hh" -#include "parser/cc/parser_exception.hh" -#include "../sylv/cc/SylvException.hh" -#include "../kord/seed_generator.hh" -#include "../kord/global_check.hh" -#include "../kord/approximation.hh" - -#include -#include -#include - -int -main(int argc, char **argv) -{ - DynareParams params(argc, argv); - if (params.help) - { - params.printHelp(); - return EXIT_SUCCESS; - } - if (params.version) - { - std::cout << "Dynare++ v. " << VERSION << '\n' - << '\n' - << "Copyright © 2004-2011 Ondra Kamenik\n" - << "Copyright © 2019-2020 Dynare Team\n" - << "Dynare++ comes with ABSOLUTELY NO WARRANTY and is distributed under the GNU GPL,\n" - << "version 3 or later (see https://www.gnu.org/licenses/gpl.html)\n"; - return EXIT_SUCCESS; - } - sthread::detach_thread_group::max_parallel_threads = params.num_threads; - - try - { - // make journal - Journal journal(params.basename + ".jnl"); - - // make dynare object - Dynare dynare(params.modname, params.order, params.ss_tol, journal); - // make list of shocks for which we will do IRFs - std::vector irf_list_ind; - if (params.do_irfs_all) - for (int i = 0; i < dynare.nexog(); i++) - irf_list_ind.push_back(i); - else - irf_list_ind = static_cast(dynare.getExogNames()).selectIndices(params.irf_list); - - // write matlab files - std::string mfile1(params.basename + "_f.m"); - std::ofstream mfd{mfile1, std::ios::out | std::ios::trunc}; - if (mfd.fail()) - { - std::cerr << "Couldn't open " << mfile1 << " for writing.\n"; - std::exit(EXIT_FAILURE); - } - ogdyn::MatlabSSWriter writer0(dynare.getModel(), params.basename); - writer0.write_der0(mfd); - mfd.close(); - - std::string mfile2(params.basename + "_ff.m"); - mfd.open(mfile2, std::ios::out | std::ios::trunc); - if (mfd.fail()) - { - std::cerr << "Couldn't open " << mfile2 << " for writing.\n"; - std::exit(EXIT_FAILURE); - } - ogdyn::MatlabSSWriter writer1(dynare.getModel(), params.basename); - writer1.write_der1(mfd); - mfd.close(); - - // open mat file - std::string matfile(params.basename + ".mat"); - mat_t *matfd = Mat_Create(matfile.c_str(), nullptr); - if (!matfd) - { - std::cerr << "Couldn't open " << matfile << " for writing.\n"; - std::exit(EXIT_FAILURE); - } - - // write info about the model (dimensions and variables) - dynare.writeMat(matfd, params.prefix); - // write the dump file corresponding to the input - dynare.writeDump(params.basename); - - seed_generator::set_meta_seed(static_cast(params.seed)); - - TLStatic::init(dynare.order(), - dynare.nstat()+2*dynare.npred()+3*dynare.nboth() - +2*dynare.nforw()+dynare.nexog()); - - Approximation app(dynare, journal, params.num_steps, params.do_centralize, params.qz_criterium); - try - { - app.walkStochSteady(); - } - catch (const KordException &e) - { - // tell about the exception and continue - std::cout << "Caught (not yet fatal) Kord exception: "; - e.print(); - JournalRecord rec(journal); - rec << "Solution routine not finished (" << e.get_message() - << "), see what happens" << endrec; - } - - std::string ss_matrix_name(params.prefix + "_steady_states"); - ConstTwoDMatrix(app.getSS()).writeMat(matfd, ss_matrix_name); - - // check the approximation - if (params.check_along_path || params.check_along_shocks - || params.check_on_ellipse) - { - GlobalChecker gcheck(app, sthread::detach_thread_group::max_parallel_threads, journal); - if (params.check_along_shocks) - gcheck.checkAlongShocksAndSave(matfd, params.prefix, - params.getCheckShockPoints(), - params.getCheckShockScale(), - params.check_evals); - if (params.check_on_ellipse) - gcheck.checkOnEllipseAndSave(matfd, params.prefix, - params.getCheckEllipsePoints(), - params.getCheckEllipseScale(), - params.check_evals); - if (params.check_along_path) - gcheck.checkAlongSimulationAndSave(matfd, params.prefix, - params.getCheckPathPoints(), - params.check_evals); - } - - // write the folded decision rule to the Mat-4 file - app.getFoldDecisionRule().writeMat(matfd, params.prefix); - - // simulate conditional - if (params.num_condper > 0 && params.num_condsim > 0) - { - SimResultsDynamicStats rescond(dynare.numeq(), params.num_condper, 0); - Vector det_ss{app.getSS().getCol(0)}; - rescond.simulate(params.num_condsim, app.getFoldDecisionRule(), det_ss, dynare.getVcov(), journal); - rescond.writeMat(matfd, params.prefix); - } - - // simulate unconditional - //const DecisionRule& dr = app.getUnfoldDecisionRule(); - const DecisionRule &dr = app.getFoldDecisionRule(); - if (params.num_per > 0 && params.num_sim > 0) - { - SimResultsStats res(dynare.numeq(), params.num_per, params.num_burn); - res.simulate(params.num_sim, dr, dynare.getSteady(), dynare.getVcov(), journal); - res.writeMat(matfd, params.prefix); - - // impulse response functions - if (!irf_list_ind.empty()) - { - IRFResults irf(dynare, dr, res, irf_list_ind, journal); - irf.writeMat(matfd, params.prefix); - } - } - - // simulate with real-time statistics - if (params.num_rtper > 0 && params.num_rtsim > 0) - { - RTSimResultsStats rtres(dynare.numeq(), params.num_rtper, params.num_burn); - rtres.simulate(params.num_rtsim, dr, dynare.getSteady(), dynare.getVcov(), journal); - rtres.writeMat(matfd, params.prefix); - } - - Mat_Close(matfd); - } - catch (const KordException &e) - { - std::cout << "Caught Kord exception: "; - e.print(); - return e.code(); - } - catch (const TLException &e) - { - std::cout << "Caught TL exception: "; - e.print(); - return 255; - } - catch (SylvException &e) - { - std::cout << "Caught Sylv exception: "; - e.printMessage(); - return 255; - } - catch (const DynareException &e) - { - std::cout << "Caught Dynare exception: " << e.message() << '\n'; - return 255; - } - catch (const ogu::Exception &e) - { - std::cout << "Caught ogu::Exception: "; - e.print(); - return 255; - } - catch (const ogp::ParserException &e) - { - std::cout << "Caught parser exception: " << e.message() << '\n'; - return 255; - } - - return EXIT_SUCCESS; -} diff --git a/dynare++/src/planner_builder.cc b/dynare++/src/planner_builder.cc deleted file mode 100644 index 41bb6f91d..000000000 --- a/dynare++/src/planner_builder.cc +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright © 2006 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#include "planner_builder.hh" -#include "dynare_exception.hh" -#include "dynare_model.hh" - -#include -#include - -using namespace ogdyn; - -const IntegerMatrix & -IntegerMatrix::operator=(const IntegerMatrix &im) -{ - if (nr != im.nr || nc != im.nc) - throw DynareException(__FILE__, __LINE__, - "Matrices have different dimensions in IntegerMatrix::operator="); - std::copy_n(im.data.get(), nr*nc, data.get()); - return *this; -} - -const IntegerArray3 & -IntegerArray3::operator=(const IntegerArray3 &ia3) -{ - if (n1 != ia3.n1 || n2 != ia3.n2 || n3 != ia3.n3) - throw DynareException(__FILE__, __LINE__, - "Arrays have different dimensions in IntegerArray3::operator="); - std::copy_n(ia3.data.get(), n1*n2*n3, data.get()); - return *this; -} - -PlannerBuilder::PlannerBuilder(DynareModel &m, const Tvarset &yyset, - Teqset ffset) - : yset(), fset(std::move(ffset)), model(m), - tb(model.t_plobjective), tbeta(model.t_pldiscount), - maxlead(model.atoms.get_maxlead()), - minlag(model.atoms.get_minlag()), - diff_b(yyset.size(), 1-minlag), - diff_f(yyset.size(), fset.size(), 1+maxlead-minlag), - static_atoms(), - static_tree(), - diff_b_static(yyset.size(), 1-minlag), - diff_f_static(yyset.size(), fset.size(), 1+maxlead-minlag) -{ - info.num_new_terms -= model.getParser().getTree().get_num_op(); - - fill_yset(m.atoms.get_name_storage(), yyset); - - add_derivatives_of_b(); - add_derivatives_of_f(); - shift_derivatives_of_b(); - shift_derivatives_of_f(); - beta_multiply_b(); - beta_multiply_f(); - make_static_version(); - lagrange_mult_f(); - form_equations(); - - info.num_new_terms += model.getParser().getTree().get_num_op(); -} - -PlannerBuilder::PlannerBuilder(const PlannerBuilder &pb, ogdyn::DynareModel &m) - : yset(), fset(pb.fset), model(m), - tb(pb.tb), tbeta(pb.tbeta), - maxlead(pb.maxlead), minlag(pb.minlag), - diff_b(pb.diff_b), diff_f(pb.diff_f), - static_atoms(pb.static_atoms), - static_tree(pb.static_tree), - diff_b_static(pb.diff_b_static), - diff_f_static(pb.diff_f_static), - aux_map(), static_aux_map() -{ - fill_yset(m.atoms.get_name_storage(), pb.yset); - fill_aux_map(m.atoms.get_name_storage(), pb.aux_map, pb.static_aux_map); -} - -void -PlannerBuilder::add_derivatives_of_b() -{ - int yi = 0; - for (auto yname = yset.begin(); yname != yset.end(); ++yname, yi++) - for (int ll = minlag; ll <= 0; ll++) - { - int yt = model.atoms.index(*yname, ll); - if (yt != -1) - diff_b(yi, ll-minlag) = model.eqs.add_derivative(tb, yt); - else - diff_b(yi, ll-minlag) = ogp::OperationTree::zero; - } -} - -void -PlannerBuilder::add_derivatives_of_f() -{ - int yi = 0; - for (auto yname = yset.begin(); yname != yset.end(); ++yname, yi++) - for (unsigned int fi = 0; fi < fset.size(); fi++) - for (int ll = minlag; ll <= maxlead; ll++) - { - int yt = model.atoms.index(*yname, ll); - if (yt != -1) - diff_f(yi, fi, ll-minlag) - = model.eqs.add_derivative(model.eqs.formula(fset[fi]), yt); - else - diff_f(yi, fi, ll-minlag) = ogp::OperationTree::zero; - } -} - -void -PlannerBuilder::shift_derivatives_of_b() -{ - map subst; - for (int yi = 0; yi < diff_b.nrows(); yi++) - for (int ll = minlag; ll < 0; ll++) - if (diff_b(yi, ll-minlag) != ogp::OperationTree::zero) - { - model.variable_shift_map(model.eqs.nulary_of_term(diff_b(yi, ll-minlag)), - -ll, subst); - diff_b(yi, ll-minlag) = model.eqs.add_substitution(diff_b(yi, ll-minlag), subst); - } -} - -void -PlannerBuilder::shift_derivatives_of_f() -{ - map subst; - for (int yi = 0; yi < diff_f.dim1(); yi++) - for (int fi = 0; fi < diff_f.dim2(); fi++) - { - // first do it leads which are put under expectation before t: no problem - for (int ll = 0; ll <= maxlead; ll++) - if (diff_f(yi, fi, ll-minlag) != ogp::OperationTree::zero) - { - model.variable_shift_map(model.eqs.nulary_of_term(diff_f(yi, fi, ll-minlag)), - -ll, subst); - diff_f(yi, fi, ll-minlag) - = model.eqs.add_substitution(diff_f(yi, fi, ll-minlag), subst); - } - /* now do it for lags, these are put as leads under expectations after - time t, so we have to introduce auxiliary variables at time t, and - make leads of them here */ - for (int ll = minlag; ll < 0; ll++) - { - int ft = diff_f(yi, fi, ll-minlag); - if (ft != ogp::OperationTree::zero) - { - /* if the ft term has a lead, than we need to introduce an - auxiliary variable zₜ, define it as 𝔼ₜ[ft] and put z_{t-ll} - to the equation. Otherwise, we just put leaded ft to the - equation directly. */ - int ft_maxlead, ft_minlag; - model.termspan(ft, ft_maxlead, ft_minlag); - if (ft_maxlead > 0) - { - // make an auxiliary variable - std::string name; - name = "AUX_" + std::to_string(yi) + '_' + std::to_string(fset[fi]) + '_' + std::to_string(-ll); - model.atoms.register_uniq_endo(name); - info.num_aux_variables++; - int taux = model.eqs.add_nulary(name); - name = "AUX_" + std::to_string(yi) + '_' + std::to_string(fset[fi]) + '_' + std::to_string(-ll) + '(' + std::to_string(-ll) + ')'; - int taux_leaded = model.eqs.add_nulary(name); - // put aux_leaded to the equation - diff_f(yi, fi, ll-minlag) = taux_leaded; - // save auxiliary variable and the term - aux_map.emplace(model.atoms.name(taux), ft); - } - else - { - /* no auxiliary variable is needed and the term ft can be - leaded in place */ - model.variable_shift_map(model.eqs.nulary_of_term(ft), -ll, subst); - diff_f(yi, fi, ll-minlag) = model.eqs.add_substitution(ft, subst); - } - } - } - } -} - -void -PlannerBuilder::beta_multiply_b() -{ - int beta_pow = ogp::OperationTree::one; - for (int ll = 0; ll >= minlag; ll--, - beta_pow = model.eqs.add_binary(ogp::code_t::TIMES, beta_pow, tbeta)) - for (int yi = 0; yi < diff_b.nrows(); yi++) - if (diff_b(yi, ll-minlag) != ogp::OperationTree::zero) - diff_b(yi, ll-minlag) - = model.eqs.add_binary(ogp::code_t::TIMES, beta_pow, diff_b(yi, ll-minlag)); -} - -void -PlannerBuilder::beta_multiply_f() -{ - int beta_pow = ogp::OperationTree::one; - for (int ll = 0; ll <= maxlead; ll++, - beta_pow = model.eqs.add_binary(ogp::code_t::DIVIDE, beta_pow, tbeta)) - for (int yi = 0; yi < diff_f.dim1(); yi++) - for (int fi = 0; fi < diff_f.dim2(); fi++) - if (diff_f(yi, fi, ll-minlag) != ogp::OperationTree::zero) - diff_f(yi, fi, ll-minlag) - = model.eqs.add_binary(ogp::code_t::TIMES, beta_pow, diff_f(yi, fi, ll-minlag)); - - beta_pow = ogp::OperationTree::one; - for (int ll = 0; ll >= minlag; ll--, - beta_pow = model.eqs.add_binary(ogp::code_t::TIMES, beta_pow, tbeta)) - for (int yi = 0; yi < diff_f.dim1(); yi++) - for (int fi = 0; fi < diff_f.dim2(); fi++) - if (diff_f(yi, fi, ll-minlag) != ogp::OperationTree::zero) - diff_f(yi, fi, ll-minlag) - = model.eqs.add_binary(ogp::code_t::TIMES, beta_pow, diff_f(yi, fi, ll-minlag)); -} - -void -PlannerBuilder::make_static_version() -{ - // map holding substitutions from dynamic to static - ogp::StaticFineAtoms::Tintintmap tmap; - - // fill static atoms with outer ordering - static_atoms.import_atoms(model.atoms, static_tree, tmap); - - // go through diff_b and fill diff_b_static - for (int ll = minlag; ll <= 0; ll++) - for (int yi = 0; yi < diff_b.nrows(); yi++) - diff_b_static(yi, ll-minlag) - = static_tree.add_substitution(diff_b(yi, ll-minlag), - tmap, model.eqs.getTree()); - - // go through diff_f and fill diff_f_static - for (int ll = minlag; ll <= maxlead; ll++) - for (int yi = 0; yi < diff_f.dim1(); yi++) - for (int fi = 0; fi < diff_f.dim2(); fi++) - diff_f_static(yi, fi, ll-minlag) - = static_tree.add_substitution(diff_f(yi, fi, ll-minlag), - tmap, model.eqs.getTree()); - - // go through aux_map and fill static_aux_map - for (const auto &it : aux_map) - { - int tstatic = static_tree.add_substitution(it.second, tmap, model.eqs.getTree()); - static_aux_map.emplace(it.first, tstatic); - } -} - -void -PlannerBuilder::lagrange_mult_f() -{ - // register multipliers - std::string mult_name; - for (int fi = 0; fi < diff_f.dim2(); fi++) - { - mult_name = "MULT" + std::to_string(fset[fi]); - model.atoms.register_uniq_endo(mult_name); - info.num_lagrange_mults++; - } - // multiply with the multipliers - for (int yi = 0; yi < diff_f.dim1(); yi++) - for (int fi = 0; fi < diff_f.dim2(); fi++) - for (int ll = minlag; ll <= maxlead; ll++) - if (diff_f(yi, fi, ll-minlag) != ogp::OperationTree::zero) - { - mult_name = "MULT" + std::to_string(fset[fi]) + '(' + std::to_string(-ll) + ')'; - int tm = model.eqs.add_nulary(mult_name); - diff_f(yi, fi, ll-minlag) - = model.eqs.add_binary(ogp::code_t::TIMES, tm, diff_f(yi, fi, ll-minlag)); - } -} - -void -PlannerBuilder::form_equations() -{ - // add planner’s FOCs - for (int yi = 0; yi < diff_f.dim1(); yi++) - { - int eq = ogp::OperationTree::zero; - for (int ll = minlag; ll <= 0; ll++) - eq = model.eqs.add_binary(ogp::code_t::PLUS, eq, diff_b(yi, ll-minlag)); - for (int fi = 0; fi < diff_f.dim2(); fi++) - for (int ll = minlag; ll <= maxlead; ll++) - eq = model.eqs.add_binary(ogp::code_t::PLUS, eq, diff_f(yi, fi, ll-minlag)); - model.eqs.add_formula(eq); - } - - // add equations for auxiliary variables - for (const auto &it : aux_map) - { - int t = model.atoms.index(it.first, 0); - model.eqs.add_formula(model.eqs.add_binary(ogp::code_t::MINUS, t, it.second)); - } -} - -void -PlannerBuilder::fill_yset(const ogp::NameStorage &ns, - const PlannerBuilder::Tvarset &yyset) -{ - for (auto it : yyset) - yset.insert(it); -} - -void -PlannerBuilder::fill_aux_map(const ogp::NameStorage &ns, const Tsubstmap &aaux_map, - const Tsubstmap &astatic_aux_map) -{ - // fill aux_map - for (auto it : aaux_map) - aux_map.insert(it); - - // fill static_aux_map - for (auto it : astatic_aux_map) - static_aux_map.insert(it); -} - -MultInitSS::MultInitSS(const PlannerBuilder &pb, const Vector &pvals, Vector &yy) - : builder(pb), b(builder.diff_b_static.nrows()), - F(builder.diff_f_static.dim1(), builder.diff_f_static.dim2()) -{ - b.zeros(); - F.zeros(); - - // first evaluate substitutions (auxiliary variables) from the builder - ogdyn::DynareStaticSteadySubstitutions dss(builder.model.atoms, builder.static_atoms, - builder.static_tree, - builder.static_aux_map, pvals, yy); - - /* gather all the terms from builder.diff_b_static and builder.diff_f_static - to the vector, the ordering is important, since the index of this vector - will have to be decoded to the position in b and F. */ - vector terms; - for (int yi = 0; yi < builder.diff_b_static.nrows(); yi++) - for (int l = 0; l < builder.diff_b_static.ncols(); l++) - terms.push_back(builder.diff_b_static(yi, l)); - for (int yi = 0; yi < builder.diff_f_static.dim1(); yi++) - for (int fi = 0; fi < builder.diff_f_static.dim2(); fi++) - for (int l = 0; l < builder.diff_f_static.dim3(); l++) - terms.push_back(builder.diff_f_static(yi, fi, l)); - - /* evaluate the terms, it will call a series of load(i,res), which sum the - results through lags/leads to b and F */ - DynareStaticSteadyAtomValues dssav(builder.model.atoms, builder.static_atoms, pvals, yy); - ogp::FormulaCustomEvaluator fe(builder.static_tree, terms); - fe.eval(dssav, *this); - - // solve overdetermined system b+F*lambda=0 using SVD decomposition - SVDDecomp decomp(F); - Vector lambda(builder.diff_f_static.dim2()); - decomp.solve(b, lambda); - lambda.mult(-1); - - // take values of lambda and put it to yy - for (int fi = 0; fi < builder.diff_f_static.dim2(); fi++) - { - std::string mult_name = "MULT" + std::to_string(builder.fset[fi]); - int iouter = builder.model.atoms.name2outer_endo(mult_name); - int iy = builder.model.atoms.outer2y_endo()[iouter]; - if (!std::isfinite(yy[iy])) - yy[iy] = lambda[fi]; - - /* go through all substitutions of the multiplier and set them as well */ - if (builder.model.atom_substs) - { - const ogp::AtomSubstitutions::Toldnamemap &old2new - = builder.model.atom_substs->get_old2new(); - auto it = old2new.find(mult_name); - if (it != old2new.end()) - { - const ogp::AtomSubstitutions::Tshiftnameset &sset = it->second; - for (const auto &itt : sset) - { - const std::string &newname = itt.first; - int iouter = builder.model.atoms.name2outer_endo(newname); - int iy = builder.model.atoms.outer2y_endo()[iouter]; - if (!std::isfinite(yy[iy])) - yy[iy] = lambda[fi]; - } - } - } - } -} - -void -MultInitSS::load(int i, double res) -{ - /* we can afford it, since the evaluator sets res to exact zero if the term - is zero */ - if (res == 0) - return; - // decode i and add to either b or F - if (i < builder.diff_b_static.nrows()*builder.diff_b_static.ncols()) - // add to b - b[i / builder.diff_b_static.ncols()] += res; - else - { - // add to F - i -= builder.diff_b_static.nrows()*builder.diff_b_static.ncols(); - int yifi = i / builder.diff_f_static.dim3(); - int yi = yifi / builder.diff_f_static.dim2(); - int fi = yifi % builder.diff_f_static.dim2(); - F.get(yi, fi) += res; - } -} diff --git a/dynare++/src/planner_builder.hh b/dynare++/src/planner_builder.hh deleted file mode 100644 index 206df7da7..000000000 --- a/dynare++/src/planner_builder.hh +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright © 2006-2011 Ondra Kamenik - * Copyright © 2019 Dynare Team - * - * This file is part of Dynare. - * - * Dynare is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Dynare is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Dynare. If not, see . - */ - -#ifndef PLANNER_BUILDER_H -#define PLANNER_BUILDER_H - -#include -#include -#include -#include -#include - -#include "parser/cc/static_fine_atoms.hh" -#include "dynare_atoms.hh" -#include "GeneralMatrix.hh" - -namespace ogdyn -{ - using std::unordered_set; - using std::map; - using std::vector; - - /** This is a two dimensional array of integers. Nothing - * difficult. */ - class IntegerMatrix - { - protected: - /** Number of rows. */ - int nr; - /** Number of columns. */ - int nc; - /** The pointer to the data. */ - std::unique_ptr data; - public: - /** Construct uninitialized array. */ - IntegerMatrix(int nrr, int ncc) - : nr(nrr), nc(ncc), data(std::make_unique(nr*nc)) - { - } - /** Copy constructor. */ - IntegerMatrix(const IntegerMatrix &im) - : nr(im.nr), nc(im.nc), data(std::make_unique(nr*nc)) - { - std::copy_n(im.data.get(), nr*nc, data.get()); - } - /** Assignment operator. It can only assing array with the - * same dimensions. */ - const IntegerMatrix &operator=(const IntegerMatrix &im); - int & - operator()(int i, int j) - { - return data[i+j*nr]; - } - const int & - operator()(int i, int j) const - { - return data[i+j*nr]; - } - int - nrows() const - { - return nr; - } - int - ncols() const - { - return nc; - } - }; - - /** The three dimensional array of integers. Nothing difficult. */ - class IntegerArray3 - { - protected: - /** First dimension. */ - int n1; - /** Second dimension. */ - int n2; - /** Third dimension. */ - int n3; - /** The data. */ - std::unique_ptr data; - public: - /** Constrcut unitialized array. */ - IntegerArray3(int nn1, int nn2, int nn3) - : n1(nn1), n2(nn2), n3(nn3), data(std::make_unique(n1*n2*n3)) - { - } - /** Copy constructor. */ - IntegerArray3(const IntegerArray3 &ia3) - : n1(ia3.n1), n2(ia3.n2), n3(ia3.n3), data(std::make_unique(n1*n2*n3)) - { - std::copy_n(ia3.data.get(), n1*n2*n3, data.get()); - } - /** Assignment operator assigning the arrays with the same dimensions. */ - const IntegerArray3 &operator=(const IntegerArray3 &ia3); - int & - operator()(int i, int j, int k) - { - return data[i+j*n1+k*n1*n2]; - } - const int & - operator()(int i, int j, int k) const - { - return data[i+j*n1+k*n1*n2]; - } - int - dim1() const - { - return n1; - } - int - dim2() const - { - return n2; - } - int - dim3() const - { - return n3; - } - }; - - /** This struct encapsulates information about the building of a - * planner's problem. */ - struct PlannerInfo - { - int num_lagrange_mults{0}; - int num_aux_variables{0}; - int num_new_terms{0}; - }; - - class MultInitSS; - class DynareModel; - - /** This class builds the first order conditions of the social - * planner problem with constraints being the equations in the - * model. The model is non-const parameter to the constructor - * which adds appropriate FOCs to the system. It also allows for - * an estimation of the lagrange multipliers given all other - * endogenous variables of the static system. For this purpose we - * need to create static atoms and static versions of all the tree - * index matrices. The algorithm and algebra are documented in - * dynare++-ramsey.pdf. */ - class PlannerBuilder - { - friend class MultInitSS; - public: - /** Type for a set of variable names. */ - using Tvarset = unordered_set; - /** Type for a set of equations. An equation is identified by - * an index to an equation in the equation vector given by - * DynareModel::eqs. The tree index of the i-th formula is - * retrieved as DynareModel::egs.formula(i). */ - using Teqset = vector; - protected: - /** This is a set of variables wrt which the planner - * optimizes. These could be all endogenous variables, but it - * is beneficial to exclude all variables which are - * deterministic transformations of past exogenous variables, - * since the planner cannot influence them. This could save a - * few equations. This is not changed after it is constructed, - * but it is constructed manually, so it cannot be declared as - * const. */ - Tvarset yset; - /** These are the equation indices constituing the constraints - * for the planner. Again, it is beneficial to exclude all - * equations defining exogenous variables excluded from - * yset. */ - const Teqset fset; - /** Reference to the model. */ - ogdyn::DynareModel &model; - /** Tree index of the planner objective. */ - int tb; - /** Tree index of the planner discount parameter. */ - int tbeta; - /** The maximum lead in the model including the planner's - * objective before building the planner's FOCs. */ - const int maxlead; - /** The minimum lag in the model including the planner's objective - * before building the planner's FOCs. */ - const int minlag; - /** Tree indices of formulas in the planner FOCs involving - * derivatives of the planner's objective. Rows correspond to the - * endogenous variables, columns correspond to lags in the - * objective function. The contents of the matrix will evolve as - * the algorithm proceeds. */ - IntegerMatrix diff_b; - /** Tree indices of formulas in the planner FOCs involving - * derivatives of the model equations (constraints). The first - * dimension corresponds to endogenous variables, the second to - * the constraints, the third to lags or leads of endogenous - * variables in the constraints. The contents of the array will - * evolve as the algorithm proceeds.*/ - IntegerArray3 diff_f; - /** Static version of the model atoms. It is needed to build - * static version of diff_b and diff_f. */ - ogp::StaticFineAtoms static_atoms; - /** Static version of all the trees of diff_b and diff_f build - * over static_atoms. */ - ogp::OperationTree static_tree; - /** Tree indices of static version of diff_b over static_atoms and static_tree. */ - IntegerMatrix diff_b_static; - /** Tree indices of static version of diff_f over static_atoms - * and static_tree. This member is created before calling - * lagrange_mult_f(), so it does not contain the - * multiplication with the lagrange multipliers. */ - IntegerArray3 diff_f_static; - /** Auxiliary variables mapping. During the algorithm, some - * auxiliary variables for the terms might be created, so we - * remember their names and tree indices of the terms. This - * maps a name to the tree index of an expression equal to the - * auxiliary variable at time zero. The auxiliary variables - * names point to the dynamic atoms storage, tree inidices to - * the dynamic model tree. */ - Tsubstmap aux_map; - /** Static version of aux_map. The names point to static_atoms - * storage, the tree indices to the static_tree. */ - Tsubstmap static_aux_map; - /** Information about the number of various things. */ - PlannerInfo info; - public: - /** Build the planner problem for the given model optimizing - * through the given endogenous variables with the given - * constraints. We allow for a selection of a subset of - * equations and variables in order to eliminate exogenous - * predetermined process which cannot be influenced by the - * social planner. */ - PlannerBuilder(ogdyn::DynareModel &m, const Tvarset &yyset, - Teqset ffset); - /** Construct a copy of the builder with provided model, which - * is supposed to be the copy of the model in the builder. */ - PlannerBuilder(const PlannerBuilder &pb, ogdyn::DynareModel &m); - /** Avoid copying from only PlannerBuilder. */ - PlannerBuilder(const PlannerBuilder &pb) = delete; - /** Return the information. */ - const PlannerInfo & - get_info() const - { - return info; - } - protected: - /** Differentiate the planner objective wrt endogenous - * variables with different lags. */ - void add_derivatives_of_b(); - /** Differentiate the constraints wrt endogenous variables - * with different lags and leads. */ - void add_derivatives_of_f(); - /** Shift derivatives of diff_b. */ - void shift_derivatives_of_b(); - /** Shift derivatives of diff_ff. */ - void shift_derivatives_of_f(); - /** Multiply with the discount factor terms in diff_b. */ - void beta_multiply_b(); - /** Multiply with the discount factor terms in diff_f. */ - void beta_multiply_f(); - /** Fill static_atoms and static_tree and build diff_b_static, - * diff_f_static and aux_map_static with static versions of diff_b, - * diff_f and aux_map. */ - void make_static_version(); - /** Multiply diff_f with Langrange multipliers. */ - void lagrange_mult_f(); - /** Add the equations to the mode, including equation for auxiliary variables. */ - void form_equations(); - private: - /** Fill yset for a given yyset and given name storage. */ - void fill_yset(const ogp::NameStorage &ns, const Tvarset &yyset); - /** Fill aux_map and aux_map_static for a given aaux_map and - * aaux_map_static for a given storage of dynamic atoms (used - * for aux_map) and static atoms storage from this object for - * aux_map_static. */ - void fill_aux_map(const ogp::NameStorage &ns, const Tsubstmap &aaux_map, - const Tsubstmap &astatic_aux_map); - }; - - /** This class only calculates for the given initial guess of - * endogenous variables, initial guess of the Langrange - * multipliers of the social planner problem yielding the least - * square error. It is used by just calling its constructor. The - * constructor takes non-const reference to the vector of - * endogenous variables, calculates lambdas and put the values of - * lambdas to the vector. The algbera is found in - * dynare++-ramsey.pdf. - * - * The code can be run only after the parsing has been finished in - * atoms. */ - class MultInitSS : public ogp::FormulaEvalLoader - { - protected: - /** The constant reference to the builder. */ - const PlannerBuilder &builder; - /** The constant term of the problem. Its length is the number - * of endogenous variable wrt the planner optimizes. */ - Vector b; - /** The matrix of the overdetermined problem. The number of - * rows is equal to the number of endogenous variables wrt - * which the planner optimizes, the number of columns is equal - * to the number of Langrange multipliers which is equal to - * the number of constraints which is smaller than the number - * of endogenous variables. Hence the system b+F*lambda=0 is - * overdetermined. */ - GeneralMatrix F; - public: - /** The constructor of the object which does everything. Its - * main goal is to update yy. Note that if an item of yy - * corresponding to a lagrange multiplier is already set, it - * is not reset. */ - MultInitSS(const PlannerBuilder &pb, const Vector &pvals, Vector &yy); - /** This loads evaluated parts of b or F and decodes i and - * advances b or F depending on the decoded i. The decoding is - * dependent on the way how the terms of builder.diff_b and - * builder.diff_f_save have been put the the - * ogp::FormulaCustomEvaluator. This is documented in the code - * of the constructor. */ - void load(int i, double res) override; - }; -}; - -#endif diff --git a/dynare++/sylv/Makefile.am b/dynare++/sylv/Makefile.am deleted file mode 100644 index ffebab6fe..000000000 --- a/dynare++/sylv/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = cc testing diff --git a/dynare++/sylv/cc/Makefile.am b/dynare++/sylv/cc/Makefile.am deleted file mode 100644 index d1e88bbc3..000000000 --- a/dynare++/sylv/cc/Makefile.am +++ /dev/null @@ -1,41 +0,0 @@ -noinst_LIBRARIES = libsylv.a - -# For dynblas.h and dynlapack.h -libsylv_a_CPPFLAGS = -I$(top_srcdir)/mex/sources -I../../utils/cc - -libsylv_a_SOURCES = \ - BlockDiagonal.cc \ - BlockDiagonal.hh \ - GeneralMatrix.cc \ - GeneralMatrix.hh \ - GeneralSylvester.cc \ - GeneralSylvester.hh \ - IterativeSylvester.cc \ - IterativeSylvester.hh \ - KronUtils.cc \ - KronUtils.hh \ - KronVector.cc \ - KronVector.hh \ - QuasiTriangular.cc \ - QuasiTriangular.hh \ - QuasiTriangularZero.cc \ - QuasiTriangularZero.hh \ - SchurDecomp.cc \ - SchurDecomp.hh \ - SchurDecompEig.cc \ - SchurDecompEig.hh \ - SimilarityDecomp.cc \ - SimilarityDecomp.hh \ - SylvException.cc \ - SylvException.hh \ - SylvMatrix.cc \ - SylvMatrix.hh \ - SylvParams.cc \ - SylvParams.hh \ - SylvesterSolver.hh \ - SymSchurDecomp.cc \ - SymSchurDecomp.hh \ - TriangularSylvester.cc \ - TriangularSylvester.hh \ - Vector.cc \ - Vector.hh diff --git a/dynare++/tests/Makefile.am b/dynare++/tests/Makefile.am deleted file mode 100644 index e98e40863..000000000 --- a/dynare++/tests/Makefile.am +++ /dev/null @@ -1,46 +0,0 @@ -MODFILES = \ - asset.mod \ - c20.mod \ - czech2.mod \ - dm7.mod \ - example1.mod \ - example1_optim.mod \ - gentay1a.mod \ - judd.mod \ - judd_norm.mod \ - kp1980_1.mod \ - kp1980_2.mod \ - kp1980_3.mod \ - lucas78.mod \ - m_0_3_0_0_0_0_0_0.mod \ - m_1_3_0_0_0_0_0_0.mod \ - m_1_3_0_0_0_0_0_1.mod \ - or0a.mod \ - portfolio4.mod \ - portfolio4_norm.mod \ - portfolio.mod \ - psd_exo3.mod \ - q3a2.mod \ - q3a50.mod \ - sedmodel1.mod \ - swma_pie.mod \ - test1.mod \ - test2a.mod \ - test2.mod \ - test3.mod \ - test4.mod \ - test5.mod \ - test6.mod \ - test7.mod \ - test.mod - -EXTRA_DIST = $(MODFILES) \ - sw_euro.mod # This one crashes at steady state computation - -check-local: $(MODFILES:%.mod=%.jnl) - -%.jnl: %.mod - ../src/dynare++ --sim 2 $< - -clean-local: - rm -f *.jnl *_f.m *_ff.m *.dump diff --git a/dynare++/tests/asset.mod b/dynare++/tests/asset.mod deleted file mode 100644 index c9a5b9e28..000000000 --- a/dynare++/tests/asset.mod +++ /dev/null @@ -1,28 +0,0 @@ -var y, x; -varexo e; - -parameters theta, rho, bet, xbar; - -xbar = 0.0179; -rho = -0.139; -theta = -10; -bet = 0.95; - -model; -y = bet*exp(theta*x(+1))*(1+y(+1)); -x = (1-rho)*xbar + rho*x(-1) + e; -end; - -initval; -x = 0.0179; -y = 0.3; -e = 0; -end; - -vcov = [ 0.0012110]; - -order = 6; - - - - diff --git a/dynare++/tests/c20.mod b/dynare++/tests/c20.mod deleted file mode 100644 index a3b7bd1fa..000000000 --- a/dynare++/tests/c20.mod +++ /dev/null @@ -1,497 +0,0 @@ -var C10_PIE C10_RR C10_RS C10_Y C11_PIE C11_RR C11_RS C11_Y C12_PIE C12_RR C12_RS C12_Y C13_PIE C13_RR C13_RS C13_Y C14_PIE C14_RR C14_RS C14_Y C15_PIE C15_RR C15_RS C15_Y C16_PIE C16_RR C16_RS C16_Y C17_PIE C17_RR C17_RS C17_Y C18_PIE C18_RR C18_RS C18_Y C19_PIE C19_RR C19_RS C19_Y C1_PIE C1_RR C1_RS C1_Y C20_PIE C20_RR C20_RS C20_Y C2_PIE C2_RR C2_RS C2_Y C3_PIE C3_RR C3_RS C3_Y C4_PIE C4_RR C4_RS C4_Y C5_PIE C5_RR C5_RS C5_Y C6_PIE C6_RR C6_RS C6_Y C7_PIE C7_RR C7_RS C7_Y C8_PIE C8_RR C8_RS C8_Y C9_PIE C9_RR C9_RS C9_Y; - -varexo C1_EPIE C1_EY C1_ERS C2_EPIE C2_EY C2_ERS C3_EPIE C3_EY C3_ERS C4_EPIE C4_EY C4_ERS C5_EPIE C5_EY C5_ERS C6_EPIE C6_EY C6_ERS C7_EPIE C7_EY C7_ERS C8_EPIE C8_EY C8_ERS C9_EPIE C9_EY C9_ERS C10_EPIE C10_EY C10_ERS C11_EPIE C11_EY C11_ERS C12_EPIE C12_EY C12_ERS C13_EPIE C13_EY C13_ERS C14_EPIE C14_EY C14_ERS C15_EPIE C15_EY C15_ERS C16_EPIE C16_EY C16_ERS C17_EPIE C17_EY C17_ERS C18_EPIE C18_EY C18_ERS C19_EPIE C19_EY C19_ERS C20_EPIE C20_EY C20_ERS; - -parameters C10_CALFA1 C10_CALFA2 C10_CALFA3 C10_CALFA4 C10_CALFA5 C10_CALFA6 C10_CALFA7 C10_CALFA8 C10_CALFA9 C11_CALFA1 C11_CALFA2 C11_CALFA3 C11_CALFA4 C11_CALFA5 C11_CALFA6 C11_CALFA7 C11_CALFA8 C11_CALFA9 C12_CALFA1 C12_CALFA2 C12_CALFA3 C12_CALFA4 C12_CALFA5 C12_CALFA6 C12_CALFA7 C12_CALFA8 C12_CALFA9 C13_CALFA1 C13_CALFA2 C13_CALFA3 C13_CALFA4 C13_CALFA5 C13_CALFA6 C13_CALFA7 C13_CALFA8 C13_CALFA9 C14_CALFA1 C14_CALFA2 C14_CALFA3 C14_CALFA4 C14_CALFA5 C14_CALFA6 C14_CALFA7 C14_CALFA8 C14_CALFA9 C15_CALFA1 C15_CALFA2 C15_CALFA3 C15_CALFA4 C15_CALFA5 C15_CALFA6 C15_CALFA7 C15_CALFA8 C15_CALFA9 C16_CALFA1 C16_CALFA2 C16_CALFA3 C16_CALFA4 C16_CALFA5 C16_CALFA6 C16_CALFA7 C16_CALFA8 C16_CALFA9 C17_CALFA1 C17_CALFA2 C17_CALFA3 C17_CALFA4 C17_CALFA5 C17_CALFA6 C17_CALFA7 C17_CALFA8 C17_CALFA9 C18_CALFA1 C18_CALFA2 C18_CALFA3 C18_CALFA4 C18_CALFA5 C18_CALFA6 C18_CALFA7 C18_CALFA8 C18_CALFA9 C19_CALFA1 C19_CALFA2 C19_CALFA3 C19_CALFA4 C19_CALFA5 C19_CALFA6 C19_CALFA7 C19_CALFA8 C19_CALFA9 C1_CALFA1 C1_CALFA2 C1_CALFA3 C1_CALFA4 C1_CALFA5 C1_CALFA6 C1_CALFA7 C1_CALFA8 C1_CALFA9 C20_CALFA1 C20_CALFA2 C20_CALFA3 C20_CALFA4 C20_CALFA5 C20_CALFA6 C20_CALFA7 C20_CALFA8 C20_CALFA9 C2_CALFA1 C2_CALFA2 C2_CALFA3 C2_CALFA4 C2_CALFA5 C2_CALFA6 C2_CALFA7 C2_CALFA8 C2_CALFA9 C3_CALFA1 C3_CALFA2 C3_CALFA3 C3_CALFA4 C3_CALFA5 C3_CALFA6 C3_CALFA7 C3_CALFA8 C3_CALFA9 C4_CALFA1 C4_CALFA2 C4_CALFA3 C4_CALFA4 C4_CALFA5 C4_CALFA6 C4_CALFA7 C4_CALFA8 C4_CALFA9 C5_CALFA1 C5_CALFA2 C5_CALFA3 C5_CALFA4 C5_CALFA5 C5_CALFA6 C5_CALFA7 C5_CALFA8 C5_CALFA9 C6_CALFA1 C6_CALFA2 C6_CALFA3 C6_CALFA4 C6_CALFA5 C6_CALFA6 C6_CALFA7 C6_CALFA8 C6_CALFA9 C7_CALFA1 C7_CALFA2 C7_CALFA3 C7_CALFA4 C7_CALFA5 C7_CALFA6 C7_CALFA7 C7_CALFA8 C7_CALFA9 C8_CALFA1 C8_CALFA2 C8_CALFA3 C8_CALFA4 C8_CALFA5 C8_CALFA6 C8_CALFA7 C8_CALFA8 C8_CALFA9 C9_CALFA1 C9_CALFA2 C9_CALFA3 C9_CALFA4 C9_CALFA5 C9_CALFA6 C9_CALFA7 C9_CALFA8 C9_CALFA9 C10_PIESTAR C11_PIESTAR C12_PIESTAR C13_PIESTAR C14_PIESTAR C15_PIESTAR C16_PIESTAR C17_PIESTAR C18_PIESTAR C19_PIESTAR C1_PIESTAR C20_PIESTAR C2_PIESTAR C3_PIESTAR C4_PIESTAR C5_PIESTAR C6_PIESTAR C7_PIESTAR C8_PIESTAR C9_PIESTAR; -C10_CALFA1=0.5; -C10_CALFA2=0.5; -C10_CALFA3=0.5; -C10_CALFA4=0; -C10_CALFA5=0.75; -C10_CALFA6=-0.25; -C10_CALFA7=0.1; -C10_CALFA8=0.5; -C10_CALFA9=0.5; -C11_CALFA1=0.5; -C11_CALFA2=0.5; -C11_CALFA3=0.5; -C11_CALFA4=0; -C11_CALFA5=0.75; -C11_CALFA6=-0.25; -C11_CALFA7=0.1; -C11_CALFA8=0.5; -C11_CALFA9=0.5; -C12_CALFA1=0.5; -C12_CALFA2=0.5; -C12_CALFA3=0.5; -C12_CALFA4=0; -C12_CALFA5=0.75; -C12_CALFA6=-0.25; -C12_CALFA7=0.1; -C12_CALFA8=0.5; -C12_CALFA9=0.5; -C13_CALFA1=0.5; -C13_CALFA2=0.5; -C13_CALFA3=0.5; -C13_CALFA4=0; -C13_CALFA5=0.75; -C13_CALFA6=-0.25; -C13_CALFA7=0.1; -C13_CALFA8=0.5; -C13_CALFA9=0.5; -C14_CALFA1=0.5; -C14_CALFA2=0.5; -C14_CALFA3=0.5; -C14_CALFA4=0; -C14_CALFA5=0.75; -C14_CALFA6=-0.25; -C14_CALFA7=0.1; -C14_CALFA8=0.5; -C14_CALFA9=0.5; -C15_CALFA1=0.5; -C15_CALFA2=0.5; -C15_CALFA3=0.5; -C15_CALFA4=0; -C15_CALFA5=0.75; -C15_CALFA6=-0.25; -C15_CALFA7=0.1; -C15_CALFA8=0.5; -C15_CALFA9=0.5; -C16_CALFA1=0.5; -C16_CALFA2=0.5; -C16_CALFA3=0.5; -C16_CALFA4=0; -C16_CALFA5=0.75; -C16_CALFA6=-0.25; -C16_CALFA7=0.1; -C16_CALFA8=0.5; -C16_CALFA9=0.5; -C17_CALFA1=0.5; -C17_CALFA2=0.5; -C17_CALFA3=0.5; -C17_CALFA4=0; -C17_CALFA5=0.75; -C17_CALFA6=-0.25; -C17_CALFA7=0.1; -C17_CALFA8=0.5; -C17_CALFA9=0.5; -C18_CALFA1=0.5; -C18_CALFA2=0.5; -C18_CALFA3=0.5; -C18_CALFA4=0; -C18_CALFA5=0.75; -C18_CALFA6=-0.25; -C18_CALFA7=0.1; -C18_CALFA8=0.5; -C18_CALFA9=0.5; -C19_CALFA1=0.5; -C19_CALFA2=0.5; -C19_CALFA3=0.5; -C19_CALFA4=0; -C19_CALFA5=0.75; -C19_CALFA6=-0.25; -C19_CALFA7=0.1; -C19_CALFA8=0.5; -C19_CALFA9=0.5; -C1_CALFA1=0.5; -C1_CALFA2=0.5; -C1_CALFA3=0.5; -C1_CALFA4=0; -C1_CALFA5=0.75; -C1_CALFA6=-0.25; -C1_CALFA7=0.1; -C1_CALFA8=0.5; -C1_CALFA9=0.5; -C20_CALFA1=0.5; -C20_CALFA2=0.5; -C20_CALFA3=0.5; -C20_CALFA4=0; -C20_CALFA5=0.75; -C20_CALFA6=-0.25; -C20_CALFA7=0.1; -C20_CALFA8=0.5; -C20_CALFA9=0.5; -C2_CALFA1=0.5; -C2_CALFA2=0.5; -C2_CALFA3=0.5; -C2_CALFA4=0; -C2_CALFA5=0.75; -C2_CALFA6=-0.25; -C2_CALFA7=0.1; -C2_CALFA8=0.5; -C2_CALFA9=0.5; -C3_CALFA1=0.5; -C3_CALFA2=0.5; -C3_CALFA3=0.5; -C3_CALFA4=0; -C3_CALFA5=0.75; -C3_CALFA6=-0.25; -C3_CALFA7=0.1; -C3_CALFA8=0.5; -C3_CALFA9=0.5; -C4_CALFA1=0.5; -C4_CALFA2=0.5; -C4_CALFA3=0.5; -C4_CALFA4=0; -C4_CALFA5=0.75; -C4_CALFA6=-0.25; -C4_CALFA7=0.1; -C4_CALFA8=0.5; -C4_CALFA9=0.5; -C5_CALFA1=0.5; -C5_CALFA2=0.5; -C5_CALFA3=0.5; -C5_CALFA4=0; -C5_CALFA5=0.75; -C5_CALFA6=-0.25; -C5_CALFA7=0.1; -C5_CALFA8=0.5; -C5_CALFA9=0.5; -C6_CALFA1=0.5; -C6_CALFA2=0.5; -C6_CALFA3=0.5; -C6_CALFA4=0; -C6_CALFA5=0.75; -C6_CALFA6=-0.25; -C6_CALFA7=0.1; -C6_CALFA8=0.5; -C6_CALFA9=0.5; -C7_CALFA1=0.5; -C7_CALFA2=0.5; -C7_CALFA3=0.5; -C7_CALFA4=0; -C7_CALFA5=0.75; -C7_CALFA6=-0.25; -C7_CALFA7=0.1; -C7_CALFA8=0.5; -C7_CALFA9=0.5; -C8_CALFA1=0.5; -C8_CALFA2=0.5; -C8_CALFA3=0.5; -C8_CALFA4=0; -C8_CALFA5=0.75; -C8_CALFA6=-0.25; -C8_CALFA7=0.1; -C8_CALFA8=0.5; -C8_CALFA9=0.5; -C9_CALFA1=0.5; -C9_CALFA2=0.5; -C9_CALFA3=0.5; -C9_CALFA4=0; -C9_CALFA5=0.75; -C9_CALFA6=-0.25; -C9_CALFA7=0.1; -C9_CALFA8=0.5; -C9_CALFA9=0.5; -C10_PIESTAR=2.5; -C11_PIESTAR=2.5; -C12_PIESTAR=2.5; -C13_PIESTAR=2.5; -C14_PIESTAR=2.5; -C15_PIESTAR=2.5; -C16_PIESTAR=2.5; -C17_PIESTAR=2.5; -C18_PIESTAR=2.5; -C19_PIESTAR=2.5; -C1_PIESTAR=2.5; -C20_PIESTAR=2.5; -C2_PIESTAR=2.5; -C3_PIESTAR=2.5; -C4_PIESTAR=2.5; -C5_PIESTAR=2.5; -C6_PIESTAR=2.5; -C7_PIESTAR=2.5; -C8_PIESTAR=2.5; -C9_PIESTAR=2.5; - -model; - C1_PIE = C1_CALFA1*C1_PIE(1)+(1-C1_CALFA1)*C1_PIE(-1)+C1_CALFA2*(C1_Y+0.1)+C1_CALFA3*(C1_Y+0.1)^2/2+C1_EPIE ; - C1_Y = C1_CALFA4*C1_Y(1)+C1_CALFA5*C1_Y(-1)+C1_CALFA6*C1_RR+C1_EY+C1_CALFA7*(0+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C1_RR = C1_RS-C1_PIE(1) ; - C1_RS = C1_PIE(1)+C1_CALFA8*(C1_PIE-C1_PIESTAR)+C1_CALFA9*C1_Y+C1_ERS ; - C2_PIE = C2_CALFA1*C2_PIE(1)+(1-C2_CALFA1)*C2_PIE(-1)+C2_CALFA2*(C2_Y+0.1)+C2_CALFA3*(C2_Y+0.1)^2/2+C2_EPIE ; - C2_Y = C2_CALFA4*C2_Y(1)+C2_CALFA5*C2_Y(-1)+C2_CALFA6*C2_RR+C2_EY+C2_CALFA7*(0+C1_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C2_RR = C2_RS-C2_PIE(1) ; - C2_RS = C2_PIE(1)+C2_CALFA8*(C2_PIE-C2_PIESTAR)+C2_CALFA9*C2_Y+C2_ERS ; - C3_PIE = C3_CALFA1*C3_PIE(1)+(1-C3_CALFA1)*C3_PIE(-1)+C3_CALFA2*(C3_Y+0.1)+C3_CALFA3*(C3_Y+0.1)^2/2+C3_EPIE ; - C3_Y = C3_CALFA4*C3_Y(1)+C3_CALFA5*C3_Y(-1)+C3_CALFA6*C3_RR+C3_EY+C3_CALFA7*(0+C1_Y+C2_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C3_RR = C3_RS-C3_PIE(1) ; - C3_RS = C3_PIE(1)+C3_CALFA8*(C3_PIE-C3_PIESTAR)+C3_CALFA9*C3_Y+C3_ERS ; - C4_PIE = C4_CALFA1*C4_PIE(1)+(1-C4_CALFA1)*C4_PIE(-1)+C4_CALFA2*(C4_Y+0.1)+C4_CALFA3*(C4_Y+0.1)^2/2+C4_EPIE ; - C4_Y = C4_CALFA4*C4_Y(1)+C4_CALFA5*C4_Y(-1)+C4_CALFA6*C4_RR+C4_EY+C4_CALFA7*(0+C1_Y+C2_Y+C3_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C4_RR = C4_RS-C4_PIE(1) ; - C4_RS = C4_PIE(1)+C4_CALFA8*(C4_PIE-C4_PIESTAR)+C4_CALFA9*C4_Y+C4_ERS ; - C5_PIE = C5_CALFA1*C5_PIE(1)+(1-C5_CALFA1)*C5_PIE(-1)+C5_CALFA2*(C5_Y+0.1)+C5_CALFA3*(C5_Y+0.1)^2/2+C5_EPIE ; - C5_Y = C5_CALFA4*C5_Y(1)+C5_CALFA5*C5_Y(-1)+C5_CALFA6*C5_RR+C5_EY+C5_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C5_RR = C5_RS-C5_PIE(1) ; - C5_RS = C5_PIE(1)+C5_CALFA8*(C5_PIE-C5_PIESTAR)+C5_CALFA9*C5_Y+C5_ERS ; - C6_PIE = C6_CALFA1*C6_PIE(1)+(1-C6_CALFA1)*C6_PIE(-1)+C6_CALFA2*(C6_Y+0.1)+C6_CALFA3*(C6_Y+0.1)^2/2+C6_EPIE ; - C6_Y = C6_CALFA4*C6_Y(1)+C6_CALFA5*C6_Y(-1)+C6_CALFA6*C6_RR+C6_EY+C6_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C6_RR = C6_RS-C6_PIE(1) ; - C6_RS = C6_PIE(1)+C6_CALFA8*(C6_PIE-C6_PIESTAR)+C6_CALFA9*C6_Y+C6_ERS ; - C7_PIE = C7_CALFA1*C7_PIE(1)+(1-C7_CALFA1)*C7_PIE(-1)+C7_CALFA2*(C7_Y+0.1)+C7_CALFA3*(C7_Y+0.1)^2/2+C7_EPIE ; - C7_Y = C7_CALFA4*C7_Y(1)+C7_CALFA5*C7_Y(-1)+C7_CALFA6*C7_RR+C7_EY+C7_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C7_RR = C7_RS-C7_PIE(1) ; - C7_RS = C7_PIE(1)+C7_CALFA8*(C7_PIE-C7_PIESTAR)+C7_CALFA9*C7_Y+C7_ERS ; - C8_PIE = C8_CALFA1*C8_PIE(1)+(1-C8_CALFA1)*C8_PIE(-1)+C8_CALFA2*(C8_Y+0.1)+C8_CALFA3*(C8_Y+0.1)^2/2+C8_EPIE ; - C8_Y = C8_CALFA4*C8_Y(1)+C8_CALFA5*C8_Y(-1)+C8_CALFA6*C8_RR+C8_EY+C8_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C8_RR = C8_RS-C8_PIE(1) ; - C8_RS = C8_PIE(1)+C8_CALFA8*(C8_PIE-C8_PIESTAR)+C8_CALFA9*C8_Y+C8_ERS ; - C9_PIE = C9_CALFA1*C9_PIE(1)+(1-C9_CALFA1)*C9_PIE(-1)+C9_CALFA2*(C9_Y+0.1)+C9_CALFA3*(C9_Y+0.1)^2/2+C9_EPIE ; - C9_Y = C9_CALFA4*C9_Y(1)+C9_CALFA5*C9_Y(-1)+C9_CALFA6*C9_RR+C9_EY+C9_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C9_RR = C9_RS-C9_PIE(1) ; - C9_RS = C9_PIE(1)+C9_CALFA8*(C9_PIE-C9_PIESTAR)+C9_CALFA9*C9_Y+C9_ERS ; - C10_PIE = C10_CALFA1*C10_PIE(1)+(1-C10_CALFA1)*C10_PIE(-1)+C10_CALFA2*(C10_Y+0.1)+C10_CALFA3*(C10_Y+0.1)^2/2+C10_EPIE ; - C10_Y = C10_CALFA4*C10_Y(1)+C10_CALFA5*C10_Y(-1)+C10_CALFA6*C10_RR+C10_EY+C10_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C10_RR = C10_RS-C10_PIE(1) ; - C10_RS = C10_PIE(1)+C10_CALFA8*(C10_PIE-C10_PIESTAR)+C10_CALFA9*C10_Y+C10_ERS ; - C11_PIE = C11_CALFA1*C11_PIE(1)+(1-C11_CALFA1)*C11_PIE(-1)+C11_CALFA2*(C11_Y+0.1)+C11_CALFA3*(C11_Y+0.1)^2/2+C11_EPIE ; - C11_Y = C11_CALFA4*C11_Y(1)+C11_CALFA5*C11_Y(-1)+C11_CALFA6*C11_RR+C11_EY+C11_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C11_RR = C11_RS-C11_PIE(1) ; - C11_RS = C11_PIE(1)+C11_CALFA8*(C11_PIE-C11_PIESTAR)+C11_CALFA9*C11_Y+C11_ERS ; - C12_PIE = C12_CALFA1*C12_PIE(1)+(1-C12_CALFA1)*C12_PIE(-1)+C12_CALFA2*(C12_Y+0.1)+C12_CALFA3*(C12_Y+0.1)^2/2+C12_EPIE ; - C12_Y = C12_CALFA4*C12_Y(1)+C12_CALFA5*C12_Y(-1)+C12_CALFA6*C12_RR+C12_EY+C12_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C12_RR = C12_RS-C12_PIE(1) ; - C12_RS = C12_PIE(1)+C12_CALFA8*(C12_PIE-C12_PIESTAR)+C12_CALFA9*C12_Y+C12_ERS ; - C13_PIE = C13_CALFA1*C13_PIE(1)+(1-C13_CALFA1)*C13_PIE(-1)+C13_CALFA2*(C13_Y+0.1)+C13_CALFA3*(C13_Y+0.1)^2/2+C13_EPIE ; - C13_Y = C13_CALFA4*C13_Y(1)+C13_CALFA5*C13_Y(-1)+C13_CALFA6*C13_RR+C13_EY+C13_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C13_RR = C13_RS-C13_PIE(1) ; - C13_RS = C13_PIE(1)+C13_CALFA8*(C13_PIE-C13_PIESTAR)+C13_CALFA9*C13_Y+C13_ERS ; - C14_PIE = C14_CALFA1*C14_PIE(1)+(1-C14_CALFA1)*C14_PIE(-1)+C14_CALFA2*(C14_Y+0.1)+C14_CALFA3*(C14_Y+0.1)^2/2+C14_EPIE ; - C14_Y = C14_CALFA4*C14_Y(1)+C14_CALFA5*C14_Y(-1)+C14_CALFA6*C14_RR+C14_EY+C14_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C14_RR = C14_RS-C14_PIE(1) ; - C14_RS = C14_PIE(1)+C14_CALFA8*(C14_PIE-C14_PIESTAR)+C14_CALFA9*C14_Y+C14_ERS ; - C15_PIE = C15_CALFA1*C15_PIE(1)+(1-C15_CALFA1)*C15_PIE(-1)+C15_CALFA2*(C15_Y+0.1)+C15_CALFA3*(C15_Y+0.1)^2/2+C15_EPIE ; - C15_Y = C15_CALFA4*C15_Y(1)+C15_CALFA5*C15_Y(-1)+C15_CALFA6*C15_RR+C15_EY+C15_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C16_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C15_RR = C15_RS-C15_PIE(1) ; - C15_RS = C15_PIE(1)+C15_CALFA8*(C15_PIE-C15_PIESTAR)+C15_CALFA9*C15_Y+C15_ERS ; - C16_PIE = C16_CALFA1*C16_PIE(1)+(1-C16_CALFA1)*C16_PIE(-1)+C16_CALFA2*(C16_Y+0.1)+C16_CALFA3*(C16_Y+0.1)^2/2+C16_EPIE ; - C16_Y = C16_CALFA4*C16_Y(1)+C16_CALFA5*C16_Y(-1)+C16_CALFA6*C16_RR+C16_EY+C16_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C17_Y+C18_Y+C19_Y+C20_Y)/19 ; - C16_RR = C16_RS-C16_PIE(1) ; - C16_RS = C16_PIE(1)+C16_CALFA8*(C16_PIE-C16_PIESTAR)+C16_CALFA9*C16_Y+C16_ERS ; - C17_PIE = C17_CALFA1*C17_PIE(1)+(1-C17_CALFA1)*C17_PIE(-1)+C17_CALFA2*(C17_Y+0.1)+C17_CALFA3*(C17_Y+0.1)^2/2+C17_EPIE ; - C17_Y = C17_CALFA4*C17_Y(1)+C17_CALFA5*C17_Y(-1)+C17_CALFA6*C17_RR+C17_EY+C17_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C18_Y+C19_Y+C20_Y)/19 ; - C17_RR = C17_RS-C17_PIE(1) ; - C17_RS = C17_PIE(1)+C17_CALFA8*(C17_PIE-C17_PIESTAR)+C17_CALFA9*C17_Y+C17_ERS ; - C18_PIE = C18_CALFA1*C18_PIE(1)+(1-C18_CALFA1)*C18_PIE(-1)+C18_CALFA2*(C18_Y+0.1)+C18_CALFA3*(C18_Y+0.1)^2/2+C18_EPIE ; - C18_Y = C18_CALFA4*C18_Y(1)+C18_CALFA5*C18_Y(-1)+C18_CALFA6*C18_RR+C18_EY+C18_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C19_Y+C20_Y)/19 ; - C18_RR = C18_RS-C18_PIE(1) ; - C18_RS = C18_PIE(1)+C18_CALFA8*(C18_PIE-C18_PIESTAR)+C18_CALFA9*C18_Y+C18_ERS ; - C19_PIE = C19_CALFA1*C19_PIE(1)+(1-C19_CALFA1)*C19_PIE(-1)+C19_CALFA2*(C19_Y+0.1)+C19_CALFA3*(C19_Y+0.1)^2/2+C19_EPIE ; - C19_Y = C19_CALFA4*C19_Y(1)+C19_CALFA5*C19_Y(-1)+C19_CALFA6*C19_RR+C19_EY+C19_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C20_Y)/19 ; - C19_RR = C19_RS-C19_PIE(1) ; - C19_RS = C19_PIE(1)+C19_CALFA8*(C19_PIE-C19_PIESTAR)+C19_CALFA9*C19_Y+C19_ERS ; - C20_PIE = C20_CALFA1*C20_PIE(1)+(1-C20_CALFA1)*C20_PIE(-1)+C20_CALFA2*(C20_Y+0.1)+C20_CALFA3*(C20_Y+0.1)^2/2+C20_EPIE ; - C20_Y = C20_CALFA4*C20_Y(1)+C20_CALFA5*C20_Y(-1)+C20_CALFA6*C20_RR+C20_EY+C20_CALFA7*(0+C1_Y+C2_Y+C3_Y+C4_Y+C5_Y+C6_Y+C7_Y+C8_Y+C9_Y+C10_Y+C11_Y+C12_Y+C13_Y+C14_Y+C15_Y+C16_Y+C17_Y+C18_Y+C19_Y)/19 ; - C20_RR = C20_RS-C20_PIE(1) ; - C20_RS = C20_PIE(1)+C20_CALFA8*(C20_PIE-C20_PIESTAR)+C20_CALFA9*C20_Y+C20_ERS ; -end; - -initval; -C10_PIE=2.5; -C10_RR=0; -C10_RS=2.5; -C10_Y=0; -C11_PIE=2.5; -C11_RR=0; -C11_RS=2.5; -C11_Y=0; -C12_PIE=2.5; -C12_RR=0; -C12_RS=2.5; -C12_Y=0; -C13_PIE=2.5; -C13_RR=0; -C13_RS=2.5; -C13_Y=0; -C14_PIE=2.5; -C14_RR=0; -C14_RS=2.5; -C14_Y=0; -C15_PIE=2.5; -C15_RR=0; -C15_RS=2.5; -C15_Y=0; -C16_PIE=2.5; -C16_RR=0; -C16_RS=2.5; -C16_Y=0; -C17_PIE=2.5; -C17_RR=0; -C17_RS=2.5; -C17_Y=0; -C18_PIE=2.5; -C18_RR=0; -C18_RS=2.5; -C18_Y=0; -C19_PIE=2.5; -C19_RR=0; -C19_RS=2.5; -C19_Y=0; -C1_PIE=2.5; -C1_RR=0; -C1_RS=2.5; -C1_Y=0; -C20_PIE=2.5; -C20_RR=0; -C20_RS=2.5; -C20_Y=0; -C2_PIE=2.5; -C2_RR=0; -C2_RS=2.5; -C2_Y=0; -C3_PIE=2.5; -C3_RR=0; -C3_RS=2.5; -C3_Y=0; -C4_PIE=2.5; -C4_RR=0; -C4_RS=2.5; -C4_Y=0; -C5_PIE=2.5; -C5_RR=0; -C5_RS=2.5; -C5_Y=0; -C6_PIE=2.5; -C6_RR=0; -C6_RS=2.5; -C6_Y=0; -C7_PIE=2.5; -C7_RR=0; -C7_RS=2.5; -C7_Y=0; -C8_PIE=2.5; -C8_RR=0; -C8_RS=2.5; -C8_Y=0; -C9_PIE=2.5; -C9_RR=0; -C9_RS=2.5; -C9_Y=0; -C1_EPIE=0; -C1_EY=0; -C1_ERS=0; -C2_EPIE=0; -C2_EY=0; -C2_ERS=0; -C3_EPIE=0; -C3_EY=0; -C3_ERS=0; -C4_EPIE=0; -C4_EY=0; -C4_ERS=0; -C5_EPIE=0; -C5_EY=0; -C5_ERS=0; -C6_EPIE=0; -C6_EY=0; -C6_ERS=0; -C7_EPIE=0; -C7_EY=0; -C7_ERS=0; -C8_EPIE=0; -C8_EY=0; -C8_ERS=0; -C9_EPIE=0; -C9_EY=0; -C9_ERS=0; -C10_EPIE=0; -C10_EY=0; -C10_ERS=0; -C11_EPIE=0; -C11_EY=0; -C11_ERS=0; -C12_EPIE=0; -C12_EY=0; -C12_ERS=0; -C13_EPIE=0; -C13_EY=0; -C13_ERS=0; -C14_EPIE=0; -C14_EY=0; -C14_ERS=0; -C15_EPIE=0; -C15_EY=0; -C15_ERS=0; -C16_EPIE=0; -C16_EY=0; -C16_ERS=0; -C17_EPIE=0; -C17_EY=0; -C17_ERS=0; -C18_EPIE=0; -C18_EY=0; -C18_ERS=0; -C19_EPIE=0; -C19_EY=0; -C19_ERS=0; -C20_EPIE=0; -C20_EY=0; -C20_ERS=0; -end; - -vcov = [ -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -]; - -order = 1; - diff --git a/dynare++/tests/czech2.mod b/dynare++/tests/czech2.mod deleted file mode 100644 index 2e7adeb78..000000000 --- a/dynare++/tests/czech2.mod +++ /dev/null @@ -1,712 +0,0 @@ -var PIE4EU ZZ_PIE4EU ZZ_RNOMEU GDPGAPEU ZZ_DRNOMEU AF AH BIGGAMF BIGGAMH BIGGAMIMPF BIGGAMIMPH BIGGAMMF BIGGAMMH BIGGAMNF BIGGAMNH BIGGAMQF BIGGAMQH BIGGAM_MONF BIGGAM_MONH BIGGAM_MOTF BIGGAM_MOTH BIGGAM_O_NF BIGGAM_O_NH BIGGAM_O_TF BIGGAM_O_TH CAPAF CAPAH CF CF_NAT CH CH_NAT CURBALF_RAT CURBALH_RAT DEEF DEEH DEPEX EXPORTSF EXPORTSF_NAT EXPORTSH EXPORTSH_NAT EYEF EYEH GAF GAH GAMMAF GAMMAH GDPF GDPF_NAT GDPGAPF GDPGAPH GDPH GDPH_NAT GF_NAT GH_NAT GNF GNH HF HH IMPORTSF IMPORTSF_NAT IMPORTSH IMPORTSH_NAT KF KH KNF KNF_RAT KNH KNH_RAT KTF KTF_RAT KTH KTH_RAT K_OF K_OF_RAT K_OH K_OH_RAT LANDF LANDH LF LH LNF LNH LTF LTH L_OF L_OH MARGUTF MARGUTH MF MF_NAT MH MH_NAT M_ONF M_ONH M_OTF M_OTH NF NH NNF NNH O_NF O_NH O_TF O_TH PIE4F PIE4H PIE4TARF PIE4TARH PIEBARMF PIEBARMH PIEBARQF PIEBARQH PIEF PIEH PIENF PIENH PIEWF PIEWH PSIF PSIH PSIPRIMEF PSIPRIMEH QF QH Q_ONF Q_ONH Q_OTF Q_OTH REALBF REALBH REALEX REALEXF REALEXH REALFINH REALMCNF REALMCNH REALMCTF REALMCTH REALMONEYF REALMONEYH REALPBARMF REALPBARMH REALPBARQF REALPBARQH REALPLANDF REALPLANDH REALPMF REALPMH REALPNF REALPNH REALPQF REALPQH REALPXF REALPXH REALP_MOF REALP_MOH REALP_ONF REALP_ONH REALP_OTF REALP_OTH REALP_QOF REALP_QOH REALRF REALRH REALTBALF REALTBALH REALWF REALWH RNOMF RNOMH SHOPF SHOPH SHOPPRIMEF SHOPPRIMEH TF TH T_OF T_OH VELOF VELOH VPRIMEF VPRIMEH XF_NAT XH_NAT XI ZBF ZBH ZEYEF ZEYEH ZNF ZNH ZTF ZTH ZUF ZUH ZZ_CF ZZ_CH ZZ_CURBALF_RAT ZZ_CURBALH_RAT ZZ_C_SHARF ZZ_C_SHARH ZZ_DPIE4F ZZ_DPIE4H ZZ_DRNOMF ZZ_DRNOMH ZZ_EXPORTSF ZZ_EXPORTSH ZZ_EYEF ZZ_EYEH ZZ_EYE_SHARF ZZ_EYE_SHARH ZZ_GDPF ZZ_GDPH ZZ_GDP_PPP_RATH ZZ_GF ZZ_GH ZZ_IMPORTSF ZZ_IMPORTSH ZZ_M_ON_SHARF ZZ_M_ON_SHARH ZZ_M_OT_SHARF ZZ_M_OT_SHARH ZZ_M_O_SHARF ZZ_M_O_SHARH ZZ_M_SHARF ZZ_M_SHARH ZZ_N_SHARF ZZ_N_SHARH ZZ_PIE4F ZZ_PIE4H ZZ_REALEX ZZ_RNOMF ZZ_RNOMH ZZ_UTILITYF ZZ_UTILITYH ZZ_XBALF_TOT_RAT ZZ_XBALH_TOT_RAT Z_OF Z_OH PIEH_1 PIEH_2 PIEF_1 PIEF_2 REALBH_1 VALUE VALUE2; - -varexo E_ZBH E_ZUH E_ZUF E_ZEYEH E_ZEYEF E_GAMMAH E_GAMMAF E_LANDH E_LANDF E_GAH E_GAF E_CAPAH E_CAPAF; - -parameters COSTLF COSTLH EPSF EPSH EPSQMF EPSQMH GLAMBDAF GLAMBDAH SIGMAF SIGMAH SSF SSH XR1F XR1H XR2F XR2H XR3F XR3H XR4F XR4H ALPHANF ALPHANH ALPHATF ALPHATH ALPHA_OF ALPHA_OH A_ONEF A_ONEH A_ZEROF A_ZEROH B0F B0H B1F B1H B2F B2H BET CAPAF_SS CAPAH_SS CHI0 CHI1 CHI2 CHI3 COSTF COSTH COST_MONF COST_MONH COST_MOTF COST_MOTH COST_O_NF COST_O_NH COST_O_TF COST_O_TH DELTAF DELTAH EPS_ONF EPS_ONH EPS_OTF EPS_OTH ETAF ETAH E_PIE4TARF E_PIE4TARH E_ZBF GAMA_NF GAMA_NH GAMA_TF GAMA_TH GAMMAF_SS GAMMAH_SS GAMMA_LANDF GAMMA_LANDH GA_RATF GA_RATH GDPF_EXOG GDPH_EXOG GN_RATF GN_RATH LANDF_SS LANDH_SS LILCAPPA1F LILCAPPA1H LILCAPPA2F LILCAPPA2H LILCAPPA3F LILCAPPA3H LILCAPPA4F LILCAPPA4H LILCAPPA5F LILCAPPA5H LILCAPPA6F LILCAPPA6H LILCAPPA7F LILCAPPA7H LILCAPPA8F LILCAPPA8H NYF NYH NY_NF NY_NH NY_TF NY_TH OMEGA0F OMEGA0H OMEGAF OMEGAH PHIF PHIH PIE4TARF_SS PIE4TARH_SS REALEX_EXOG REALPBARMF_EXOG REALPBARMH_EXOG REALPNF_EXOG REALPNH_EXOG REALP_MOF_EXOG REALP_MOH_EXOG RNOM_EXOGF RNOM_EXOGH THETAF THETAH XDUMF XDUMH XIXI_NF XIXI_NH XIXI_OF XIXI_OH XIXI_TF XIXI_TH ZBF_SS ZBH_SS ZEDF ZEDH ZEYEF_SS ZEYEH_SS ZNF_SS ZNH_SS ZTF_SS ZTH_SS ZUF_SS ZUH_SS Z_OF_SS Z_OH_SS; - -COSTLF=5; -COSTLH=5; -EPSF=1.1; -EPSH=1.1; -EPSQMF=4; -EPSQMH=1.1; -GLAMBDAF=0; -GLAMBDAH=0; -SIGMAF=0.333333333333333; -SIGMAH=0.333333333333333; -SSF=0.95; -SSH=0.05; -XR1F=1; -XR1H=1; -XR2F=0; -XR2H=0; -XR3F=0.5; -XR3H=0.5; -XR4F=0; -XR4H=0; -ALPHANF=0.33; -ALPHANH=0.4; -ALPHATF=0.33; -ALPHATH=0.4; -ALPHA_OF=0.2; -ALPHA_OH=0.2; -A_ONEF=0.075; -A_ONEH=0.075; -A_ZEROF=0.011; -A_ZEROH=0.011; -B0F=1; -B0H=1; -B1F=0.95; -B1H=0.95; -B2F=1; -B2H=1; -BET=0.99263753614514; -CAPAF_SS=11; -CAPAH_SS=11; -CHI0=0.05; -CHI1=.1; -CHI2=0; -CHI3=0; -COSTF=5; -COSTH=5; -COST_MONF=5; -COST_MONH=5; -COST_MOTF=5; -COST_MOTH=5; -COST_O_NF=5; -COST_O_NH=5; -COST_O_TF=5; -COST_O_TH=5; -DELTAF=0.025; -DELTAH=0.025; -EPS_ONF=3; -EPS_ONH=3; -EPS_OTF=3; -EPS_OTH=3; -ETAF=0.35; -ETAH=0.2; -E_PIE4TARF=0; -E_PIE4TARH=0; -E_ZBF=0; -GAMA_NF=0.3; -GAMA_NH=0.1; -GAMA_TF=0.3; -GAMA_TH=0.5; -GAMMAF_SS=0.5; -GAMMAH_SS=0.25; -GAMMA_LANDF=0.1; -GAMMA_LANDH=0.1; -GA_RATF=0.05; -GA_RATH=0.05; -GDPF_EXOG=2.41500497257461; -GDPH_EXOG=2.90512477822209; -GN_RATF=0.1; -GN_RATH=0.1; -LANDF_SS=0.1; -LANDH_SS=0.1; -LILCAPPA1F=0; -LILCAPPA1H=0; -LILCAPPA2F=800; -LILCAPPA2H=400; -LILCAPPA3F=0; -LILCAPPA3H=0; -LILCAPPA4F=800; -LILCAPPA4H=400; -LILCAPPA5F=0; -LILCAPPA5H=0; -LILCAPPA6F=800; -LILCAPPA6H=400; -LILCAPPA7F=0; -LILCAPPA7H=0; -LILCAPPA8F=0; -LILCAPPA8H=0; -NYF=0.98; -NYH=0.0499999999999999; -NY_NF=0.98; -NY_NH=0.0499999999999999; -NY_TF=0.98; -NY_TH=0.02; -OMEGA0F=60; -OMEGA0H=60; -OMEGAF=5; -OMEGAH=5; -PHIF=3; -PHIH=3; -PIE4TARF_SS=1.125; -PIE4TARH_SS=1.125; -REALEX_EXOG=1.3734519289908; -REALPBARMF_EXOG=0.87146958398196; -REALPBARMH_EXOG=1.19072687148694; -REALPNF_EXOG=0.840675522925242; -REALPNH_EXOG=0.902486321747893; -REALP_MOF_EXOG=0.966533486000563; -REALP_MOH_EXOG=1.63690883121281; -RNOM_EXOGF=1.00741707177773; -RNOM_EXOGH=1.00741707177773; -THETAF=6; -THETAH=6; -XDUMF=1; -XDUMH=1; -XIXI_NF=0.75; -XIXI_NH=0.75; -XIXI_OF=0.75; -XIXI_OH=0.75; -XIXI_TF=0.75; -XIXI_TH=0.75; -ZBF_SS=0; -ZBH_SS=0; -ZEDF=2.5; -ZEDH=2.5; -ZEYEF_SS=0; -ZEYEH_SS=0; -ZNF_SS=1; -ZNH_SS=1; -ZTF_SS=1; -ZTH_SS=0.6; -ZUF_SS=1; -ZUH_SS=1; -Z_OF_SS=1; -Z_OH_SS=1; - -model; -PIE4EU = SSH*PIE4H+(1-SSH)*PIE4F; -ZZ_PIE4EU = SSH*ZZ_PIE4H+(1-SSH)*ZZ_PIE4F; -ZZ_RNOMEU = SSH*ZZ_RNOMH+(1-SSH)*ZZ_RNOMF; - -ZZ_DRNOMEU = SSH*ZZ_DRNOMH+(1-SSH)*ZZ_DRNOMF; -GDPGAPEU = SSH*GDPGAPH+(1-SSH)*GDPGAPF; - - ZZ_UTILITYH = (ZUH*(CH-HH)^(1-SIGMAH)-1)/(1-SIGMAH)-CAPAH*LH^(1+ZEDH)/(1+ZEDH) ; - ZZ_GH = 100*log(GH_NAT) ; - ZZ_CURBALH_RAT = CURBALH_RAT*100 ; - ZZ_M_SHARH = REALPBARMH*MH/AH ; - ZZ_M_O_SHARH = (REALP_MOH*M_ONH+REALP_MOH*M_OTH)/AH ; - ZZ_M_ON_SHARH = REALP_MOH*M_ONH/AH ; - ZZ_M_OT_SHARH = REALP_MOH*M_OTH/AH ; - ZZ_N_SHARH = NH*REALPNH/AH ; - ZZ_EYE_SHARH = EYEH/GDPH ; - ZZ_C_SHARH = CH/GDPH ; - ZZ_GDPH = 100*log(GDPH_NAT) ; - ZZ_CH = 100*log(CH_NAT) ; - ZZ_EYEH = 100*log(EYEH) ; - ZZ_EXPORTSH = 100*log(EXPORTSH_NAT) ; - ZZ_IMPORTSH = 100*log(IMPORTSH_NAT) ; - ZZ_XBALH_TOT_RAT = 100*(EXPORTSH_NAT-IMPORTSH_NAT)/GDPH_NAT ; - ZZ_PIE4H = 100*(PIE4H-1) ; - ZZ_DPIE4H = ZZ_PIE4H-ZZ_PIE4H(-1) ; - ZZ_RNOMH = 100*(RNOMH^4-1) ; - ZZ_DRNOMH = ZZ_RNOMH-ZZ_RNOMH(-1) ; - 100*(PIE4TARH-1) = 1*100*(PIE4TARH_SS-1)+(1-1)*100*(PIE4TARH(-1)-1)+E_PIE4TARH ; - log(ZUH) = 0.3*log(ZUH_SS)+0.7*log(ZUH(-1))+E_ZUH ; - ZBH = 0.3*ZBH_SS+0.7*ZBH(-1)+E_ZBH ; - log(LANDH) = 0.05*log(LANDH_SS)+0.95*log(LANDH(-1))+E_LANDH ; - log(ZTH) = 0.05*log(ZTH_SS)+0.95*log(ZTH(-1))+E_LANDH ; - log(ZNH) = 0.05*log(ZNH_SS)+0.95*log(ZNH(-1))+E_LANDH ; - log(Z_OH) = 0.05*log(Z_OH_SS)+0.95*log(Z_OH(-1))+E_LANDH ; - ZEYEH = 0.05*ZEYEH_SS+0.95*ZEYEH(-1)+E_ZEYEH ; - CAPAH = 0.05*CAPAH_SS+0.95*CAPAH(-1)+E_CAPAH ; - log(GAMMAH) = 0.05*log(GAMMAH_SS)+0.95*log(GAMMAH(-1))+E_GAMMAH ; - BIGGAM_O_NH = 1-COST_O_NH/2*(O_NH/NH/(O_NH(-1)/NH(-1))-1)^2 ; - BIGGAM_O_TH = 1-COST_O_TH/2*(O_TH/TH/(O_TH(-1)/TH(-1))-1)^2 ; - O_NH = GAMA_NH*NH/ZNH*(REALP_ONH/(REALMCNH*ZNH))^(-XIXI_NH)*(BIGGAM_O_NH-COST_O_NH*(O_NH/NH/(O_NH(-1)/NH(-1))-1)*O_NH/NH/(O_NH(-1)/NH(-1)))^XIXI_NH/BIGGAM_O_NH ; - O_TH = GAMA_TH*TH/ZTH*(REALP_OTH/(REALMCTH*ZTH))^(-XIXI_TH)*(BIGGAM_O_TH-COST_O_TH*(O_TH/TH/(O_TH(-1)/TH(-1))-1)*O_TH/TH/(O_TH(-1)/TH(-1)))^XIXI_NH/BIGGAM_O_TH ; - NH = ZNH*((1-ALPHANH-GAMA_NH)^(1/XIXI_NH)*LNH^(1-1/XIXI_NH)+ALPHANH^(1/XIXI_NH)*KNH^(1-1/XIXI_NH)+GAMA_NH^(1/XIXI_NH)*(BIGGAM_O_NH*O_NH)^(1-1/XIXI_NH))^(XIXI_NH/(XIXI_NH-1)) ; - TH = ZTH*((1-ALPHATH-GAMA_TH)^(1/XIXI_TH)*LTH^(1-1/XIXI_TH)+ALPHATH^(1/XIXI_TH)*KTH^(1-1/XIXI_TH)+GAMA_TH^(1/XIXI_TH)*(BIGGAM_O_TH*O_TH)^(1-1/XIXI_TH))^(XIXI_TH/(XIXI_TH-1)) ; - REALMCNH = 1/ZNH*((1-ALPHANH-GAMA_NH)*REALWH^(1-XIXI_NH)+ALPHANH*REALRH^(1-XIXI_NH)+GAMA_NH*REALP_ONH^(1-XIXI_NH)*(BIGGAM_O_NH-COST_O_NH*(O_NH/NH/(O_NH(-1)/NH(-1))-1)*O_NH/NH/(O_NH(-1)/NH(-1)))^(XIXI_NH-1))^(1/(1-XIXI_NH)) ; - REALMCTH = 1/ZTH*((1-ALPHATH-GAMA_TH)*REALWH^(1-XIXI_TH)+ALPHATH*REALRH^(1-XIXI_TH)+GAMA_TH*REALP_OTH^(1-XIXI_TH)*(BIGGAM_O_TH-COST_O_TH*(O_TH/TH/(O_TH(-1)/TH(-1))-1)*O_TH/TH/(O_TH(-1)/TH(-1)))^(XIXI_TH-1))^(1/(1-XIXI_TH)) ; - MARGUTH = (CH-B2H*HH)^(-SIGMAH)*ZUH ; - HH = (1-B0H)*HH(-1)+B0H*B1H*CH(-1) ; - VPRIMEH = CAPAH*LH^ZEDH ; - AH^(1-1/EPSH) = GAMMAH^(1/EPSH)*(NYH^(1/EPSQMH)*QH^(1-1/EPSQMH)+(1-NYH)^(1/EPSQMH)*(MH*BIGGAMIMPH)^(1-1/EPSQMH))^(EPSQMH/(EPSQMH-1)*(1-1/EPSH))+(1-GAMMAH)^(1/EPSH)*NNH^(1-1/EPSH) ; - QH = GAMMAH*NYH*REALPQH^(-EPSQMH)*AH*REALPXH^(EPSQMH-EPSH) ; - MH = GAMMAH*(1-NYH)*REALPMH^(-EPSQMH)*AH*REALPXH^(EPSQMH-EPSH)*1/BIGGAMIMPH*(BIGGAMIMPH-COSTH*(MH/AH/(MH(-1)/AH(-1))-1)*MH/AH/(MH(-1)/AH(-1)))^EPSQMH ; - REALPXH = (NYH*REALPQH^(1-EPSQMH)+(1-NYH)*REALPMH^(1-EPSQMH)*(BIGGAMIMPH-COSTH*(MH/AH/(MH(-1)/AH(-1))-1)*MH/AH/(MH(-1)/AH(-1)))^(EPSQMH-1))^(1/(1-EPSQMH)) ; - BIGGAMIMPH = 1-COSTH/2*(MH/AH/(MH(-1)/AH(-1))-1)^2 ; - NNH = (1-GAMMAH)*REALPNH^(-EPSH)*AH ; - NH = NNH+ETAH*MH+ETAH*QH+GNH ; - PIENH = REALPNH/REALPNH(-1)*PIEH ; - BIGGAMNH = LILCAPPA3H/2*(PIENH/PIE4TARH^0.25-1)^2+LILCAPPA4H/2*(PIENH/PIENH(-1)-1)^2 ; - -(1-BIGGAMNH)*(REALPNH*(1-THETAH)+THETAH*REALMCNH) = -(REALPNH-REALMCNH)*(LILCAPPA3H*PIENH/PIE4TARH^0.25*(PIENH/PIE4TARH^0.25-1)+LILCAPPA4H*PIENH/PIENH(-1)*(PIENH/PIENH(-1)-1))+DEEH*PIEH(+1)*(REALPNH(+1)-REALMCNH(+1))*NH(+1)/NH*(LILCAPPA3H*PIENH(+1)/PIE4TARH^0.25*(PIENH(+1)/PIE4TARH^0.25-1)+LILCAPPA4H*PIENH(+1)/PIENH*(PIENH(+1)/PIENH-1)) ; - PIEBARQH = PIEH*REALPBARQH/REALPBARQH(-1) ; - BIGGAMQH = LILCAPPA5H/2*(PIEBARQH/PIE4TARH^0.25-1)^2+LILCAPPA6H/2*(PIEBARQH/PIEBARQH(-1)-1)^2 ; - -(1-BIGGAMQH)*REALPBARQH/REALPQH*(REALPBARQH*(1-THETAH)+ETAH*REALPNH+THETAH*REALMCTH) = -(REALPBARQH-REALMCTH)*(LILCAPPA5H*PIEBARQH/PIE4TARH^0.25*(PIEBARQH/PIE4TARH^0.25-1)+LILCAPPA6H*PIEBARQH/PIEBARQH(-1)*(PIEBARQH/PIEBARQH(-1)-1))+DEEH*PIEH(+1)*(REALPBARQH(+1)-REALMCTH(+1))*QH(+1)/QH*(LILCAPPA5H*PIEBARQH(+1)/PIE4TARH^0.25*(PIEBARQH(+1)/PIE4TARH^0.25-1)+LILCAPPA6H*PIEBARQH(+1)/PIEBARQH*(PIEBARQH(+1)/PIEBARQH-1)) ; - REALPQH = REALPBARQH+ETAH*REALPNH ; - KH = KH(-1)*(1-DELTAH)+PSIH(-1)*KH(-1) ; - PSIH = EYEH/KH-OMEGAH/2*(EYEH/KH-DELTAH*(1+ZEYEH))^2-OMEGA0H/2*(EYEH/KH-EYEH(-1)/KH(-1))^2 ; - PSIPRIMEH = 1-OMEGAH*(EYEH/KH-DELTAH*(1+ZEYEH))-OMEGA0H*(EYEH/KH-EYEH(-1)/KH(-1)) ; - 1/PSIPRIMEH = DEEH*PIEH(+1)*(REALRH(+1)+1/PSIPRIMEH(+1)*(1-DELTAH+PSIH(+1)*(1-PSIPRIMEH(+1)*EYEH(+1)/(PSIH(+1)*KH(+1))))) ; - BIGGAMH = LILCAPPA1H/2*(PIEWH/PIE4TARH^0.25-1)^2+LILCAPPA2H/2*(PIEWH/PIEWH(-1)-1)^2 ; - PIEH*REALWH/REALWH(-1) = PIEWH ; - REALWH = PHIH*VPRIMEH/MARGUTH*((PHIH-1)*(1-BIGGAMH)+PIEWH*LILCAPPA1H/PIE4TARH^0.25*(PIEWH/PIE4TARH^0.25-1)+PIEWH/PIEWH(-1)*LILCAPPA2H*(PIEWH/PIEWH(-1)-1)-DEEH*PIEWH(+1)*LH(+1)/LH*LILCAPPA1H*PIEWH(+1)/PIE4TARH^0.25*(PIEWH(+1)/PIE4TARH^0.25-1)-DEEH*PIEWH(+1)*LH(+1)/LH*LILCAPPA2H*PIEWH(+1)/(REALWH/REALWH(-1))*(PIEWH(+1)/PIEWH-1))^(-1) ; - DEEH = BET*MARGUTH(+1)/PIEH(+1)/MARGUTH*(1+SHOPH+SHOPPRIMEH*VELOH)/(1+SHOPH(+1)+SHOPPRIMEH(+1)*VELOH(+1)) ; - SHOPH = A_ZEROH*VELOH+A_ONEH/VELOH-2*(A_ZEROH*A_ONEH)^0.5 ; - SHOPPRIMEH = A_ZEROH-A_ONEH*VELOH^(-2) ; - VELOH = CH/REALMONEYH ; - DEEH = 1-SHOPPRIMEH*VELOH^2 ; - 1 = RNOMH*DEEH ; -/* - 100*(RNOMH^4-1) = (1-XDUMH)*100*(RNOM_EXOGH^4-1)+XDUMH*(XR3H*100*(RNOMH(-1)^4-1)+(1-XR3H)*(100*((1/BET*PIE4H^0.25)^4-1))+XR1H*(100*(PIE4H-1)-100*(PIE4TARH-1))+XR4H*100*(DEPEX^4-1)+XR2H*GDPGAPH) ; -*/ - 100*(RNOMH^4-1) = 100*(RNOMH(-1)^4-1)+1000*100*(DEPEX^4-1); - GDPGAPH = 100*(GDPH_NAT-GDPH_EXOG)/GDPH_EXOG ; - PIE4H = PIEH*PIEH(-1)*PIEH_1(-1)*PIEH_2(-1) ; - AH = CH*(1+SHOPH)+EYEH+GAH ; - GAH = .05*(GA_RATH*(GLAMBDAH*GDPH_NAT+(1-GLAMBDAH)*GDPH_EXOG))+.95*GAH(-1)+E_GAH; - GNH = GN_RATH*(GLAMBDAH*GDPH_NAT+(1-GLAMBDAH)*GDPH_EXOG)/REALPNH_EXOG ; - PIEBARMH = PIEH*REALPBARMH/REALPBARMH(-1) ; - BIGGAMMH = LILCAPPA7H/2*(PIEBARMH/PIE4TARH^0.25-1)^2+LILCAPPA8H/2*(PIEBARMH/PIEBARMH(-1)-1)^2 ; - REALPMH = REALPBARMH+ETAH*REALPNH ; - KNH_RAT = ALPHANH/(1-ALPHANH-GAMA_NH)*(REALWH/REALRH)^XIXI_NH ; - KTH_RAT = ALPHATH/(1-ALPHATH-GAMA_TH)*(REALWH/REALRH)^XIXI_TH ; - KNH_RAT = KNH/LNH ; - KTH_RAT = KTH/LTH ; - KH = KTH+KNH+K_OH ; - LH = (LNH+LTH+L_OH)*(1-COSTLH/2*(LNH/(LTH+L_OH)/(LNH(-1)/(LTH(-1)+L_OH(-1)))-1)^2) ; - T_OH = Z_OH*((1-ALPHA_OH-GAMMA_LANDH)^(1/XIXI_OH)*L_OH^(1-1/XIXI_OH)+ALPHA_OH^(1/XIXI_OH)*K_OH^(1-1/XIXI_OH)+GAMMA_LANDH^(1/XIXI_OH)*LANDH^(1-1/XIXI_OH))^(XIXI_OH/(XIXI_OH-1)) ; - Q_ONH = NY_NH*(REALP_QOH/REALP_ONH)^(-EPS_ONH)*O_NH ; - Q_OTH = NY_TH*(REALP_QOH/REALP_OTH)^(-EPS_OTH)*O_TH ; - M_ONH = (1-NY_NH)*(REALP_MOH/REALP_ONH)^(-EPS_ONH)*O_NH*(BIGGAM_MONH-COST_MONH*(M_ONH/O_NH/(M_ONH(-1)/O_NH(-1))-1)*M_ONH/O_NH/(M_ONH(-1)/O_NH(-1)))^EPS_ONH/BIGGAM_MONH ; - M_OTH = (1-NY_TH)*(REALP_MOH/REALP_OTH)^(-EPS_OTH)*O_TH*(BIGGAM_MOTH-COST_MOTH*(M_OTH/O_TH/(M_OTH(-1)/O_TH(-1))-1)*M_OTH/O_TH/(M_OTH(-1)/O_TH(-1)))^EPS_OTH/BIGGAM_MOTH ; - BIGGAM_MONH = 1-COST_MONH/2*(M_ONH/O_NH/(M_ONH(-1)/O_NH(-1))-1)^2 ; - BIGGAM_MOTH = 1-COST_MOTH/2*(M_OTH/O_TH/(M_OTH(-1)/O_TH(-1))-1)^2 ; - K_OH_RAT = ALPHA_OH/(1-ALPHA_OH-GAMMA_LANDH)*(REALWH/REALRH)^XIXI_OH ; - K_OH_RAT = K_OH/L_OH ; - REALP_QOH = 1/Z_OH*((1-ALPHA_OH-GAMMA_LANDH)*REALWH^(1-XIXI_OH)+ALPHA_OH*REALRH^(1-XIXI_OH)+GAMMA_LANDH*REALPLANDH^(1-XIXI_OH))^(1/(1-XIXI_OH)) ; - LANDH = GAMMA_LANDH*(REALPLANDH/(REALP_QOH*Z_OH))^(-XIXI_OH)*T_OH/Z_OH ; - REALP_ONH = (NY_NH*REALP_QOH^(1-EPS_ONH)+(1-NY_NH)*REALP_MOH^(1-EPS_ONH)*(BIGGAM_MONH-COST_MONH*(M_ONH/O_NH/(M_ONH(-1)/O_NH(-1))-1)*M_ONH/O_NH/(M_ONH(-1)/O_NH(-1)))^(EPS_ONH-1))^(1/(1-EPS_ONH)) ; - REALP_OTH = (NY_TH*REALP_QOH^(1-EPS_OTH)+(1-NY_TH)*REALP_MOH^(1-EPS_OTH)*(BIGGAM_MOTH-COST_MOTH*(M_OTH/O_TH/(M_OTH(-1)/O_TH(-1))-1)*M_OTH/O_TH/(M_OTH(-1)/O_TH(-1)))^(EPS_OTH-1))^(1/(1-EPS_OTH)) ; - SSH*TH = SSH*QH+SSF*MF ; - SSH*T_OH = SSH*Q_ONH+SSH*Q_OTH+SSF*M_ONF+SSF*M_OTF ; - REALP_MOH = REALP_QOF*REALEXH ; - ZZ_GDP_PPP_RATH = GDPH/REALEX/GDPF ; - XI = CHI0*(exp(CHI1*REALEX*REALBH)+CHI2*(REALEX*(REALBH-REALBH(-1)/PIEF)/GDPH)^2+CHI3*(REALEX*(REALBH-REALBH(-1)/PIEF)/GDPH-REALEX(-1)*(REALBH(-1)-REALBH_1(-1)/PIEF(-1))/GDPH(-1))^2-1)/(exp(CHI1*REALEX*REALBH)+CHI2*(REALEX*(REALBH-REALBH(-1)/PIEF)/GDPH)^2+CHI3*(REALEX*(REALBH-REALBH(-1)/PIEF)/GDPH-REALEX(-1)*(REALBH(-1)-REALBH_1(-1)/PIEF(-1))/GDPH(-1))^2+1)+ZBH ; - 1 = RNOMF*(1-XI)*DEEH*DEPEX(+1) ; - DEPEX = PIEH/PIEF*REALEX/REALEX(-1) ; - REALFINH = RNOMF(-1)*(1-XI(-1))*REALEX*REALBH(-1)/PIEF ; - SSH*DEEH*PIEH(+1)*REALFINH(+1) = SSH*REALFINH+SSH*RNOMF(-1)*XI(-1)*REALEX*REALBH(-1)/PIEF+REALTBALH ; - REALEXH = REALEX ; - REALEXF = 1/REALEXH ; - ZZ_REALEX = 100*log(REALEX) ; - -(1-BIGGAMMH)*REALPBARMH/REALPMH*(REALPBARMH/REALEX*(1-THETAF)+ETAH*REALPNH/REALEX+THETAF*REALMCTF) = -(REALPBARMH/REALEX-REALMCTF)*(LILCAPPA7H*PIEBARMH/PIE4TARH^0.25*(PIEBARMH/PIE4TARH^0.25-1)+LILCAPPA8H*PIEBARMH/PIEBARMH(-1)*(PIEBARMH/PIEBARMH(-1)-1))+DEEF*PIEF(+1)*(REALPBARMH(+1)/REALEX(+1)-REALMCTF(+1))*MH(+1)/MH*(LILCAPPA7H*PIEBARMH(+1)/PIE4TARH^0.25*(PIEBARMH(+1)/PIE4TARH^0.25-1)+LILCAPPA8H*PIEBARMH(+1)/PIEBARMH*(PIEBARMH(+1)/PIEBARMH-1)) ; - GDPH = AH+REALPNH*GNH+EXPORTSH-IMPORTSH+(RNOMF(-1)-1)*REALEX*REALBH(-1)/PIEF ; - GDPH_NAT = AH+REALPNH_EXOG*GNH+EXPORTSH_NAT-IMPORTSH_NAT ; - CH_NAT = CH*(1+SHOPH) ; - GH_NAT = GAH+REALPNH_EXOG*GNH ; - XH_NAT = SSF/SSH*REALEX_EXOG*REALPBARMF_EXOG*MF ; - MH_NAT = REALPBARMH_EXOG*MH ; - CURBALH_RAT = REALEX*(REALBH-REALBH(-1)/PIEF)/GDPH ; - REALTBALH = SSF*(REALPBARMF*MF+REALP_MOF*M_ONF+REALP_MOF*M_OTF)*REALEX-SSH*(REALPBARMH*MH+REALP_MOH*M_ONH+REALP_MOH*M_OTH) ; - EXPORTSH = SSF/SSH*(REALPBARMF*MF+REALP_MOF*M_ONF+REALP_MOF*M_OTF)*REALEX ; - IMPORTSH = REALPBARMH*MH+REALP_MOH*M_ONH+REALP_MOH*M_OTH ; - EXPORTSH_NAT = SSF/SSH*(REALPBARMF_EXOG*MF+REALP_MOF_EXOG*M_ONF+REALP_MOF_EXOG*M_OTF)*REALEX_EXOG ; - IMPORTSH_NAT = REALPBARMH_EXOG*MH+REALP_MOH_EXOG*M_ONH+REALP_MOH_EXOG*M_OTH ; - ZZ_UTILITYF = (ZUF*(CF-HF)^(1-SIGMAF)-1)/(1-SIGMAF)-CAPAF*LF^(1+ZEDF)/(1+ZEDF) ; - ZZ_GF = 100*log(GF_NAT) ; - ZZ_CURBALF_RAT = CURBALF_RAT*100 ; - ZZ_M_SHARF = REALPBARMF*MF/AF ; - ZZ_M_O_SHARF = (REALP_MOF*M_ONF+REALP_MOF*M_OTF)/AF ; - ZZ_M_ON_SHARF = REALP_MOF*M_ONF/AF ; - ZZ_M_OT_SHARF = REALP_MOF*M_OTF/AF ; - ZZ_N_SHARF = NF*REALPNF/AF ; - ZZ_EYE_SHARF = EYEF/GDPF ; - ZZ_C_SHARF = CF/GDPF ; - ZZ_GDPF = 100*log(GDPF_NAT) ; - ZZ_CF = 100*log(CF_NAT) ; - ZZ_EYEF = 100*log(EYEF) ; - ZZ_EXPORTSF = 100*log(EXPORTSF_NAT) ; - ZZ_IMPORTSF = 100*log(IMPORTSF_NAT) ; - ZZ_XBALF_TOT_RAT = 100*(EXPORTSF_NAT-IMPORTSF_NAT)/GDPF_NAT ; - ZZ_PIE4F = 100*(PIE4F-1) ; - ZZ_DPIE4F = ZZ_PIE4F-ZZ_PIE4F(-1) ; - ZZ_RNOMF = 100*(RNOMF^4-1) ; - ZZ_DRNOMF = ZZ_RNOMF-ZZ_RNOMF(-1) ; - 100*(PIE4TARF-1) = 1*100*(PIE4TARF_SS-1)+(1-1)*100*(PIE4TARF(-1)-1)+E_PIE4TARF ; - log(ZUF) = 0.3*log(ZUF_SS)+0.7*log(ZUF(-1))+E_ZUF ; - ZBF = 0.3*ZBF_SS+0.7*ZBF(-1)+E_ZBF ; - log(LANDF) = 0.05*log(LANDF_SS)+0.95*log(LANDF(-1))+E_LANDF ; - log(ZTF) = 0.05*log(ZTF_SS)+0.95*log(ZTF(-1))+E_LANDF ; - log(ZNF) = 0.05*log(ZNF_SS)+0.95*log(ZNF(-1))+E_LANDF ; - log(Z_OF) = 0.05*log(Z_OF_SS)+0.95*log(Z_OF(-1))+E_LANDF ; - ZEYEF = 0.05*ZEYEF_SS+0.95*ZEYEF(-1)+E_ZEYEF ; - CAPAF = 0.05*CAPAF_SS+0.95*CAPAF(-1)+E_CAPAF ; - log(GAMMAF) = 0.05*log(GAMMAF_SS)+0.95*log(GAMMAF(-1))+E_GAMMAF ; - BIGGAM_O_NF = 1-COST_O_NF/2*(O_NF/NF/(O_NF(-1)/NF(-1))-1)^2 ; - BIGGAM_O_TF = 1-COST_O_TF/2*(O_TF/TF/(O_TF(-1)/TF(-1))-1)^2 ; - O_NF = GAMA_NF*NF/ZNF*(REALP_ONF/(REALMCNF*ZNF))^(-XIXI_NF)*(BIGGAM_O_NF-COST_O_NF*(O_NF/NF/(O_NF(-1)/NF(-1))-1)*O_NF/NF/(O_NF(-1)/NF(-1)))^XIXI_NF/BIGGAM_O_NF ; - O_TF = GAMA_TF*TF/ZTF*(REALP_OTF/(REALMCTF*ZTF))^(-XIXI_TF)*(BIGGAM_O_TF-COST_O_TF*(O_TF/TF/(O_TF(-1)/TF(-1))-1)*O_TF/TF/(O_TF(-1)/TF(-1)))^XIXI_NF/BIGGAM_O_TF ; - NF = ZNF*((1-ALPHANF-GAMA_NF)^(1/XIXI_NF)*LNF^(1-1/XIXI_NF)+ALPHANF^(1/XIXI_NF)*KNF^(1-1/XIXI_NF)+GAMA_NF^(1/XIXI_NF)*(BIGGAM_O_NF*O_NF)^(1-1/XIXI_NF))^(XIXI_NF/(XIXI_NF-1)) ; - TF = ZTF*((1-ALPHATF-GAMA_TF)^(1/XIXI_TF)*LTF^(1-1/XIXI_TF)+ALPHATF^(1/XIXI_TF)*KTF^(1-1/XIXI_TF)+GAMA_TF^(1/XIXI_TF)*(BIGGAM_O_TF*O_TF)^(1-1/XIXI_TF))^(XIXI_TF/(XIXI_TF-1)) ; - REALMCNF = 1/ZNF*((1-ALPHANF-GAMA_NF)*REALWF^(1-XIXI_NF)+ALPHANF*REALRF^(1-XIXI_NF)+GAMA_NF*REALP_ONF^(1-XIXI_NF)*(BIGGAM_O_NF-COST_O_NF*(O_NF/NF/(O_NF(-1)/NF(-1))-1)*O_NF/NF/(O_NF(-1)/NF(-1)))^(XIXI_NF-1))^(1/(1-XIXI_NF)) ; - REALMCTF = 1/ZTF*((1-ALPHATF-GAMA_TF)*REALWF^(1-XIXI_TF)+ALPHATF*REALRF^(1-XIXI_TF)+GAMA_TF*REALP_OTF^(1-XIXI_TF)*(BIGGAM_O_TF-COST_O_TF*(O_TF/TF/(O_TF(-1)/TF(-1))-1)*O_TF/TF/(O_TF(-1)/TF(-1)))^(XIXI_TF-1))^(1/(1-XIXI_TF)) ; - MARGUTF = (CF-B2F*HF)^(-SIGMAF)*ZUF ; - HF = (1-B0F)*HF(-1)+B0F*B1F*CF(-1) ; - VPRIMEF = CAPAF*LF^ZEDF ; - AF^(1-1/EPSF) = GAMMAF^(1/EPSF)*(NYF^(1/EPSQMF)*QF^(1-1/EPSQMF)+(1-NYF)^(1/EPSQMF)*(MF*BIGGAMIMPF)^(1-1/EPSQMF))^(EPSQMF/(EPSQMF-1)*(1-1/EPSF))+(1-GAMMAF)^(1/EPSF)*NNF^(1-1/EPSF) ; - QF = GAMMAF*NYF*REALPQF^(-EPSQMF)*AF*REALPXF^(EPSQMF-EPSF) ; - MF = GAMMAF*(1-NYF)*REALPMF^(-EPSQMF)*AF*REALPXF^(EPSQMF-EPSF)*1/BIGGAMIMPF*(BIGGAMIMPF-COSTF*(MF/AF/(MF(-1)/AF(-1))-1)*MF/AF/(MF(-1)/AF(-1)))^EPSQMF ; - REALPXF = (NYF*REALPQF^(1-EPSQMF)+(1-NYF)*REALPMF^(1-EPSQMF)*(BIGGAMIMPF-COSTF*(MF/AF/(MF(-1)/AF(-1))-1)*MF/AF/(MF(-1)/AF(-1)))^(EPSQMF-1))^(1/(1-EPSQMF)) ; - BIGGAMIMPF = 1-COSTF/2*(MF/AF/(MF(-1)/AF(-1))-1)^2 ; - NNF = (1-GAMMAF)*REALPNF^(-EPSF)*AF ; - NF = NNF+ETAF*MF+ETAF*QF+GNF ; - PIENF = REALPNF/REALPNF(-1)*PIEF ; - BIGGAMNF = LILCAPPA3F/2*(PIENF/PIE4TARF^0.25-1)^2+LILCAPPA4F/2*(PIENF/PIENF(-1)-1)^2 ; - -(1-BIGGAMNF)*(REALPNF*(1-THETAF)+THETAF*REALMCNF) = -(REALPNF-REALMCNF)*(LILCAPPA3F*PIENF/PIE4TARF^0.25*(PIENF/PIE4TARF^0.25-1)+LILCAPPA4F*PIENF/PIENF(-1)*(PIENF/PIENF(-1)-1))+DEEF*PIEF(+1)*(REALPNF(+1)-REALMCNF(+1))*NF(+1)/NF*(LILCAPPA3F*PIENF(+1)/PIE4TARF^0.25*(PIENF(+1)/PIE4TARF^0.25-1)+LILCAPPA4F*PIENF(+1)/PIENF*(PIENF(+1)/PIENF-1)) ; - PIEBARQF = PIEF*REALPBARQF/REALPBARQF(-1) ; - BIGGAMQF = LILCAPPA5F/2*(PIEBARQF/PIE4TARF^0.25-1)^2+LILCAPPA6F/2*(PIEBARQF/PIEBARQF(-1)-1)^2 ; - -(1-BIGGAMQF)*REALPBARQF/REALPQF*(REALPBARQF*(1-THETAF)+ETAF*REALPNF+THETAF*REALMCTF) = -(REALPBARQF-REALMCTF)*(LILCAPPA5F*PIEBARQF/PIE4TARF^0.25*(PIEBARQF/PIE4TARF^0.25-1)+LILCAPPA6F*PIEBARQF/PIEBARQF(-1)*(PIEBARQF/PIEBARQF(-1)-1))+DEEF*PIEF(+1)*(REALPBARQF(+1)-REALMCTF(+1))*QF(+1)/QF*(LILCAPPA5F*PIEBARQF(+1)/PIE4TARF^0.25*(PIEBARQF(+1)/PIE4TARF^0.25-1)+LILCAPPA6F*PIEBARQF(+1)/PIEBARQF*(PIEBARQF(+1)/PIEBARQF-1)) ; - REALPQF = REALPBARQF+ETAF*REALPNF ; - KF = KF(-1)*(1-DELTAF)+PSIF(-1)*KF(-1) ; - PSIF = EYEF/KF-OMEGAF/2*(EYEF/KF-DELTAF*(1+ZEYEF))^2-OMEGA0F/2*(EYEF/KF-EYEF(-1)/KF(-1))^2 ; - PSIPRIMEF = 1-OMEGAF*(EYEF/KF-DELTAF*(1+ZEYEF))-OMEGA0F*(EYEF/KF-EYEF(-1)/KF(-1)) ; - 1/PSIPRIMEF = DEEF*PIEF(+1)*(REALRF(+1)+1/PSIPRIMEF(+1)*(1-DELTAF+PSIF(+1)*(1-PSIPRIMEF(+1)*EYEF(+1)/(PSIF(+1)*KF(+1))))) ; - BIGGAMF = LILCAPPA1F/2*(PIEWF/PIE4TARF^0.25-1)^2+LILCAPPA2F/2*(PIEWF/PIEWF(-1)-1)^2 ; - PIEF*REALWF/REALWF(-1) = PIEWF ; - REALWF = PHIF*VPRIMEF/MARGUTF*((PHIF-1)*(1-BIGGAMF)+PIEWF*LILCAPPA1F/PIE4TARF^0.25*(PIEWF/PIE4TARF^0.25-1)+PIEWF/PIEWF(-1)*LILCAPPA2F*(PIEWF/PIEWF(-1)-1)-DEEF*PIEWF(+1)*LF(+1)/LF*LILCAPPA1F*PIEWF(+1)/PIE4TARF^0.25*(PIEWF(+1)/PIE4TARF^0.25-1)-DEEF*PIEWF(+1)*LF(+1)/LF*LILCAPPA2F*PIEWF(+1)/(REALWF/REALWF(-1))*(PIEWF(+1)/PIEWF-1))^(-1) ; - DEEF = BET*MARGUTF(+1)/PIEF(+1)/MARGUTF*(1+SHOPF+SHOPPRIMEF*VELOF)/(1+SHOPF(+1)+SHOPPRIMEF(+1)*VELOF(+1)) ; - SHOPF = A_ZEROF*VELOF+A_ONEF/VELOF-2*(A_ZEROF*A_ONEF)^0.5 ; - SHOPPRIMEF = A_ZEROF-A_ONEF*VELOF^(-2) ; - VELOF = CF/REALMONEYF ; - DEEF = 1-SHOPPRIMEF*VELOF^2 ; - 1 = RNOMF*DEEF ; - - 100*(RNOMF^4-1) = (1-XDUMF)*100*(RNOM_EXOGF^4-1) - +XDUMF*(XR3F*100*(RNOMF(-1)^4-1)+ - (1-XR3F)*(100*((1/BET*PIE4EU^0.25)^4-1)) - +XR1F*(100*(PIE4EU-1)-100*(PIE4TARF-1))+XR4F*100*(DEPEX^4-1)+XR2F*GDPGAPEU) ; - - - - GDPGAPF = 100*(GDPF_NAT-GDPF_EXOG)/GDPF_EXOG ; - PIE4F = PIEF*PIEF(-1)*PIEF_1(-1)*PIEF_2(-1) ; - AF = CF*(1+SHOPF)+EYEF+GAF ; - GAF = .05*(GA_RATF*(GLAMBDAF*GDPF_NAT+(1-GLAMBDAF)*GDPF_EXOG))+.95*GAF(-1)+E_GAF; - GNF = GN_RATF*(GLAMBDAF*GDPF_NAT+(1-GLAMBDAF)*GDPF_EXOG)/REALPNF_EXOG ; - PIEBARMF = PIEF*REALPBARMF/REALPBARMF(-1) ; - BIGGAMMF = LILCAPPA7F/2*(PIEBARMF/PIE4TARF^0.25-1)^2+LILCAPPA8F/2*(PIEBARMF/PIEBARMF(-1)-1)^2 ; - REALPMF = REALPBARMF+ETAF*REALPNF ; - KNF_RAT = ALPHANF/(1-ALPHANF-GAMA_NF)*(REALWF/REALRF)^XIXI_NF ; - KTF_RAT = ALPHATF/(1-ALPHATF-GAMA_TF)*(REALWF/REALRF)^XIXI_TF ; - KNF_RAT = KNF/LNF ; - KTF_RAT = KTF/LTF ; - KF = KTF+KNF+K_OF ; - LF = (LNF+LTF+L_OF)*(1-COSTLF/2*(LNF/(LTF+L_OF)/(LNF(-1)/(LTF(-1)+L_OF(-1)))-1)^2) ; - T_OF = Z_OF*((1-ALPHA_OF-GAMMA_LANDF)^(1/XIXI_OF)*L_OF^(1-1/XIXI_OF)+ALPHA_OF^(1/XIXI_OF)*K_OF^(1-1/XIXI_OF)+GAMMA_LANDF^(1/XIXI_OF)*LANDF^(1-1/XIXI_OF))^(XIXI_OF/(XIXI_OF-1)) ; - Q_ONF = NY_NF*(REALP_QOF/REALP_ONF)^(-EPS_ONF)*O_NF ; - Q_OTF = NY_TF*(REALP_QOF/REALP_OTF)^(-EPS_OTF)*O_TF ; - M_ONF = (1-NY_NF)*(REALP_MOF/REALP_ONF)^(-EPS_ONF)*O_NF*(BIGGAM_MONF-COST_MONF*(M_ONF/O_NF/(M_ONF(-1)/O_NF(-1))-1)*M_ONF/O_NF/(M_ONF(-1)/O_NF(-1)))^EPS_ONF/BIGGAM_MONF ; - M_OTF = (1-NY_TF)*(REALP_MOF/REALP_OTF)^(-EPS_OTF)*O_TF*(BIGGAM_MOTF-COST_MOTF*(M_OTF/O_TF/(M_OTF(-1)/O_TF(-1))-1)*M_OTF/O_TF/(M_OTF(-1)/O_TF(-1)))^EPS_OTF/BIGGAM_MOTF ; - BIGGAM_MONF = 1-COST_MONF/2*(M_ONF/O_NF/(M_ONF(-1)/O_NF(-1))-1)^2 ; - BIGGAM_MOTF = 1-COST_MOTF/2*(M_OTF/O_TF/(M_OTF(-1)/O_TF(-1))-1)^2 ; - K_OF_RAT = ALPHA_OF/(1-ALPHA_OF-GAMMA_LANDF)*(REALWF/REALRF)^XIXI_OF ; - K_OF_RAT = K_OF/L_OF ; - REALP_QOF = 1/Z_OF*((1-ALPHA_OF-GAMMA_LANDF)*REALWF^(1-XIXI_OF)+ALPHA_OF*REALRF^(1-XIXI_OF)+GAMMA_LANDF*REALPLANDF^(1-XIXI_OF))^(1/(1-XIXI_OF)) ; - LANDF = GAMMA_LANDF*(REALPLANDF/(REALP_QOF*Z_OF))^(-XIXI_OF)*T_OF/Z_OF ; - REALP_ONF = (NY_NF*REALP_QOF^(1-EPS_ONF)+(1-NY_NF)*REALP_MOF^(1-EPS_ONF)*(BIGGAM_MONF-COST_MONF*(M_ONF/O_NF/(M_ONF(-1)/O_NF(-1))-1)*M_ONF/O_NF/(M_ONF(-1)/O_NF(-1)))^(EPS_ONF-1))^(1/(1-EPS_ONF)) ; - REALP_OTF = (NY_TF*REALP_QOF^(1-EPS_OTF)+(1-NY_TF)*REALP_MOF^(1-EPS_OTF)*(BIGGAM_MOTF-COST_MOTF*(M_OTF/O_TF/(M_OTF(-1)/O_TF(-1))-1)*M_OTF/O_TF/(M_OTF(-1)/O_TF(-1)))^(EPS_OTF-1))^(1/(1-EPS_OTF)) ; - SSF*TF = SSF*QF+SSH*MH ; - SSF*T_OF = SSF*Q_ONF+SSF*Q_OTF+SSH*M_ONH+SSH*M_OTH ; - REALP_MOF = REALP_QOH*REALEXF ; - SSH*REALBH+SSF*REALBF = 0 ; - REALTBALF = SSF*(REALPBARMF*MF+REALP_MOF*M_ONF+REALP_MOF*M_OTF)-SSH*(REALPBARMH*MH+REALP_MOH*M_ONH+REALP_MOH*M_OTH)*1/REALEX ; - EXPORTSF = SSH/SSF*(REALPBARMH*MH+REALP_MOH*M_ONH+REALP_MOH*M_OTH)*1/REALEX ; - IMPORTSF = REALPBARMF*MF+REALP_MOF*M_ONF+REALP_MOF*M_OTF ; - EXPORTSF_NAT = SSH/SSF*(REALPBARMH_EXOG*MH+REALP_MOH_EXOG*M_ONH+REALP_MOH_EXOG*M_OTH)*1/REALEX_EXOG ; - IMPORTSF_NAT = REALPBARMF_EXOG*MF+REALP_MOF_EXOG*M_ONF+REALP_MOF_EXOG*M_OTF ; - -(1-BIGGAMMF)*REALPBARMF/REALPMF*(REALPBARMF*REALEX*(1-THETAH)+ETAF*REALPNF*REALEX+THETAH*REALMCTH) = -(REALPBARMF*REALEX-REALMCTH)*(LILCAPPA7F*PIEBARMF/PIE4TARF^0.25*(PIEBARMF/PIE4TARF^0.25-1)+LILCAPPA8F*PIEBARMF/PIEBARMF(-1)*(PIEBARMF/PIEBARMF(-1)-1))+DEEH*PIEH(+1)*(REALPBARMF(+1)*REALEX(+1)-REALMCTH(+1))*MF(+1)/MF*(LILCAPPA7F*PIEBARMF(+1)/PIE4TARF^0.25*(PIEBARMF(+1)/PIE4TARF^0.25-1)+LILCAPPA8F*PIEBARMF(+1)/PIEBARMF*(PIEBARMF(+1)/PIEBARMF-1)) ; - GDPF = AF+REALPNF*GNF+EXPORTSF-IMPORTSF+(RNOMF(-1)-1)*REALBF(-1)/PIEF ; - GDPF_NAT = AF+REALPNF_EXOG*GNF+EXPORTSF_NAT-IMPORTSF_NAT ; - CF_NAT = CF*(1+SHOPF) ; - GF_NAT = GAF+REALPNF_EXOG*GNF ; - XF_NAT = SSH/SSF*1/REALEX_EXOG*REALPBARMH_EXOG*MH ; - MF_NAT = REALPBARMF_EXOG*MF ; - CURBALF_RAT = -(REALTBALH/REALEX/SSF/GDPF)+(RNOMF(-1)-1)*REALBF(-1)/PIEF/GDPF ; -PIEH_1 = PIEH(-1); -PIEH_2 = PIEH_1(-1); -PIEF_1 = PIEF(-1); -PIEF_2 = PIEF_1(-1); -REALBH_1 = REALBH(-1); - -VALUE = ZZ_UTILITYH + BET*VALUE(+1); -VALUE2 = ZUH*CH^(1-SIGMAH)/(1-SIGMAH)-CAPAH*LH^(1+ZEDH)/(1+ZEDH) + BET*VALUE2(+1); -end; - -initval; -AF=2.17350447531715; -AH=2.61461230039988; -BIGGAMF=0; -BIGGAMH=0; -BIGGAMIMPF=1; -BIGGAMIMPH=1; -BIGGAMMF=0; -BIGGAMMH=0; -BIGGAMNF=0; -BIGGAMNH=0; -BIGGAMQF=0; -BIGGAMQH=0; -BIGGAM_MONF=1; -BIGGAM_MONH=1; -BIGGAM_MOTF=1; -BIGGAM_MOTH=1; -BIGGAM_O_NF=1; -BIGGAM_O_NH=1; -BIGGAM_O_TF=1; -BIGGAM_O_TH=1; -CAPAF=11; -CAPAH=11; -CF=1.77599320017707; -CF_NAT=1.77797456682707; -CH=2.10139281352027; -CH_NAT=2.10373720855446; -CURBALF_RAT=2.20209042676066e-018; -CURBALH_RAT=0; -DEEF=0.963834712172592; -DEEH=0.963834712172592; -DEPEX=1; -EXPORTSF=0.0374229290542059; -EXPORTSF_NAT=0.0374229290542059; -EXPORTSH=0.976573287861717; -EXPORTSH_NAT=0.976573287861717; -EYEF=0.27477965986135; -EYEH=0.365618852934316; -GAF=0.12075024862873; -GAH=0.145256238911104; -GAMMAF=0.5; -GAMMAH=0.25; -GDPF=2.41500497257461; -GDPF_NAT=2.41500497257461; -GDPGAPF=0; -GDPGAPH=0; -GDPH=2.90512477822209; -GDPH_NAT=2.90512477822209; -GF_NAT=0.362250745886191; -GH_NAT=0.435768716733313; -GNF=0.287269571519256; -GNH=0.321902361090147; -HF=1.68719354016822; -HH=1.99632317284426; -IMPORTSF=0.0374229290542059; -IMPORTSF_NAT=0.0374229290542059; -IMPORTSH=0.976573287861718; -IMPORTSH_NAT=0.976573287861718; -KF=10.991186394454; -KH=14.6247541173726; -KNF=6.33686501417153; -KNF_RAT=22.6981730731029; -KNH=11.034700665508; -KNH_RAT=22.8755992006951; -KTF=2.97137434524903; -KTF_RAT=22.6981730731029; -KTH=2.23720856941572; -KTH_RAT=114.377996003476; -K_OF=1.68294703503345; -K_OF_RAT=7.27127622255245; -K_OH=1.35284488244891; -K_OH_RAT=8.16985685739111; -LANDF=0.1; -LANDH=0.1; -LF=0.64153899810027; -LH=0.667528221502678; -LNF=0.279179517830034; -LNH=0.482378650224502; -LTF=0.130908083909629; -LTH=0.019559781143112; -L_OF=0.231451396360608; -L_OH=0.165589790135064; -MARGUTF=2.24145263303312; -MARGUTH=2.11921125101343; -MF=0.0196445696804563; -MF_NAT=0.0171196449669319; -MH=0.438784845846124; -MH_NAT=0.522472906750236; -M_ONF=0.0143006671963624; -M_ONH=0.134410532365428; -M_OTF=0.00670562423725087; -M_OTH=0.143002828997546; -NF=1.91582345366461; -NH=2.609674642079; -NNF=1.31534385473198; -NNH=2.19524942542191; -O_NF=0.387338325509274; -O_NH=0.147043832240678; -O_TF=0.18162406186278; -O_TH=0.148205762233076; -PIE4F=1.125; -PIE4H=1.125; -PIE4TARF=1.125; -PIE4TARH=1.125; -PIEBARMF=1.02988357195356; -PIEBARMH=1.02988357195356; -PIEBARQF=1.02988357195356; -PIEBARQH=1.02988357195356; -PIEF=1.02988357195356; -PIEF_1=1.02988357195356; -PIEF_2=1.02988357195356; -PIEH=1.02988357195356; -PIEH_1=1.02988357195356; -PIEH_2=1.02988357195356; -PIENF=1.02988357195356; -PIENH=1.02988357195356; -PIEWF=1.02988357195356; -PIEWH=1.02988357195356; -PSIF=0.025; -PSIH=0.025; -PSIPRIMEF=1; -PSIPRIMEH=1; -QF=0.875241222929181; -QH=0.0238294319885835; -Q_ONF=0.373740369418894; -Q_ONH=0.0132636199615755; -Q_OTF=0.175247940896905; -Q_OTH=0.00547180886242481; -REALBF=0; -REALBH=0; -REALBH_1=0; -REALEX=1.3734519289908; -REALEXF=0.728092464608345; -REALEXH=1.3734519289908; -REALFINH=0; -REALMCNF=0.700562935771035; -REALMCNH=0.752071934789911; -REALMCTF=0.700562935771035; -REALMCTH=0.930081384894704; -REALMONEYF=0.558667031035572; -REALMONEYH=0.661026677383566; -REALPBARMF=0.87146958398196; -REALPBARMH=1.19072687148694; -REALPBARQF=0.899522809530009; -REALPBARQH=1.15219711474356; -REALPLANDF=0.554831427212494; -REALPLANDH=0.414697221827051; -REALPMF=1.16570601700579; -REALPMH=1.37122413583652; -REALPNF=0.840675522925242; -REALPNH=0.902486321747893; -REALPQF=1.19375924255384; -REALPQH=1.33269437909314; -REALPXF=1.19317131724075; -REALPXH=1.36926881180313; -REALP_MOF=0.966533486000563; -REALP_MOH=1.63690883121281; -REALP_ONF=1.18566549908199; -REALP_ONH=1.61601524261254; -REALP_OTF=1.18566549908199; -REALP_OTH=1.62845456685201; -REALP_QOF=1.1918209852569; -REALP_QOH=1.32748728078168; -REALRF=0.0324170717777328; -REALRH=0.0324170717777329; -REALTBALF=-6.93889390390723e-018; -REALTBALH=-6.93889390390723e-018; -REALWF=2.42667732699502; -REALWH=2.83454771236558; -RNOMF=1.03752229232945; -RNOMH=1.03752229232945; -SHOPF=0.00111563864647424; -SHOPH=0.00111563864647424; -SHOPPRIMEF=0.00357861859467432; -SHOPPRIMEH=0.00357861859467432; -TF=0.89833516218424; -TH=0.397076255917254; -T_OF=0.563589013545429; -T_OH=0.417854966062653; -VALUE=-2.621110285550203e+02; -VALUE2=2.305114066037580e+02; -VELOF=3.17898336847443; -VELOH=3.17898336847443; -VPRIMEF=3.62618818940983; -VPRIMEH=4.00467026905301; -XF_NAT=0.0200215045456245; -XH_NAT=0.446747178665936; -XI=0; -ZBF=0; -ZBH=0; -ZEYEF=0; -ZEYEH=0; -ZNF=1; -ZNH=1; -ZTF=1; -ZTH=0.6; -ZUF=1; -ZUH=1; -ZZ_CF=57.5474832617676; -ZZ_CH=74.3715386197541; -ZZ_CURBALF_RAT=2.20209042676066e-016; -ZZ_CURBALH_RAT=0; -ZZ_C_SHARF=0.735399396831762; -ZZ_C_SHARH=0.723339950584259; -ZZ_DPIE4F=0; -ZZ_DPIE4H=0; -ZZ_DRNOMF=0; -ZZ_DRNOMH=0; -ZZ_EXPORTSF=-328.547168610049; -ZZ_EXPORTSH=-2.37054799079326; -ZZ_EYEF=-129.17857393452; -ZZ_EYEH=-100.616387362469; -ZZ_EYE_SHARF=0.113780163180538; -ZZ_EYE_SHARH=0.12585306341233; -ZZ_GDPF=88.1701346139521; -ZZ_GDPH=106.647634229781; -ZZ_GDP_PPP_RATH=0.875857186130553; -ZZ_GF=-101.541863874636; -ZZ_GH=-83.0643642588075; -ZZ_IMPORTSF=-328.547168610049; -ZZ_IMPORTSH=-2.37054799079323; -ZZ_M_ON_SHARF=0.0063593490946998; -ZZ_M_ON_SHARH=0.084149297164759; -ZZ_M_OT_SHARF=0.00298191719568198; -ZZ_M_OT_SHARH=0.0895286056899133; -ZZ_M_O_SHARF=0.00934126629038178; -ZZ_M_O_SHARH=0.173677902854672; -ZZ_M_SHARF=0.00787651700806085; -ZZ_M_SHARH=0.19982806118916; -ZZ_N_SHARF=0.741008772713445; -ZZ_N_SHARH=0.90078198910348; -ZZ_PIE4F=12.5; -ZZ_PIE4H=12.5; -ZZ_REALEX=31.7327227026121; -ZZ_RNOMF=15.8749999999999; -ZZ_RNOMH=15.8749999999999; -ZZ_UTILITYF=-1.86610854895021; -ZZ_UTILITYH=-1.9297829736965; -ZZ_XBALF_TOT_RAT=0; -ZZ_XBALH_TOT_RAT=-7.6432037132987e-015; -Z_OF=1; -Z_OH=1; - -E_ZBH=0; - -E_ZUH=0; -E_ZUF=0; - -E_ZEYEH=0; -E_ZEYEF=0; - -E_GAMMAH=0; -E_GAMMAF=0; - -E_LANDH=0; -E_LANDF=0; - -E_GAH = 0; -E_GAF = 0; - -E_CAPAH=0; -E_CAPAF=0; - -ZZ_PIE4EU= 12.5; -ZZ_RNOMEU=15.8749999999999; -GDPGAPEU= 0; -ZZ_DRNOMEU=0; -PIE4EU = 1.125; -end; - -vcov = [ -/* E_ZBH 0.000289 */ - 0.000289 0 0 0 0 0 0 0 0 0 0 0 0; -/* E_ZUH */ -0 0.000016 0 0 0 0 0 0 0 0 0 0 0; -/* E_ZUF */ -0 0 0.000001 0 0 0 0 0 0 0 0 0 0; -/* E_ZEYEH */ -0 0 0 0.0049 0 0 0 0 0 0 0 0 0; -/* E_ZEYEF */ -0 0 0 0 0.000025 0 0 0 0 0 0 0 0; -/* E_GAMMAH */ -0 0 0 0 0 0.0004 0 0 0 0 0 0 0; -/* E_GAMMAF */ -0 0 0 0 0 0 0.000324 0 0 0 0 0 0; -/* E_LANDH */ -0 0 0 0 0 0 0 0.000004 0 0 0 0 0; -/* E_LANDF */ -0 0 0 0 0 0 0 0 0.00000001 0 0 0 0; -/* E_GAH */ -0 0 0 0 0 0 0 0 0 0.00001225 0 0 0; -/* E_GAF */ -0 0 0 0 0 0 0 0 0 0 0.0000005625 0 0; -/* E_CAPAH */ -0 0 0 0 0 0 0 0 0 0 0 0.1 0; -/* E_CAPAF */ -0 0 0 0 0 0 0 0 0 0 0 0 0.0001 -]; - -order = 2; \ No newline at end of file diff --git a/dynare++/tests/dm7.mod b/dynare++/tests/dm7.mod deleted file mode 100644 index 0a31faf4b..000000000 --- a/dynare++/tests/dm7.mod +++ /dev/null @@ -1,40 +0,0 @@ -var C K r w N tau I; -varexo e; - -parameters alph bet delt thet tau_m rho; -alph = 0.3; -bet = 0.96; -thet = 0.3; -delt = 0.05; -tau_m = 0.35; -rho = 0.8; - -model; -C = C(+1)/(bet*(r(+1)+1-delt)); -I = K(-1)^alph*N^(1-alph)-C; -K = I+(1-delt)*K(-1); -N = 1-(1-thet)*C/(thet*w); -r = (1-tau)*alph*(K(-1)/N)^(alph-1); -w = (1-tau)*(1-alph)*(K(-1)/N)^alph; -tau = (1-rho)*tau_m + rho*tau(-1)+e; -end; - -initval; -C=0.2; -I=0.02; -K=0.5; -N=0.18; -r=0.09; -w=0.6; -tau=0.35; -e=0; -end; - -vcov = [0.007208]; - -order=7; - - - - - diff --git a/dynare++/tests/example1.mod b/dynare++/tests/example1.mod deleted file mode 100644 index ca528c0d9..000000000 --- a/dynare++/tests/example1.mod +++ /dev/null @@ -1,41 +0,0 @@ -// this is an example from the tutorial - -var Y, C, K, A, H, B; - -varexo EPS, NU; - -parameters rho, beta, alpha, delta, theta, psi, tau; -alpha = 0.36; -rho = 0.95; -tau = 0.025; -beta = 1/(1.03^0.25); -delta = 0.025; -psi = 0; -theta = 2.95; - - -model; -C*theta*H^(1+psi) = (1-alpha)*Y; -beta*exp(B)*C/exp(B(1))/C(1)* - (exp(B(1))*alpha*Y(1)/K(1)+1-delta) = 1; -Y = exp(A)*K^alpha*H^(1-alpha); -K = exp(B(-1))*(Y(-1)-C(-1)) + (1-delta)*K(-1); -A = rho*A(-1) + tau*B(-1) + EPS; -B = tau*A(-1) + rho*B(-1) + NU; -end; - -initval; -A = 0; -B = 0; -H = ((1-alpha)/(theta*(1-(delta*alpha)/(1/beta-1+delta))))^(1/(1+psi)); -Y = (alpha/(1/beta-1+delta))^(alpha/(1-alpha))*H; -K = alpha/(1/beta-1+delta)*Y; -C = Y - delta*K; -end; - -vcov = [ - 0.0002 0.00005; - 0.00005 0.0001 -]; - -order = 7; diff --git a/dynare++/tests/example1_optim.mod b/dynare++/tests/example1_optim.mod deleted file mode 100644 index 0bd57477c..000000000 --- a/dynare++/tests/example1_optim.mod +++ /dev/null @@ -1,43 +0,0 @@ -// this is a file trying to replicate example1.mod as optimization of a social planner -// it serves also as an example combining +2 lead and optimal policy - -var Y, C, K, A, H, B; - -varexo EPS, NU; - -parameters rho, beta, alpha, delta, theta, psi, tau; -alpha = 0.36; -rho = 0.95; -tau = 0.025; -beta = 1/(1.03^0.25); -delta = 0.025; -psi = 0; -theta = 2.95; - -planner_objective log(C)-theta*H^(1+psi)/(1+psi); - -planner_discount beta; - -model; -//Y = exp(A)*K^alpha*H^(1-alpha); -Y = exp(A)*exp(A(+1))*exp(A(+2))*K^alpha*H^(1-alpha); -K = exp(B(-1))*(Y(-1)-C(-1)) + (1-delta)*K(-1); -A = rho*A(-1) + tau*B(-1) + EPS; -B = tau*A(-1) + rho*B(-1) + NU; -end; - -initval; -A = 0; -B = 0; -H = ((1-alpha)/(theta*(1-(delta*alpha)/(1/beta-1+delta))))^(1/(1+psi)); -Y = (alpha/(1/beta-1+delta))^(alpha/(1-alpha))*H; -K = alpha/(1/beta-1+delta)*Y; -C = Y - delta*K; -end; - -vcov = [ - 0.0002 0.00005; - 0.00005 0.0001 -]; - -order = 2; diff --git a/dynare++/tests/gentay1a.mod b/dynare++/tests/gentay1a.mod deleted file mode 100644 index 8c2a9566d..000000000 --- a/dynare++/tests/gentay1a.mod +++ /dev/null @@ -1,671 +0,0 @@ -var AF AH BIGGAMF BIGGAMH BIGGAMIMPF BIGGAMIMPH BIGGAMMF BIGGAMMH BIGGAMNF BIGGAMNH BIGGAMQF BIGGAMQH BIGGAM_MONF BIGGAM_MONH BIGGAM_MOTF BIGGAM_MOTH BIGGAM_O_NF BIGGAM_O_NH BIGGAM_O_TF BIGGAM_O_TH CAPAF CAPAH CF CF_NAT CH CH_NAT CURBALF_RAT CURBALH_RAT DEEF DEEH DEPEX EXPORTSF EXPORTSF_NAT EXPORTSH EXPORTSH_NAT EYEF EYEH GAF GAH GAMMAF GAMMAH GDPF GDPF_NAT GDPGAPF GDPGAPH GDPH GDPH_NAT GF_NAT GH_NAT GNF GNH HF HH IMPORTSF IMPORTSF_NAT IMPORTSH IMPORTSH_NAT KF KH KNF KNF_RAT KNH KNH_RAT KTF KTF_RAT KTH KTH_RAT K_OF K_OF_RAT K_OH K_OH_RAT LANDF LANDH LF LH LNF LNH LTF LTH L_OF L_OH MARGUTF MARGUTH MF MF_NAT MH MH_NAT M_ONF M_ONH M_OTF M_OTH NF NH NNF NNH O_NF O_NH O_TF O_TH PIE4F PIE4H PIE4TARF PIE4TARH PIEBARMF PIEBARMH PIEBARQF PIEBARQH PIEF PIEH PIENF PIENH PIEWF PIEWH PSIF PSIH PSIPRIMEF PSIPRIMEH QF QH Q_ONF Q_ONH Q_OTF Q_OTH REALBF REALBH REALEX REALEXF REALEXH REALFINH REALMCNF REALMCNH REALMCTF REALMCTH REALMONEYF REALMONEYH REALPBARMF REALPBARMH REALPBARQF REALPBARQH REALPLANDF REALPLANDH REALPMF REALPMH REALPNF REALPNH REALPQF REALPQH REALPXF REALPXH REALP_MOF REALP_MOH REALP_ONF REALP_ONH REALP_OTF REALP_OTH REALP_QOF REALP_QOH REALRF REALRH REALTBALF REALTBALH REALWF REALWH RNOMF RNOMH SHOPF SHOPH SHOPPRIMEF SHOPPRIMEH TF TH T_OF T_OH VELOF VELOH VPRIMEF VPRIMEH XF_NAT XH_NAT XI ZBF ZBH ZEYEF ZEYEH ZNF ZNH ZTF ZTH ZUF ZUH ZZ_CF ZZ_CH ZZ_CURBALF_RAT ZZ_CURBALH_RAT ZZ_C_SHARF ZZ_C_SHARH ZZ_DPIE4F ZZ_DPIE4H ZZ_DRNOMF ZZ_DRNOMH ZZ_EXPORTSF ZZ_EXPORTSH ZZ_EYEF ZZ_EYEH ZZ_EYE_SHARF ZZ_EYE_SHARH ZZ_GDPF ZZ_GDPH ZZ_GDP_PPP_RATH ZZ_GF ZZ_GH ZZ_IMPORTSF ZZ_IMPORTSH ZZ_M_ON_SHARF ZZ_M_ON_SHARH ZZ_M_OT_SHARF ZZ_M_OT_SHARH ZZ_M_O_SHARF ZZ_M_O_SHARH ZZ_M_SHARF ZZ_M_SHARH ZZ_N_SHARF ZZ_N_SHARH ZZ_PIE4F ZZ_PIE4H ZZ_REALEX ZZ_RNOMF ZZ_RNOMH ZZ_UTILITYF ZZ_UTILITYH ZZ_XBALF_TOT_RAT ZZ_XBALH_TOT_RAT Z_OF Z_OH PIEF1 PIEF2 PIEH1 PIEH2 REALBH1; - -varexo E_ZBH E_ZUH E_ZUF E_ZEYEH E_ZEYEF E_GAMMAH E_GAMMAF E_LANDH E_LANDF E_GAH E_GAF E_CAPAH E_CAPAF; - -parameters COSTLF COSTLH EPSF EPSH EPSQMF EPSQMH GLAMBDAF GLAMBDAH SIGMAF SIGMAH SSF SSH XR1F XR1H XR2F XR2H XR3F XR3H XR4F XR4H ALPHANF ALPHANH ALPHATF ALPHATH ALPHA_OF ALPHA_OH A_ONEF A_ONEH A_ZEROF A_ZEROH B0F B0H B1F B1H B2F B2H BET CAPAF_SS CAPAH_SS CHI0 CHI1 CHI2 CHI3 COSTF COSTH COST_MONF COST_MONH COST_MOTF COST_MOTH COST_O_NF COST_O_NH COST_O_TF COST_O_TH DELTAF DELTAH EPS_ONF EPS_ONH EPS_OTF EPS_OTH ETAF ETAH E_PIE4TARF E_PIE4TARH E_ZBF GAMA_NF GAMA_NH GAMA_TF GAMA_TH GAMMAF_SS GAMMAH_SS GAMMA_LANDF GAMMA_LANDH GA_RATF GA_RATH GDPF_EXOG GDPH_EXOG GN_RATF GN_RATH LANDF_SS LANDH_SS LILCAPPA1F LILCAPPA1H LILCAPPA2F LILCAPPA2H LILCAPPA3F LILCAPPA3H LILCAPPA4F LILCAPPA4H LILCAPPA5F LILCAPPA5H LILCAPPA6F LILCAPPA6H LILCAPPA7F LILCAPPA7H LILCAPPA8F LILCAPPA8H NYF NYH NY_NF NY_NH NY_TF NY_TH OMEGA0F OMEGA0H OMEGAF OMEGAH PHIF PHIH PIE4TARF_SS PIE4TARH_SS REALEX_EXOG REALPBARMF_EXOG REALPBARMH_EXOG REALPNF_EXOG REALPNH_EXOG REALP_MOF_EXOG REALP_MOH_EXOG RNOM_EXOGF RNOM_EXOGH THETAF THETAH XDUMF XDUMH XIXI_NF XIXI_NH XIXI_OF XIXI_OH XIXI_TF XIXI_TH ZBF_SS ZBH_SS ZEDF ZEDH ZEYEF_SS ZEYEH_SS ZNF_SS ZNH_SS ZTF_SS ZTH_SS ZUF_SS ZUH_SS Z_OF_SS Z_OH_SS; - -COSTLF=5; -COSTLH=5; -EPSF=1.1; -EPSH=1.1; -EPSQMF=4; -EPSQMH=1.1; -GLAMBDAF=0; -GLAMBDAH=0; -SIGMAF=0.333333333333333; -SIGMAH=0.333333333333333; -SSF=0.95; -SSH=0.05; -XR1F=1; -XR1H=0.40; -XR2F=0; -XR2H=0.1; -XR3F=0.5; -XR3H=0.84; -XR4F=0; -XR4H=0; -ALPHANF=0.33; -ALPHANH=0.4; -ALPHATF=0.33; -ALPHATH=0.4; -ALPHA_OF=0.2; -ALPHA_OH=0.2; -A_ONEF=0.075; -A_ONEH=0.075; -A_ZEROF=0.011; -A_ZEROH=0.011; -B0F=1; -B0H=1; -B1F=0.95; -B1H=0.95; -B2F=1; -B2H=1; -BET=0.99263753614514; -CAPAF_SS=11; -CAPAH_SS=11; -CHI0=0.05; -CHI1=.1; -CHI2=0; -CHI3=0; -COSTF=5; -COSTH=5; -COST_MONF=5; -COST_MONH=5; -COST_MOTF=5; -COST_MOTH=5; -COST_O_NF=5; -COST_O_NH=5; -COST_O_TF=5; -COST_O_TH=5; -DELTAF=0.025; -DELTAH=0.025; -EPS_ONF=3; -EPS_ONH=3; -EPS_OTF=3; -EPS_OTH=3; -ETAF=0.35; -ETAH=0.2; -E_PIE4TARF=0; -E_PIE4TARH=0; -E_ZBF=0; -GAMA_NF=0.3; -GAMA_NH=0.1; -GAMA_TF=0.3; -GAMA_TH=0.5; -GAMMAF_SS=0.5; -GAMMAH_SS=0.25; -GAMMA_LANDF=0.1; -GAMMA_LANDH=0.1; -GA_RATF=0.05; -GA_RATH=0.05; -GDPF_EXOG=2.41500497257461; -GDPH_EXOG=2.90512477822209; -GN_RATF=0.1; -GN_RATH=0.1; -LANDF_SS=0.1; -LANDH_SS=0.1; -LILCAPPA1F=0; -LILCAPPA1H=0; -LILCAPPA2F=800; -LILCAPPA2H=400; -LILCAPPA3F=0; -LILCAPPA3H=0; -LILCAPPA4F=800; -LILCAPPA4H=400; -LILCAPPA5F=0; -LILCAPPA5H=0; -LILCAPPA6F=800; -LILCAPPA6H=400; -LILCAPPA7F=0; -LILCAPPA7H=0; -LILCAPPA8F=0; -LILCAPPA8H=0; -NYF=0.98; -NYH=0.0499999999999999; -NY_NF=0.98; -NY_NH=0.0499999999999999; -NY_TF=0.98; -NY_TH=0.02; -OMEGA0F=60; -OMEGA0H=60; -OMEGAF=5; -OMEGAH=5; -PHIF=3; -PHIH=3; -PIE4TARF_SS=1.125; -PIE4TARH_SS=1.125; -REALEX_EXOG=1.3734519289908; -REALPBARMF_EXOG=0.87146958398196; -REALPBARMH_EXOG=1.19072687148694; -REALPNF_EXOG=0.840675522925242; -REALPNH_EXOG=0.902486321747893; -REALP_MOF_EXOG=0.966533486000563; -REALP_MOH_EXOG=1.63690883121281; -RNOM_EXOGF=1.00741707177773; -RNOM_EXOGH=1.00741707177773; -THETAF=6; -THETAH=6; -XDUMF=1; -XDUMH=1; -XIXI_NF=0.75; -XIXI_NH=0.75; -XIXI_OF=0.75; -XIXI_OH=0.75; -XIXI_TF=0.75; -XIXI_TH=0.75; -ZBF_SS=0; -ZBH_SS=0; -ZEDF=2.5; -ZEDH=2.5; -ZEYEF_SS=0; -ZEYEH_SS=0; -ZNF_SS=1; -ZNH_SS=1; -ZTF_SS=1; -ZTH_SS=0.6; -ZUF_SS=1; -ZUH_SS=1; -Z_OF_SS=1; -Z_OH_SS=1; - -model; - ZZ_UTILITYH = (ZUH*(CH-HH)^(1-SIGMAH)-1)/(1-SIGMAH)-CAPAH*LH^(1+ZEDH)/(1+ZEDH) ; - ZZ_GH = 100*log(GH_NAT) ; - ZZ_CURBALH_RAT = CURBALH_RAT*100 ; - ZZ_M_SHARH = REALPBARMH*MH/AH ; - ZZ_M_O_SHARH = (REALP_MOH*M_ONH+REALP_MOH*M_OTH)/AH ; - ZZ_M_ON_SHARH = REALP_MOH*M_ONH/AH ; - ZZ_M_OT_SHARH = REALP_MOH*M_OTH/AH ; - ZZ_N_SHARH = NH*REALPNH/AH ; - ZZ_EYE_SHARH = EYEH/GDPH ; - ZZ_C_SHARH = CH/GDPH ; - ZZ_GDPH = 100*log(GDPH_NAT) ; - ZZ_CH = 100*log(CH_NAT) ; - ZZ_EYEH = 100*log(EYEH) ; - ZZ_EXPORTSH = 100*log(EXPORTSH_NAT) ; - ZZ_IMPORTSH = 100*log(IMPORTSH_NAT) ; - ZZ_XBALH_TOT_RAT = 100*(EXPORTSH_NAT-IMPORTSH_NAT)/GDPH_NAT ; - ZZ_PIE4H = 100*(PIE4H-1) ; - ZZ_DPIE4H = ZZ_PIE4H-ZZ_PIE4H(-1) ; - ZZ_RNOMH = 100*(RNOMH^4-1) ; - ZZ_DRNOMH = ZZ_RNOMH-ZZ_RNOMH(-1) ; - 100*(PIE4TARH-1) = 1*100*(PIE4TARH_SS-1)+(1-1)*100*(PIE4TARH(-1)-1)+E_PIE4TARH ; - log(ZUH) = 0.3*log(ZUH_SS)+0.7*log(ZUH(-1))+E_ZUH ; - ZBH = 0.3*ZBH_SS+0.7*ZBH(-1)+E_ZBH ; - log(LANDH) = 0.05*log(LANDH_SS)+0.95*log(LANDH(-1))+E_LANDH ; - log(ZTH) = 0.05*log(ZTH_SS)+0.95*log(ZTH(-1))+E_LANDH ; - log(ZNH) = 0.05*log(ZNH_SS)+0.95*log(ZNH(-1))+E_LANDH ; - log(Z_OH) = 0.05*log(Z_OH_SS)+0.95*log(Z_OH(-1))+E_LANDH ; - ZEYEH = 0.05*ZEYEH_SS+0.95*ZEYEH(-1)+E_ZEYEH ; - CAPAH = 0.05*CAPAH_SS+0.95*CAPAH(-1)+E_CAPAH ; - log(GAMMAH) = 0.05*log(GAMMAH_SS)+0.95*log(GAMMAH(-1))+E_GAMMAH ; - BIGGAM_O_NH = 1-COST_O_NH/2*(O_NH/NH/(O_NH(-1)/NH(-1))-1)^2 ; - BIGGAM_O_TH = 1-COST_O_TH/2*(O_TH/TH/(O_TH(-1)/TH(-1))-1)^2 ; - O_NH = GAMA_NH*NH/ZNH*(REALP_ONH/(REALMCNH*ZNH))^(-XIXI_NH)*(BIGGAM_O_NH-COST_O_NH*(O_NH/NH/(O_NH(-1)/NH(-1))-1)*O_NH/NH/(O_NH(-1)/NH(-1)))^XIXI_NH/BIGGAM_O_NH ; - O_TH = GAMA_TH*TH/ZTH*(REALP_OTH/(REALMCTH*ZTH))^(-XIXI_TH)*(BIGGAM_O_TH-COST_O_TH*(O_TH/TH/(O_TH(-1)/TH(-1))-1)*O_TH/TH/(O_TH(-1)/TH(-1)))^XIXI_NH/BIGGAM_O_TH ; - NH = ZNH*((1-ALPHANH-GAMA_NH)^(1/XIXI_NH)*LNH^(1-1/XIXI_NH)+ALPHANH^(1/XIXI_NH)*KNH^(1-1/XIXI_NH)+GAMA_NH^(1/XIXI_NH)*(BIGGAM_O_NH*O_NH)^(1-1/XIXI_NH))^(XIXI_NH/(XIXI_NH-1)) ; - TH = ZTH*((1-ALPHATH-GAMA_TH)^(1/XIXI_TH)*LTH^(1-1/XIXI_TH)+ALPHATH^(1/XIXI_TH)*KTH^(1-1/XIXI_TH)+GAMA_TH^(1/XIXI_TH)*(BIGGAM_O_TH*O_TH)^(1-1/XIXI_TH))^(XIXI_TH/(XIXI_TH-1)) ; - REALMCNH = 1/ZNH*((1-ALPHANH-GAMA_NH)*REALWH^(1-XIXI_NH)+ALPHANH*REALRH^(1-XIXI_NH)+GAMA_NH*REALP_ONH^(1-XIXI_NH)*(BIGGAM_O_NH-COST_O_NH*(O_NH/NH/(O_NH(-1)/NH(-1))-1)*O_NH/NH/(O_NH(-1)/NH(-1)))^(XIXI_NH-1))^(1/(1-XIXI_NH)) ; - REALMCTH = 1/ZTH*((1-ALPHATH-GAMA_TH)*REALWH^(1-XIXI_TH)+ALPHATH*REALRH^(1-XIXI_TH)+GAMA_TH*REALP_OTH^(1-XIXI_TH)*(BIGGAM_O_TH-COST_O_TH*(O_TH/TH/(O_TH(-1)/TH(-1))-1)*O_TH/TH/(O_TH(-1)/TH(-1)))^(XIXI_TH-1))^(1/(1-XIXI_TH)) ; - MARGUTH = (CH-B2H*HH)^(-SIGMAH)*ZUH ; - HH = (1-B0H)*HH(-1)+B0H*B1H*CH(-1) ; - VPRIMEH = CAPAH*LH^ZEDH ; - AH^(1-1/EPSH) = GAMMAH^(1/EPSH)*(NYH^(1/EPSQMH)*QH^(1-1/EPSQMH)+(1-NYH)^(1/EPSQMH)*(MH*BIGGAMIMPH)^(1-1/EPSQMH))^(EPSQMH/(EPSQMH-1)*(1-1/EPSH))+(1-GAMMAH)^(1/EPSH)*NNH^(1-1/EPSH) ; - QH = GAMMAH*NYH*REALPQH^(-EPSQMH)*AH*REALPXH^(EPSQMH-EPSH) ; - MH = GAMMAH*(1-NYH)*REALPMH^(-EPSQMH)*AH*REALPXH^(EPSQMH-EPSH)*1/BIGGAMIMPH*(BIGGAMIMPH-COSTH*(MH/AH/(MH(-1)/AH(-1))-1)*MH/AH/(MH(-1)/AH(-1)))^EPSQMH ; - REALPXH = (NYH*REALPQH^(1-EPSQMH)+(1-NYH)*REALPMH^(1-EPSQMH)*(BIGGAMIMPH-COSTH*(MH/AH/(MH(-1)/AH(-1))-1)*MH/AH/(MH(-1)/AH(-1)))^(EPSQMH-1))^(1/(1-EPSQMH)) ; - BIGGAMIMPH = 1-COSTH/2*(MH/AH/(MH(-1)/AH(-1))-1)^2 ; - NNH = (1-GAMMAH)*REALPNH^(-EPSH)*AH ; - NH = NNH+ETAH*MH+ETAH*QH+GNH ; - PIENH = REALPNH/REALPNH(-1)*PIEH ; - BIGGAMNH = LILCAPPA3H/2*(PIENH/PIE4TARH^0.25-1)^2+LILCAPPA4H/2*(PIENH/PIENH(-1)-1)^2 ; - -(1-BIGGAMNH)*(REALPNH*(1-THETAH)+THETAH*REALMCNH) = -(REALPNH-REALMCNH)*(LILCAPPA3H*PIENH/PIE4TARH^0.25*(PIENH/PIE4TARH^0.25-1)+LILCAPPA4H*PIENH/PIENH(-1)*(PIENH/PIENH(-1)-1))+DEEH*PIEH(+1)*(REALPNH(+1)-REALMCNH(+1))*NH(+1)/NH*(LILCAPPA3H*PIENH(+1)/PIE4TARH^0.25*(PIENH(+1)/PIE4TARH^0.25-1)+LILCAPPA4H*PIENH(+1)/PIENH*(PIENH(+1)/PIENH-1)) ; - PIEBARQH = PIEH*REALPBARQH/REALPBARQH(-1) ; - BIGGAMQH = LILCAPPA5H/2*(PIEBARQH/PIE4TARH^0.25-1)^2+LILCAPPA6H/2*(PIEBARQH/PIEBARQH(-1)-1)^2 ; - -(1-BIGGAMQH)*REALPBARQH/REALPQH*(REALPBARQH*(1-THETAH)+ETAH*REALPNH+THETAH*REALMCTH) = -(REALPBARQH-REALMCTH)*(LILCAPPA5H*PIEBARQH/PIE4TARH^0.25*(PIEBARQH/PIE4TARH^0.25-1)+LILCAPPA6H*PIEBARQH/PIEBARQH(-1)*(PIEBARQH/PIEBARQH(-1)-1))+DEEH*PIEH(+1)*(REALPBARQH(+1)-REALMCTH(+1))*QH(+1)/QH*(LILCAPPA5H*PIEBARQH(+1)/PIE4TARH^0.25*(PIEBARQH(+1)/PIE4TARH^0.25-1)+LILCAPPA6H*PIEBARQH(+1)/PIEBARQH*(PIEBARQH(+1)/PIEBARQH-1)) ; - REALPQH = REALPBARQH+ETAH*REALPNH ; - KH = KH(-1)*(1-DELTAH)+PSIH(-1)*KH(-1) ; - PSIH = EYEH/KH-OMEGAH/2*(EYEH/KH-DELTAH*(1+ZEYEH))^2-OMEGA0H/2*(EYEH/KH-EYEH(-1)/KH(-1))^2 ; - PSIPRIMEH = 1-OMEGAH*(EYEH/KH-DELTAH*(1+ZEYEH))-OMEGA0H*(EYEH/KH-EYEH(-1)/KH(-1)) ; - 1/PSIPRIMEH = DEEH*PIEH(+1)*(REALRH(+1)+1/PSIPRIMEH(+1)*(1-DELTAH+PSIH(+1)*(1-PSIPRIMEH(+1)*EYEH(+1)/(PSIH(+1)*KH(+1))))) ; - BIGGAMH = LILCAPPA1H/2*(PIEWH/PIE4TARH^0.25-1)^2+LILCAPPA2H/2*(PIEWH/PIEWH(-1)-1)^2 ; - PIEH*REALWH/REALWH(-1) = PIEWH ; - REALWH = PHIH*VPRIMEH/MARGUTH*((PHIH-1)*(1-BIGGAMH)+PIEWH*LILCAPPA1H/PIE4TARH^0.25*(PIEWH/PIE4TARH^0.25-1)+PIEWH/PIEWH(-1)*LILCAPPA2H*(PIEWH/PIEWH(-1)-1)-DEEH*PIEWH(+1)*LH(+1)/LH*LILCAPPA1H*PIEWH(+1)/PIE4TARH^0.25*(PIEWH(+1)/PIE4TARH^0.25-1)-DEEH*PIEWH(+1)*LH(+1)/LH*LILCAPPA2H*PIEWH(+1)/(REALWH/REALWH(-1))*(PIEWH(+1)/PIEWH-1))^(-1) ; - DEEH = BET*MARGUTH(+1)/PIEH(+1)/MARGUTH*(1+SHOPH+SHOPPRIMEH*VELOH)/(1+SHOPH(+1)+SHOPPRIMEH(+1)*VELOH(+1)) ; - SHOPH = A_ZEROH*VELOH+A_ONEH/VELOH-2*(A_ZEROH*A_ONEH)^0.5 ; - SHOPPRIMEH = A_ZEROH-A_ONEH*VELOH^(-2) ; - VELOH = CH/REALMONEYH ; - DEEH = 1-SHOPPRIMEH*VELOH^2 ; - 1 = RNOMH*DEEH ; - 100*(RNOMH^4-1) = (1-XDUMH)*100*(RNOM_EXOGH^4-1)+XDUMH*(XR3H*100*(RNOMH(-1)^4-1)+(1-XR3H)*(100*((1/BET*PIE4H^0.25)^4-1))+XR1H*(100*(PIE4H-1)-100*(PIE4TARH-1))+XR4H*100*(DEPEX^4-1)+XR2H*GDPGAPH) ; - GDPGAPH = 100*(GDPH_NAT-GDPH_EXOG)/GDPH_EXOG ; - PIE4H = PIEH*PIEH(-1)*PIEH1(-1)*PIEH2(-1) ; - AH = CH*(1+SHOPH)+EYEH+GAH ; - GAH = .05*(GA_RATH*(GLAMBDAH*GDPH_NAT+(1-GLAMBDAH)*GDPH_EXOG))+.95*GAH(-1)+E_GAH; - GNH = GN_RATH*(GLAMBDAH*GDPH_NAT+(1-GLAMBDAH)*GDPH_EXOG)/REALPNH_EXOG ; - PIEBARMH = PIEH*REALPBARMH/REALPBARMH(-1) ; - BIGGAMMH = LILCAPPA7H/2*(PIEBARMH/PIE4TARH^0.25-1)^2+LILCAPPA8H/2*(PIEBARMH/PIEBARMH(-1)-1)^2 ; - REALPMH = REALPBARMH+ETAH*REALPNH ; - KNH_RAT = ALPHANH/(1-ALPHANH-GAMA_NH)*(REALWH/REALRH)^XIXI_NH ; - KTH_RAT = ALPHATH/(1-ALPHATH-GAMA_TH)*(REALWH/REALRH)^XIXI_TH ; - KNH_RAT = KNH/LNH ; - KTH_RAT = KTH/LTH ; - KH = KTH+KNH+K_OH ; - LH = (LNH+LTH+L_OH)*(1-COSTLH/2*(LNH/(LTH+L_OH)/(LNH(-1)/(LTH(-1)+L_OH(-1)))-1)^2) ; - T_OH = Z_OH*((1-ALPHA_OH-GAMMA_LANDH)^(1/XIXI_OH)*L_OH^(1-1/XIXI_OH)+ALPHA_OH^(1/XIXI_OH)*K_OH^(1-1/XIXI_OH)+GAMMA_LANDH^(1/XIXI_OH)*LANDH^(1-1/XIXI_OH))^(XIXI_OH/(XIXI_OH-1)) ; - Q_ONH = NY_NH*(REALP_QOH/REALP_ONH)^(-EPS_ONH)*O_NH ; - Q_OTH = NY_TH*(REALP_QOH/REALP_OTH)^(-EPS_OTH)*O_TH ; - M_ONH = (1-NY_NH)*(REALP_MOH/REALP_ONH)^(-EPS_ONH)*O_NH*(BIGGAM_MONH-COST_MONH*(M_ONH/O_NH/(M_ONH(-1)/O_NH(-1))-1)*M_ONH/O_NH/(M_ONH(-1)/O_NH(-1)))^EPS_ONH/BIGGAM_MONH ; - M_OTH = (1-NY_TH)*(REALP_MOH/REALP_OTH)^(-EPS_OTH)*O_TH*(BIGGAM_MOTH-COST_MOTH*(M_OTH/O_TH/(M_OTH(-1)/O_TH(-1))-1)*M_OTH/O_TH/(M_OTH(-1)/O_TH(-1)))^EPS_OTH/BIGGAM_MOTH ; - BIGGAM_MONH = 1-COST_MONH/2*(M_ONH/O_NH/(M_ONH(-1)/O_NH(-1))-1)^2 ; - BIGGAM_MOTH = 1-COST_MOTH/2*(M_OTH/O_TH/(M_OTH(-1)/O_TH(-1))-1)^2 ; - K_OH_RAT = ALPHA_OH/(1-ALPHA_OH-GAMMA_LANDH)*(REALWH/REALRH)^XIXI_OH ; - K_OH_RAT = K_OH/L_OH ; - REALP_QOH = 1/Z_OH*((1-ALPHA_OH-GAMMA_LANDH)*REALWH^(1-XIXI_OH)+ALPHA_OH*REALRH^(1-XIXI_OH)+GAMMA_LANDH*REALPLANDH^(1-XIXI_OH))^(1/(1-XIXI_OH)) ; - LANDH = GAMMA_LANDH*(REALPLANDH/(REALP_QOH*Z_OH))^(-XIXI_OH)*T_OH/Z_OH ; - REALP_ONH = (NY_NH*REALP_QOH^(1-EPS_ONH)+(1-NY_NH)*REALP_MOH^(1-EPS_ONH)*(BIGGAM_MONH-COST_MONH*(M_ONH/O_NH/(M_ONH(-1)/O_NH(-1))-1)*M_ONH/O_NH/(M_ONH(-1)/O_NH(-1)))^(EPS_ONH-1))^(1/(1-EPS_ONH)) ; - REALP_OTH = (NY_TH*REALP_QOH^(1-EPS_OTH)+(1-NY_TH)*REALP_MOH^(1-EPS_OTH)*(BIGGAM_MOTH-COST_MOTH*(M_OTH/O_TH/(M_OTH(-1)/O_TH(-1))-1)*M_OTH/O_TH/(M_OTH(-1)/O_TH(-1)))^(EPS_OTH-1))^(1/(1-EPS_OTH)) ; - SSH*TH = SSH*QH+SSF*MF ; - SSH*T_OH = SSH*Q_ONH+SSH*Q_OTH+SSF*M_ONF+SSF*M_OTF ; - REALP_MOH = REALP_QOF*REALEXH ; - ZZ_GDP_PPP_RATH = GDPH/REALEX/GDPF ; - XI = CHI0*(exp(CHI1*REALEX*REALBH)+CHI2*(REALEX*(REALBH-REALBH(-1)/PIEF)/GDPH)^2+CHI3*(REALEX*(REALBH-REALBH(-1)/PIEF)/GDPH-REALEX(-1)*(REALBH(-1)-REALBH1(-1)/PIEF(-1))/GDPH(-1))^2-1)/(exp(CHI1*REALEX*REALBH)+CHI2*(REALEX*(REALBH-REALBH(-1)/PIEF)/GDPH)^2+CHI3*(REALEX*(REALBH-REALBH(-1)/PIEF)/GDPH-REALEX(-1)*(REALBH(-1)-REALBH1(-1)/PIEF(-1))/GDPH(-1))^2+1)+ZBH ; - 1 = RNOMF*(1-XI)*DEEH*DEPEX(+1) ; - DEPEX = PIEH/PIEF*REALEX/REALEX(-1) ; - REALFINH = RNOMF(-1)*(1-XI(-1))*REALEX*REALBH(-1)/PIEF ; - SSH*DEEH*PIEH(+1)*REALFINH(+1) = SSH*REALFINH+SSH*RNOMF(-1)*XI(-1)*REALEX*REALBH(-1)/PIEF+REALTBALH ; - REALEXH = REALEX ; - REALEXF = 1/REALEXH ; - ZZ_REALEX = 100*log(REALEX) ; - -(1-BIGGAMMH)*REALPBARMH/REALPMH*(REALPBARMH/REALEX*(1-THETAF)+ETAH*REALPNH/REALEX+THETAF*REALMCTF) = -(REALPBARMH/REALEX-REALMCTF)*(LILCAPPA7H*PIEBARMH/PIE4TARH^0.25*(PIEBARMH/PIE4TARH^0.25-1)+LILCAPPA8H*PIEBARMH/PIEBARMH(-1)*(PIEBARMH/PIEBARMH(-1)-1))+DEEF*PIEF(+1)*(REALPBARMH(+1)/REALEX(+1)-REALMCTF(+1))*MH(+1)/MH*(LILCAPPA7H*PIEBARMH(+1)/PIE4TARH^0.25*(PIEBARMH(+1)/PIE4TARH^0.25-1)+LILCAPPA8H*PIEBARMH(+1)/PIEBARMH*(PIEBARMH(+1)/PIEBARMH-1)) ; - GDPH = AH+REALPNH*GNH+EXPORTSH-IMPORTSH+(RNOMF(-1)-1)*REALEX*REALBH(-1)/PIEF ; - GDPH_NAT = AH+REALPNH_EXOG*GNH+EXPORTSH_NAT-IMPORTSH_NAT ; - CH_NAT = CH*(1+SHOPH) ; - GH_NAT = GAH+REALPNH_EXOG*GNH ; - XH_NAT = SSF/SSH*REALEX_EXOG*REALPBARMF_EXOG*MF ; - MH_NAT = REALPBARMH_EXOG*MH ; - CURBALH_RAT = REALEX*(REALBH-REALBH(-1)/PIEF)/GDPH ; - REALTBALH = SSF*(REALPBARMF*MF+REALP_MOF*M_ONF+REALP_MOF*M_OTF)*REALEX-SSH*(REALPBARMH*MH+REALP_MOH*M_ONH+REALP_MOH*M_OTH) ; - EXPORTSH = SSF/SSH*(REALPBARMF*MF+REALP_MOF*M_ONF+REALP_MOF*M_OTF)*REALEX ; - IMPORTSH = REALPBARMH*MH+REALP_MOH*M_ONH+REALP_MOH*M_OTH ; - EXPORTSH_NAT = SSF/SSH*(REALPBARMF_EXOG*MF+REALP_MOF_EXOG*M_ONF+REALP_MOF_EXOG*M_OTF)*REALEX_EXOG ; - IMPORTSH_NAT = REALPBARMH_EXOG*MH+REALP_MOH_EXOG*M_ONH+REALP_MOH_EXOG*M_OTH ; - ZZ_UTILITYF = (ZUF*(CF-HF)^(1-SIGMAF)-1)/(1-SIGMAF)-CAPAF*LF^(1+ZEDF)/(1+ZEDF) ; - ZZ_GF = 100*log(GF_NAT) ; - ZZ_CURBALF_RAT = CURBALF_RAT*100 ; - ZZ_M_SHARF = REALPBARMF*MF/AF ; - ZZ_M_O_SHARF = (REALP_MOF*M_ONF+REALP_MOF*M_OTF)/AF ; - ZZ_M_ON_SHARF = REALP_MOF*M_ONF/AF ; - ZZ_M_OT_SHARF = REALP_MOF*M_OTF/AF ; - ZZ_N_SHARF = NF*REALPNF/AF ; - ZZ_EYE_SHARF = EYEF/GDPF ; - ZZ_C_SHARF = CF/GDPF ; - ZZ_GDPF = 100*log(GDPF_NAT) ; - ZZ_CF = 100*log(CF_NAT) ; - ZZ_EYEF = 100*log(EYEF) ; - ZZ_EXPORTSF = 100*log(EXPORTSF_NAT) ; - ZZ_IMPORTSF = 100*log(IMPORTSF_NAT) ; - ZZ_XBALF_TOT_RAT = 100*(EXPORTSF_NAT-IMPORTSF_NAT)/GDPF_NAT ; - ZZ_PIE4F = 100*(PIE4F-1) ; - ZZ_DPIE4F = ZZ_PIE4F-ZZ_PIE4F(-1) ; - ZZ_RNOMF = 100*(RNOMF^4-1) ; - ZZ_DRNOMF = ZZ_RNOMF-ZZ_RNOMF(-1) ; - 100*(PIE4TARF-1) = 1*100*(PIE4TARF_SS-1)+(1-1)*100*(PIE4TARF(-1)-1)+E_PIE4TARF ; - log(ZUF) = 0.3*log(ZUF_SS)+0.7*log(ZUF(-1))+E_ZUF ; - ZBF = 0.3*ZBF_SS+0.7*ZBF(-1)+E_ZBF ; - log(LANDF) = 0.05*log(LANDF_SS)+0.95*log(LANDF(-1))+E_LANDF ; - log(ZTF) = 0.05*log(ZTF_SS)+0.95*log(ZTF(-1))+E_LANDF ; - log(ZNF) = 0.05*log(ZNF_SS)+0.95*log(ZNF(-1))+E_LANDF ; - log(Z_OF) = 0.05*log(Z_OF_SS)+0.95*log(Z_OF(-1))+E_LANDF ; - ZEYEF = 0.05*ZEYEF_SS+0.95*ZEYEF(-1)+E_ZEYEF ; - CAPAF = 0.05*CAPAF_SS+0.95*CAPAF(-1)+E_CAPAF ; - log(GAMMAF) = 0.05*log(GAMMAF_SS)+0.95*log(GAMMAF(-1))+E_GAMMAF ; - BIGGAM_O_NF = 1-COST_O_NF/2*(O_NF/NF/(O_NF(-1)/NF(-1))-1)^2 ; - BIGGAM_O_TF = 1-COST_O_TF/2*(O_TF/TF/(O_TF(-1)/TF(-1))-1)^2 ; - O_NF = GAMA_NF*NF/ZNF*(REALP_ONF/(REALMCNF*ZNF))^(-XIXI_NF)*(BIGGAM_O_NF-COST_O_NF*(O_NF/NF/(O_NF(-1)/NF(-1))-1)*O_NF/NF/(O_NF(-1)/NF(-1)))^XIXI_NF/BIGGAM_O_NF ; - O_TF = GAMA_TF*TF/ZTF*(REALP_OTF/(REALMCTF*ZTF))^(-XIXI_TF)*(BIGGAM_O_TF-COST_O_TF*(O_TF/TF/(O_TF(-1)/TF(-1))-1)*O_TF/TF/(O_TF(-1)/TF(-1)))^XIXI_NF/BIGGAM_O_TF ; - NF = ZNF*((1-ALPHANF-GAMA_NF)^(1/XIXI_NF)*LNF^(1-1/XIXI_NF)+ALPHANF^(1/XIXI_NF)*KNF^(1-1/XIXI_NF)+GAMA_NF^(1/XIXI_NF)*(BIGGAM_O_NF*O_NF)^(1-1/XIXI_NF))^(XIXI_NF/(XIXI_NF-1)) ; - TF = ZTF*((1-ALPHATF-GAMA_TF)^(1/XIXI_TF)*LTF^(1-1/XIXI_TF)+ALPHATF^(1/XIXI_TF)*KTF^(1-1/XIXI_TF)+GAMA_TF^(1/XIXI_TF)*(BIGGAM_O_TF*O_TF)^(1-1/XIXI_TF))^(XIXI_TF/(XIXI_TF-1)) ; - REALMCNF = 1/ZNF*((1-ALPHANF-GAMA_NF)*REALWF^(1-XIXI_NF)+ALPHANF*REALRF^(1-XIXI_NF)+GAMA_NF*REALP_ONF^(1-XIXI_NF)*(BIGGAM_O_NF-COST_O_NF*(O_NF/NF/(O_NF(-1)/NF(-1))-1)*O_NF/NF/(O_NF(-1)/NF(-1)))^(XIXI_NF-1))^(1/(1-XIXI_NF)) ; - REALMCTF = 1/ZTF*((1-ALPHATF-GAMA_TF)*REALWF^(1-XIXI_TF)+ALPHATF*REALRF^(1-XIXI_TF)+GAMA_TF*REALP_OTF^(1-XIXI_TF)*(BIGGAM_O_TF-COST_O_TF*(O_TF/TF/(O_TF(-1)/TF(-1))-1)*O_TF/TF/(O_TF(-1)/TF(-1)))^(XIXI_TF-1))^(1/(1-XIXI_TF)) ; - MARGUTF = (CF-B2F*HF)^(-SIGMAF)*ZUF ; - HF = (1-B0F)*HF(-1)+B0F*B1F*CF(-1) ; - VPRIMEF = CAPAF*LF^ZEDF ; - AF^(1-1/EPSF) = GAMMAF^(1/EPSF)*(NYF^(1/EPSQMF)*QF^(1-1/EPSQMF)+(1-NYF)^(1/EPSQMF)*(MF*BIGGAMIMPF)^(1-1/EPSQMF))^(EPSQMF/(EPSQMF-1)*(1-1/EPSF))+(1-GAMMAF)^(1/EPSF)*NNF^(1-1/EPSF) ; - QF = GAMMAF*NYF*REALPQF^(-EPSQMF)*AF*REALPXF^(EPSQMF-EPSF) ; - MF = GAMMAF*(1-NYF)*REALPMF^(-EPSQMF)*AF*REALPXF^(EPSQMF-EPSF)*1/BIGGAMIMPF*(BIGGAMIMPF-COSTF*(MF/AF/(MF(-1)/AF(-1))-1)*MF/AF/(MF(-1)/AF(-1)))^EPSQMF ; - REALPXF = (NYF*REALPQF^(1-EPSQMF)+(1-NYF)*REALPMF^(1-EPSQMF)*(BIGGAMIMPF-COSTF*(MF/AF/(MF(-1)/AF(-1))-1)*MF/AF/(MF(-1)/AF(-1)))^(EPSQMF-1))^(1/(1-EPSQMF)) ; - BIGGAMIMPF = 1-COSTF/2*(MF/AF/(MF(-1)/AF(-1))-1)^2 ; - NNF = (1-GAMMAF)*REALPNF^(-EPSF)*AF ; - NF = NNF+ETAF*MF+ETAF*QF+GNF ; - PIENF = REALPNF/REALPNF(-1)*PIEF ; - BIGGAMNF = LILCAPPA3F/2*(PIENF/PIE4TARF^0.25-1)^2+LILCAPPA4F/2*(PIENF/PIENF(-1)-1)^2 ; - -(1-BIGGAMNF)*(REALPNF*(1-THETAF)+THETAF*REALMCNF) = -(REALPNF-REALMCNF)*(LILCAPPA3F*PIENF/PIE4TARF^0.25*(PIENF/PIE4TARF^0.25-1)+LILCAPPA4F*PIENF/PIENF(-1)*(PIENF/PIENF(-1)-1))+DEEF*PIEF(+1)*(REALPNF(+1)-REALMCNF(+1))*NF(+1)/NF*(LILCAPPA3F*PIENF(+1)/PIE4TARF^0.25*(PIENF(+1)/PIE4TARF^0.25-1)+LILCAPPA4F*PIENF(+1)/PIENF*(PIENF(+1)/PIENF-1)) ; - PIEBARQF = PIEF*REALPBARQF/REALPBARQF(-1) ; - BIGGAMQF = LILCAPPA5F/2*(PIEBARQF/PIE4TARF^0.25-1)^2+LILCAPPA6F/2*(PIEBARQF/PIEBARQF(-1)-1)^2 ; - -(1-BIGGAMQF)*REALPBARQF/REALPQF*(REALPBARQF*(1-THETAF)+ETAF*REALPNF+THETAF*REALMCTF) = -(REALPBARQF-REALMCTF)*(LILCAPPA5F*PIEBARQF/PIE4TARF^0.25*(PIEBARQF/PIE4TARF^0.25-1)+LILCAPPA6F*PIEBARQF/PIEBARQF(-1)*(PIEBARQF/PIEBARQF(-1)-1))+DEEF*PIEF(+1)*(REALPBARQF(+1)-REALMCTF(+1))*QF(+1)/QF*(LILCAPPA5F*PIEBARQF(+1)/PIE4TARF^0.25*(PIEBARQF(+1)/PIE4TARF^0.25-1)+LILCAPPA6F*PIEBARQF(+1)/PIEBARQF*(PIEBARQF(+1)/PIEBARQF-1)) ; - REALPQF = REALPBARQF+ETAF*REALPNF ; - KF = KF(-1)*(1-DELTAF)+PSIF(-1)*KF(-1) ; - PSIF = EYEF/KF-OMEGAF/2*(EYEF/KF-DELTAF*(1+ZEYEF))^2-OMEGA0F/2*(EYEF/KF-EYEF(-1)/KF(-1))^2 ; - PSIPRIMEF = 1-OMEGAF*(EYEF/KF-DELTAF*(1+ZEYEF))-OMEGA0F*(EYEF/KF-EYEF(-1)/KF(-1)) ; - 1/PSIPRIMEF = DEEF*PIEF(+1)*(REALRF(+1)+1/PSIPRIMEF(+1)*(1-DELTAF+PSIF(+1)*(1-PSIPRIMEF(+1)*EYEF(+1)/(PSIF(+1)*KF(+1))))) ; - BIGGAMF = LILCAPPA1F/2*(PIEWF/PIE4TARF^0.25-1)^2+LILCAPPA2F/2*(PIEWF/PIEWF(-1)-1)^2 ; - PIEF*REALWF/REALWF(-1) = PIEWF ; - REALWF = PHIF*VPRIMEF/MARGUTF*((PHIF-1)*(1-BIGGAMF)+PIEWF*LILCAPPA1F/PIE4TARF^0.25*(PIEWF/PIE4TARF^0.25-1)+PIEWF/PIEWF(-1)*LILCAPPA2F*(PIEWF/PIEWF(-1)-1)-DEEF*PIEWF(+1)*LF(+1)/LF*LILCAPPA1F*PIEWF(+1)/PIE4TARF^0.25*(PIEWF(+1)/PIE4TARF^0.25-1)-DEEF*PIEWF(+1)*LF(+1)/LF*LILCAPPA2F*PIEWF(+1)/(REALWF/REALWF(-1))*(PIEWF(+1)/PIEWF-1))^(-1) ; - DEEF = BET*MARGUTF(+1)/PIEF(+1)/MARGUTF*(1+SHOPF+SHOPPRIMEF*VELOF)/(1+SHOPF(+1)+SHOPPRIMEF(+1)*VELOF(+1)) ; - SHOPF = A_ZEROF*VELOF+A_ONEF/VELOF-2*(A_ZEROF*A_ONEF)^0.5 ; - SHOPPRIMEF = A_ZEROF-A_ONEF*VELOF^(-2) ; - VELOF = CF/REALMONEYF ; - DEEF = 1-SHOPPRIMEF*VELOF^2 ; - 1 = RNOMF*DEEF ; - 100*(RNOMF^4-1) = (1-XDUMF)*100*(RNOM_EXOGF^4-1)+XDUMF*(XR3F*100*(RNOMF(-1)^4-1)+(1-XR3F)*(100*((1/BET*PIE4F^0.25)^4-1)+XR1F*(100*(PIE4F-1)-100*(PIE4TARF-1))+XR4F*100*(DEPEX^4-1)+XR2F*GDPGAPF)) ; - GDPGAPF = 100*(GDPF_NAT-GDPF_EXOG)/GDPF_EXOG ; - PIE4F = PIEF*PIEF(-1)*PIEF1(-1)*PIEF2(-1) ; - AF = CF*(1+SHOPF)+EYEF+GAF ; - GAF = .05*(GA_RATF*(GLAMBDAF*GDPF_NAT+(1-GLAMBDAF)*GDPF_EXOG))+.95*GAF(-1)+E_GAF; - GNF = GN_RATF*(GLAMBDAF*GDPF_NAT+(1-GLAMBDAF)*GDPF_EXOG)/REALPNF_EXOG ; - PIEBARMF = PIEF*REALPBARMF/REALPBARMF(-1) ; - BIGGAMMF = LILCAPPA7F/2*(PIEBARMF/PIE4TARF^0.25-1)^2+LILCAPPA8F/2*(PIEBARMF/PIEBARMF(-1)-1)^2 ; - REALPMF = REALPBARMF+ETAF*REALPNF ; - KNF_RAT = ALPHANF/(1-ALPHANF-GAMA_NF)*(REALWF/REALRF)^XIXI_NF ; - KTF_RAT = ALPHATF/(1-ALPHATF-GAMA_TF)*(REALWF/REALRF)^XIXI_TF ; - KNF_RAT = KNF/LNF ; - KTF_RAT = KTF/LTF ; - KF = KTF+KNF+K_OF ; - LF = (LNF+LTF+L_OF)*(1-COSTLF/2*(LNF/(LTF+L_OF)/(LNF(-1)/(LTF(-1)+L_OF(-1)))-1)^2) ; - T_OF = Z_OF*((1-ALPHA_OF-GAMMA_LANDF)^(1/XIXI_OF)*L_OF^(1-1/XIXI_OF)+ALPHA_OF^(1/XIXI_OF)*K_OF^(1-1/XIXI_OF)+GAMMA_LANDF^(1/XIXI_OF)*LANDF^(1-1/XIXI_OF))^(XIXI_OF/(XIXI_OF-1)) ; - Q_ONF = NY_NF*(REALP_QOF/REALP_ONF)^(-EPS_ONF)*O_NF ; - Q_OTF = NY_TF*(REALP_QOF/REALP_OTF)^(-EPS_OTF)*O_TF ; - M_ONF = (1-NY_NF)*(REALP_MOF/REALP_ONF)^(-EPS_ONF)*O_NF*(BIGGAM_MONF-COST_MONF*(M_ONF/O_NF/(M_ONF(-1)/O_NF(-1))-1)*M_ONF/O_NF/(M_ONF(-1)/O_NF(-1)))^EPS_ONF/BIGGAM_MONF ; - M_OTF = (1-NY_TF)*(REALP_MOF/REALP_OTF)^(-EPS_OTF)*O_TF*(BIGGAM_MOTF-COST_MOTF*(M_OTF/O_TF/(M_OTF(-1)/O_TF(-1))-1)*M_OTF/O_TF/(M_OTF(-1)/O_TF(-1)))^EPS_OTF/BIGGAM_MOTF ; - BIGGAM_MONF = 1-COST_MONF/2*(M_ONF/O_NF/(M_ONF(-1)/O_NF(-1))-1)^2 ; - BIGGAM_MOTF = 1-COST_MOTF/2*(M_OTF/O_TF/(M_OTF(-1)/O_TF(-1))-1)^2 ; - K_OF_RAT = ALPHA_OF/(1-ALPHA_OF-GAMMA_LANDF)*(REALWF/REALRF)^XIXI_OF ; - K_OF_RAT = K_OF/L_OF ; - REALP_QOF = 1/Z_OF*((1-ALPHA_OF-GAMMA_LANDF)*REALWF^(1-XIXI_OF)+ALPHA_OF*REALRF^(1-XIXI_OF)+GAMMA_LANDF*REALPLANDF^(1-XIXI_OF))^(1/(1-XIXI_OF)) ; - LANDF = GAMMA_LANDF*(REALPLANDF/(REALP_QOF*Z_OF))^(-XIXI_OF)*T_OF/Z_OF ; - REALP_ONF = (NY_NF*REALP_QOF^(1-EPS_ONF)+(1-NY_NF)*REALP_MOF^(1-EPS_ONF)*(BIGGAM_MONF-COST_MONF*(M_ONF/O_NF/(M_ONF(-1)/O_NF(-1))-1)*M_ONF/O_NF/(M_ONF(-1)/O_NF(-1)))^(EPS_ONF-1))^(1/(1-EPS_ONF)) ; - REALP_OTF = (NY_TF*REALP_QOF^(1-EPS_OTF)+(1-NY_TF)*REALP_MOF^(1-EPS_OTF)*(BIGGAM_MOTF-COST_MOTF*(M_OTF/O_TF/(M_OTF(-1)/O_TF(-1))-1)*M_OTF/O_TF/(M_OTF(-1)/O_TF(-1)))^(EPS_OTF-1))^(1/(1-EPS_OTF)) ; - SSF*TF = SSF*QF+SSH*MH ; - SSF*T_OF = SSF*Q_ONF+SSF*Q_OTF+SSH*M_ONH+SSH*M_OTH ; - REALP_MOF = REALP_QOH*REALEXF ; - SSH*REALBH+SSF*REALBF = 0 ; - REALTBALF = SSF*(REALPBARMF*MF+REALP_MOF*M_ONF+REALP_MOF*M_OTF)-SSH*(REALPBARMH*MH+REALP_MOH*M_ONH+REALP_MOH*M_OTH)*1/REALEX ; - EXPORTSF = SSH/SSF*(REALPBARMH*MH+REALP_MOH*M_ONH+REALP_MOH*M_OTH)*1/REALEX ; - IMPORTSF = REALPBARMF*MF+REALP_MOF*M_ONF+REALP_MOF*M_OTF ; - EXPORTSF_NAT = SSH/SSF*(REALPBARMH_EXOG*MH+REALP_MOH_EXOG*M_ONH+REALP_MOH_EXOG*M_OTH)*1/REALEX_EXOG ; - IMPORTSF_NAT = REALPBARMF_EXOG*MF+REALP_MOF_EXOG*M_ONF+REALP_MOF_EXOG*M_OTF ; - -(1-BIGGAMMF)*REALPBARMF/REALPMF*(REALPBARMF*REALEX*(1-THETAH)+ETAF*REALPNF*REALEX+THETAH*REALMCTH) = -(REALPBARMF*REALEX-REALMCTH)*(LILCAPPA7F*PIEBARMF/PIE4TARF^0.25*(PIEBARMF/PIE4TARF^0.25-1)+LILCAPPA8F*PIEBARMF/PIEBARMF(-1)*(PIEBARMF/PIEBARMF(-1)-1))+DEEH*PIEH(+1)*(REALPBARMF(+1)*REALEX(+1)-REALMCTH(+1))*MF(+1)/MF*(LILCAPPA7F*PIEBARMF(+1)/PIE4TARF^0.25*(PIEBARMF(+1)/PIE4TARF^0.25-1)+LILCAPPA8F*PIEBARMF(+1)/PIEBARMF*(PIEBARMF(+1)/PIEBARMF-1)) ; - GDPF = AF+REALPNF*GNF+EXPORTSF-IMPORTSF+(RNOMF(-1)-1)*REALBF(-1)/PIEF ; - GDPF_NAT = AF+REALPNF_EXOG*GNF+EXPORTSF_NAT-IMPORTSF_NAT ; - CF_NAT = CF*(1+SHOPF) ; - GF_NAT = GAF+REALPNF_EXOG*GNF ; - XF_NAT = SSH/SSF*1/REALEX_EXOG*REALPBARMH_EXOG*MH ; - MF_NAT = REALPBARMF_EXOG*MF ; - CURBALF_RAT = -(REALTBALH/REALEX/SSF/GDPF)+(RNOMF(-1)-1)*REALBF(-1)/PIEF/GDPF ; - PIEF1 = PIEF(-1); - PIEF2 = PIEF1(-1); - PIEH1 = PIEH(-1); - PIEH2 = PIEH1(-1); - REALBH1 = REALBH(-1); -end; - -initval; -AF=2.17350447531715; -AH=2.61461230039988; -BIGGAMF=0; -BIGGAMH=0; -BIGGAMIMPF=1; -BIGGAMIMPH=1; -BIGGAMMF=0; -BIGGAMMH=0; -BIGGAMNF=0; -BIGGAMNH=0; -BIGGAMQF=0; -BIGGAMQH=0; -BIGGAM_MONF=1; -BIGGAM_MONH=1; -BIGGAM_MOTF=1; -BIGGAM_MOTH=1; -BIGGAM_O_NF=1; -BIGGAM_O_NH=1; -BIGGAM_O_TF=1; -BIGGAM_O_TH=1; -CAPAF=11; -CAPAH=11; -CF=1.77599320017707; -CF_NAT=1.77797456682707; -CH=2.10139281352027; -CH_NAT=2.10373720855446; -CURBALF_RAT=2.20209042676066e-018; -CURBALH_RAT=0; -DEEF=0.963834712172592; -DEEH=0.963834712172592; -DEPEX=1; -EXPORTSF=0.0374229290542059; -EXPORTSF_NAT=0.0374229290542059; -EXPORTSH=0.976573287861717; -EXPORTSH_NAT=0.976573287861717; -EYEF=0.27477965986135; -EYEH=0.365618852934316; -GAF=0.12075024862873; -GAH=0.145256238911104; -GAMMAF=0.5; -GAMMAH=0.25; -GDPF=2.41500497257461; -GDPF_NAT=2.41500497257461; -GDPGAPF=0; -GDPGAPH=0; -GDPH=2.90512477822209; -GDPH_NAT=2.90512477822209; -GF_NAT=0.362250745886191; -GH_NAT=0.435768716733313; -GNF=0.287269571519256; -GNH=0.321902361090147; -HF=1.68719354016822; -HH=1.99632317284426; -IMPORTSF=0.0374229290542059; -IMPORTSF_NAT=0.0374229290542059; -IMPORTSH=0.976573287861718; -IMPORTSH_NAT=0.976573287861718; -KF=10.991186394454; -KH=14.6247541173726; -KNF=6.33686501417153; -KNF_RAT=22.6981730731029; -KNH=11.034700665508; -KNH_RAT=22.8755992006951; -KTF=2.97137434524903; -KTF_RAT=22.6981730731029; -KTH=2.23720856941572; -KTH_RAT=114.377996003476; -K_OF=1.68294703503345; -K_OF_RAT=7.27127622255245; -K_OH=1.35284488244891; -K_OH_RAT=8.16985685739111; -LANDF=0.1; -LANDH=0.1; -LF=0.64153899810027; -LH=0.667528221502678; -LNF=0.279179517830034; -LNH=0.482378650224502; -LTF=0.130908083909629; -LTH=0.019559781143112; -L_OF=0.231451396360608; -L_OH=0.165589790135064; -MARGUTF=2.24145263303312; -MARGUTH=2.11921125101343; -MF=0.0196445696804563; -MF_NAT=0.0171196449669319; -MH=0.438784845846124; -MH_NAT=0.522472906750236; -M_ONF=0.0143006671963624; -M_ONH=0.134410532365428; -M_OTF=0.00670562423725087; -M_OTH=0.143002828997546; -NF=1.91582345366461; -NH=2.609674642079; -NNF=1.31534385473198; -NNH=2.19524942542191; -O_NF=0.387338325509274; -O_NH=0.147043832240678; -O_TF=0.18162406186278; -O_TH=0.148205762233076; -PIE4F=1.125; -PIE4H=1.125; -PIE4TARF=1.125; -PIE4TARH=1.125; -PIEBARMF=1.02988357195356; -PIEBARMH=1.02988357195356; -PIEBARQF=1.02988357195356; -PIEBARQH=1.02988357195356; -PIEF=1.02988357195356; -PIEF1=1.02988357195356; -PIEF2=1.02988357195356; -PIEH=1.02988357195356; -PIEH1=1.02988357195356; -PIEH2=1.02988357195356; -PIENF=1.02988357195356; -PIENH=1.02988357195356; -PIEWF=1.02988357195356; -PIEWH=1.02988357195356; -PSIF=0.025; -PSIH=0.025; -PSIPRIMEF=1; -PSIPRIMEH=1; -QF=0.875241222929181; -QH=0.0238294319885835; -Q_ONF=0.373740369418894; -Q_ONH=0.0132636199615755; -Q_OTF=0.175247940896905; -Q_OTH=0.00547180886242481; -REALBF=0; -REALBH=0; -REALBH1=0; -REALEX=1.3734519289908; -REALEXF=0.728092464608345; -REALEXH=1.3734519289908; -REALFINH=0; -REALMCNF=0.700562935771035; -REALMCNH=0.752071934789911; -REALMCTF=0.700562935771035; -REALMCTH=0.930081384894704; -REALMONEYF=0.558667031035572; -REALMONEYH=0.661026677383566; -REALPBARMF=0.87146958398196; -REALPBARMH=1.19072687148694; -REALPBARQF=0.899522809530009; -REALPBARQH=1.15219711474356; -REALPLANDF=0.554831427212494; -REALPLANDH=0.414697221827051; -REALPMF=1.16570601700579; -REALPMH=1.37122413583652; -REALPNF=0.840675522925242; -REALPNH=0.902486321747893; -REALPQF=1.19375924255384; -REALPQH=1.33269437909314; -REALPXF=1.19317131724075; -REALPXH=1.36926881180313; -REALP_MOF=0.966533486000563; -REALP_MOH=1.63690883121281; -REALP_ONF=1.18566549908199; -REALP_ONH=1.61601524261254; -REALP_OTF=1.18566549908199; -REALP_OTH=1.62845456685201; -REALP_QOF=1.1918209852569; -REALP_QOH=1.32748728078168; -REALRF=0.0324170717777328; -REALRH=0.0324170717777329; -REALTBALF=-6.93889390390723e-018; -REALTBALH=-6.93889390390723e-018; -REALWF=2.42667732699502; -REALWH=2.83454771236558; -RNOMF=1.03752229232945; -RNOMH=1.03752229232945; -SHOPF=0.00111563864647424; -SHOPH=0.00111563864647424; -SHOPPRIMEF=0.00357861859467432; -SHOPPRIMEH=0.00357861859467432; -TF=0.89833516218424; -TH=0.397076255917254; -T_OF=0.563589013545429; -T_OH=0.417854966062653; -VELOF=3.17898336847443; -VELOH=3.17898336847443; -VPRIMEF=3.62618818940983; -VPRIMEH=4.00467026905301; -XF_NAT=0.0200215045456245; -XH_NAT=0.446747178665936; -XI=0; -ZBF=0; -ZBH=0; -ZEYEF=0; -ZEYEH=0; -ZNF=1; -ZNH=1; -ZTF=1; -ZTH=0.6; -ZUF=1; -ZUH=1; -ZZ_CF=57.5474832617676; -ZZ_CH=74.3715386197541; -ZZ_CURBALF_RAT=2.20209042676066e-016; -ZZ_CURBALH_RAT=0; -ZZ_C_SHARF=0.735399396831762; -ZZ_C_SHARH=0.723339950584259; -ZZ_DPIE4F=0; -ZZ_DPIE4H=0; -ZZ_DRNOMF=0; -ZZ_DRNOMH=0; -ZZ_EXPORTSF=-328.547168610049; -ZZ_EXPORTSH=-2.37054799079326; -ZZ_EYEF=-129.17857393452; -ZZ_EYEH=-100.616387362469; -ZZ_EYE_SHARF=0.113780163180538; -ZZ_EYE_SHARH=0.12585306341233; -ZZ_GDPF=88.1701346139521; -ZZ_GDPH=106.647634229781; -ZZ_GDP_PPP_RATH=0.875857186130553; -ZZ_GF=-101.541863874636; -ZZ_GH=-83.0643642588075; -ZZ_IMPORTSF=-328.547168610049; -ZZ_IMPORTSH=-2.37054799079323; -ZZ_M_ON_SHARF=0.0063593490946998; -ZZ_M_ON_SHARH=0.084149297164759; -ZZ_M_OT_SHARF=0.00298191719568198; -ZZ_M_OT_SHARH=0.0895286056899133; -ZZ_M_O_SHARF=0.00934126629038178; -ZZ_M_O_SHARH=0.173677902854672; -ZZ_M_SHARF=0.00787651700806085; -ZZ_M_SHARH=0.19982806118916; -ZZ_N_SHARF=0.741008772713445; -ZZ_N_SHARH=0.90078198910348; -ZZ_PIE4F=12.5; -ZZ_PIE4H=12.5; -ZZ_REALEX=31.7327227026121; -ZZ_RNOMF=15.8749999999999; -ZZ_RNOMH=15.8749999999999; -ZZ_UTILITYF=-1.86610854895021; -ZZ_UTILITYH=-1.9297829736965; -ZZ_XBALF_TOT_RAT=0; -ZZ_XBALH_TOT_RAT=-7.6432037132987e-015; -Z_OF=1; -Z_OH=1; - -E_ZBH=0; - -E_ZUH=0; -E_ZUF=0; - -E_ZEYEH=0; -E_ZEYEF=0; - -E_GAMMAH=0; -E_GAMMAF=0; - -E_LANDH=0; -E_LANDF=0; - -E_GAH = 0; -E_GAF = 0; - -E_CAPAH=0; -E_CAPAF=0; -end; - -vcov = [ -0.000324 0 0 0 0 0 0 0 0 0 0 0 0; -0 0.0004 0 0 0 0 0 0 0 0 0 0 0; -0 0 0.00000001 0 0 0 0 0 0 0 0 0 0; -0 0 0 0.000004 0 0 0 0 0 0 0 0 0; -0 0 0 0 0.000289 0 0 0 0 0 0 0 0; -0 0 0 0 0 0.000025 0 0 0 0 0 0 0; -0 0 0 0 0 0 0.0049 0 0 0 0 0 0; -0 0 0 0 0 0 0 0.000001 0 0 0 0 0; -0 0 0 0 0 0 0 0 0.000016 0 0 0 0; -0 0 0 0 0 0 0 0 0 0.00001225 0 0 0; -0 0 0 0 0 0 0 0 0 0 0.0000005625 0 0; -0 0 0 0 0 0 0 0 0 0 0 0.01 0; -0 0 0 0 0 0 0 0 0 0 0 0 0.0001 -]; - -order=2; \ No newline at end of file diff --git a/dynare++/tests/judd.mod b/dynare++/tests/judd.mod deleted file mode 100644 index 7acfb1218..000000000 --- a/dynare++/tests/judd.mod +++ /dev/null @@ -1,50 +0,0 @@ -var C K1 K2 L S1 S2 THETA V V1 V2; - -varexo KSI; - -parameters theta_ss lambda delta1 delta2 alpha1 alpha2 eta beta gamma depr1 depr2; - -theta_ss=1; -lambda=0.8; -delta1=0.1; -delta2=0.05; -alpha1=0.3; -alpha2=0.15; -eta=3; -beta=0.95; -gamma=0.5; -depr1=0.1; -depr2=0.05; - -model; -C = THETA*K1^alpha1*K2^alpha2*L^(1-alpha1-alpha2)-S1*K1-S2*K2; -K1 = (1-depr1+(1-0.5*delta1*S1)*S1)*K1(-1); -K2 = (1-depr2+(1-0.5*delta2*S2)*S2)*K2(-1); -THETA = THETA(-1)^lambda*theta_ss^(1-lambda)*exp(KSI); -/* -THETA = THETA(-1)*lambda+theta_ss*(1-lambda)+KSI; -*/ -C^(-gamma)*THETA*K1^alpha1*K2^alpha2*L^(-alpha1-alpha2)*(1-alpha1-alpha2) = L^eta; -C^(-gamma) = beta*V1(+1)*(1-delta1*S1); -C^(-gamma) = beta*V2(+1)*(1-delta2*S2); -V1 = C^(-gamma)*(alpha1*THETA*K1^(alpha1-1)*K2^alpha2*L^(1-alpha1-alpha2)-S1)+beta*V1(+1)*(1-depr1+(1-0.5*delta1*S1)*S1); -V2 = C^(-gamma)*(alpha2*THETA*K1^alpha1*K2^(alpha2-1)*L^(1-alpha1-alpha2)-S2)+beta*V2(+1)*(1-depr2+(1-0.5*delta2*S2)*S2); -V = (C^(1-gamma)/(1-gamma)-L^(1+eta)/(1+eta)) + beta*V(+1); -end; - -initval; -C= 1.33341818203972; -K1= 3.80023995548668; -K2= 3.80023995563911; -L= 0.85120255261552; -S1= 0; -S2= 0; -THETA= 1.00000000000000; -V1= 0.59202988402399; -V2= 0.59202988402399; -V= -17.6239; -end; - -vcov = [ 0.001 ]; - -order = 6; diff --git a/dynare++/tests/judd_norm.mod b/dynare++/tests/judd_norm.mod deleted file mode 100644 index 30a74af3e..000000000 --- a/dynare++/tests/judd_norm.mod +++ /dev/null @@ -1,50 +0,0 @@ -var C K1 K2 L S1 S2 THETA V V1 V2; - -varexo KSI; - -parameters theta_ss lambda delta1 delta2 alpha1 alpha2 eta beta gamma depr1 depr2; - -theta_ss=1; -lambda=0.5; -delta1=0.05; -delta2=0.2; -alpha1=0.3; -alpha2=0.3; -eta=3; -beta=0.95; -gamma=0.5; -depr1=0.1; -depr2=0.05; - -model; -1 = (THETA*K1^alpha1*K2^alpha2*L^(1-alpha1-alpha2)-S1*K1-S2*K2)/C; -1 = (1-depr1+(1-0.5*delta1*S1)*S1)*K1(-1)/K1; -1 = (1-depr2+(1-0.5*delta2*S2)*S2)*K2(-1)/K2; -1 = THETA(-1)^lambda/THETA*theta_ss^(1-lambda)*exp(KSI); -/* -1 = (THETA(-1)*lambda+theta_ss*(1-lambda)+KSI)/THETA; -*/ -C^(-gamma)*THETA*K1^alpha1*K2^alpha2*L^(-alpha1-alpha2)*(1-alpha1-alpha2)*L^(-eta)=1; -1 = beta*V1(+1)*(1-delta1*S1)*C^gamma; -1 = beta*V2(+1)*(1-delta2*S2)*C^gamma; -1 = (C^(-gamma)*(alpha1*THETA*K1^(alpha1-1)*K2^alpha2*L^(1-alpha1-alpha2)-S1)+beta*V1(+1)*(1-depr1+(1-0.5*delta1*S1)*S1))/V1; -1 = (C^(-gamma)*(alpha2*THETA*K1^alpha1*K2^(alpha2-1)*L^(1-alpha1-alpha2)-S2)+beta*V2(+1)*(1-depr2+(1-0.5*delta2*S2)*S2))/V2; -1 = (C^(1-gamma)/(1-gamma)-L^(1+eta)/(1+eta) + beta*V(+1))/V; -end; - -initval; -C =1.0997055 ; -L =0.9425540 ; -S1 =0.1005051 ; -S2 =0.0500627 ; -K1 =2.9378521 ; -K2 =2.1952681 ; -THETA =1. ; -V =38.000392 ; -V1 =1.0139701 ; -V2 =1.0062981 ; -end; - -vcov = [ 0.05 ]; - -order = 5; diff --git a/dynare++/tests/kp1980_1.mod b/dynare++/tests/kp1980_1.mod deleted file mode 100644 index 8083544a1..000000000 --- a/dynare++/tests/kp1980_1.mod +++ /dev/null @@ -1,41 +0,0 @@ -// Model from Kydland & Prescott JEDC 1980 - -// case 1: optimal policy, in fact, optimal control - -var C G K TAU Z; - -varexo EPS; - -parameters eta beta alpha delta phi a rho; - -eta = 2; -beta = 0.99; -alpha = 0.3; -delta = 0.10; -phi = 2.5; -a = 0.1; -rho = 0.7; - -planner_objective C^(1-eta)/(1-eta) + a*G^(1-phi)/(1-phi); - -planner_discount beta; - -model; -K = (1-delta)*K(-1) + (exp(Z(-1))*K(-1)^alpha - C(-1) - G(-1)); -G = TAU*alpha*K^alpha; -Z = rho*Z(-1) + EPS; -end; - -initval; -TAU = 0.70; -K = ((delta+1/beta-1)/alpha)^(1/(alpha-1)); -G = TAU*alpha*K^alpha; -C = K^alpha - delta*K - G; -Z = 0; -end; - -order = 4; - -vcov = [ - 0.01 -]; diff --git a/dynare++/tests/kp1980_2.mod b/dynare++/tests/kp1980_2.mod deleted file mode 100644 index 6d9d58f73..000000000 --- a/dynare++/tests/kp1980_2.mod +++ /dev/null @@ -1,42 +0,0 @@ -// Model from Kydland & Prescott JEDC 1980 - -// case 2: time inconsistent optimal policy with different policy and consumer objectives - -var C G K TAU Z; - -varexo EPS; - -parameters eta beta alpha delta phi a rho; - -eta = 2; -beta = 0.99; -alpha = 0.3; -delta = 0.10; -phi = 2.5; -a = 0.1; -rho = 0.7; - -planner_objective C^(1-eta)/(1-eta) + a*G^(1-phi)/(1-phi); - -planner_discount beta; - -model; -K = (1-delta)*K(-1) + (exp(Z(-1))*K(-1)^alpha - C(-1) - G(-1)); -G = TAU*alpha*K^alpha; -Z = rho*Z(-1) + EPS; -C^(-eta) = beta*C(+1)^(-eta)*(1-delta+exp(Z(+1))*alpha*K(+1)^(alpha-1)*(1-alpha*TAU(+1))); -end; - -initval; -TAU = 0.70; -K = ((delta+1/beta-1)/(alpha*(1-alpha*TAU)))^(1/(alpha-1)); -G = TAU*alpha*K^alpha; -C = K^alpha - delta*K - G; -Z = 0; -end; - -order = 4; - -vcov = [ - 0.01 -]; diff --git a/dynare++/tests/kp1980_3.mod b/dynare++/tests/kp1980_3.mod deleted file mode 100644 index 9bb36f126..000000000 --- a/dynare++/tests/kp1980_3.mod +++ /dev/null @@ -1,42 +0,0 @@ -// Model from Kydland & Prescott JEDC 1980 - -// case 3: optimal policy with consistent objective (equivalent to kp1980_1.dyn) - -var C G K TAU Z; - -varexo EPS; - -parameters eta beta alpha delta phi a rho; - -eta = 2; -beta = 0.99; -alpha = 0.3; -delta = 0.10; -phi = 2.5; -a = 0.1; -rho = 0.7; - -planner_objective C^(1-eta)/(1-eta) + a*G^(1-phi)/(1-phi); - -planner_discount beta; - -model; -K = (1-delta)*K(-1) + (exp(Z(-1))*K(-1)^alpha - C(-1) - G(-1)); -G = TAU*alpha*K^alpha; -Z = rho*Z(-1) + EPS; -C^(-eta) = beta*C(+1)^(-eta)*(1-delta+exp(Z(+1))*alpha*K(+1)^(alpha-1)*(1-alpha*TAU(+1))) + beta*a*G(+1)^(-phi)*TAU(+1)*exp(Z(+1))*alpha^2*K(+1)^(alpha-1); -end; - -initval; -TAU = 0.70; -K = ((delta+1/beta-1)/alpha)^(1/(alpha-1)); -G = TAU*alpha*K^alpha; -C = K^alpha - delta*K - G; -Z = 0; -end; - -order = 4; - -vcov = [ - 0.01 -]; diff --git a/dynare++/tests/lucas78.mod b/dynare++/tests/lucas78.mod deleted file mode 100644 index c4c1a8ae1..000000000 --- a/dynare++/tests/lucas78.mod +++ /dev/null @@ -1,26 +0,0 @@ -var Y P; - -varexo EXO_Y; - -parameters beta gamma rho y_ss; - -beta = 0.95; -gamma= 0.5; -rho = 0.9; -y_ss = 2; - -model; -Y-y_ss = rho*(Y(-1)-y_ss) + EXO_Y; -Y^(-gamma)*P = beta*Y(+1)^(-gamma)*(P(+1) + Y(+1)); -end; - -initval; -Y = 2; -P = 38; -end; - -vcov = [ -10 -]; - -order = 7; diff --git a/dynare++/tests/m_0_3_0_0_0_0_0_0.mod b/dynare++/tests/m_0_3_0_0_0_0_0_0.mod deleted file mode 100644 index 1d7c522b4..000000000 --- a/dynare++/tests/m_0_3_0_0_0_0_0_0.mod +++ /dev/null @@ -1,47 +0,0 @@ -var lambda a1 a2 k1 k2 i1 i2 c1 c2 l1 l2; -varexo e e1 e2; -parameters beta delta rho sigma phi AA alpha gamma mu chi b Le tau; -beta = 0.99; -delta = 0.025; -rho = 0.95; -sigma = 0.001; -phi = 0.5; -alpha = 0.36; -AA = 0.028058361; -tau = 6.36522e-11; -gamma = 0.25; -mu = -0.2; -chi = 0.83; -b = 2.16872693993; -Le = 2.5; - -model; -log(a1) = rho*log(a1(-1))+sigma*(e+e1); -log(a2) = rho*log(a2(-1))+sigma*(e+e2); -lambda = tau*c1^(-1/chi)*(c1^(1-1/chi)+b*(Le-l1)^(1-1/chi))^((1-1/gamma)/(1-1/chi)-1); -lambda = tau*c2^(-1/chi)*(c2^(1-1/chi)+b*(Le-l2)^(1-1/chi))^((1-1/gamma)/(1-1/chi)-1); -tau*(-b)*(Le-l1)^(-1/chi)*(c1^(1-1/chi)+b*(Le-l1)^(1-1/chi))^((1-1/gamma)/(1-1/chi)-1) = -lambda*a1*AA*(1-alpha)*l1^(mu-1)*(alpha*k1(-1)^mu+(1-alpha)*l1^mu)^(1/mu-1); -tau*(-b)*(Le-l2)^(-1/chi)*(c2^(1-1/chi)+b*(Le-l2)^(1-1/chi))^((1-1/gamma)/(1-1/chi)-1) = -lambda*a2*AA*(1-alpha)*l2^(mu-1)*(alpha*k2(-1)^mu+(1-alpha)*l2^mu)^(1/mu-1); -lambda*(1+phi*(i1/k1(-1)-delta)) =beta*lambda(+1)*(1+a1(+1)*AA*alpha*k1^(mu-1)*(alpha*k1^mu+(1-alpha)*l1(+1)^mu)^(1/mu-1)+phi*(1-delta+i1(+1)/k1-0.5*(i1(+1)/k1-delta))*(i1(+1)/k1-delta)); -lambda*(1+phi*(i2/k2(-1)-delta)) =beta*lambda(+1)*(1+a2(+1)*AA*alpha*k2^(mu-1)*(alpha*k2^mu+(1-alpha)*l2(+1)^mu)^(1/mu-1)+phi*(1-delta+i2(+1)/k2-0.5*(i2(+1)/k2-delta))*(i2(+1)/k2-delta)); -k1 = i1 + (1-delta)*k1(-1); -k2 = i2 + (1-delta)*k2(-1); -c1+i1-delta*k1(-1) + c2+i2-delta*k2(-1) = a1*AA*(alpha*k1(-1)^mu+(1-alpha)*l1^mu)^(1/mu)-(phi/2)*k1(-1)*(i1/k1(-1)-delta)^2 + a2*AA*(alpha*k2(-1)^mu+(1-alpha)*l2^mu)^(1/mu)-(phi/2)*k2(-1)*(i2/k2(-1)-delta)^2; -end; -initval; -a1 = 1; -a2 = 1; -k1 = 1; -k2 = 1; -c1 = 0.028058361; -c2 = 0.028058361; -i1 = 0.025; -i2 = 0.025; -l1 = 1; -l2 = 1; -lambda = 1; -end; - -vcov = [1 0 0; 0 1 0; 0 0 1]; - -order = 4; \ No newline at end of file diff --git a/dynare++/tests/m_1_3_0_0_0_0_0_0.mod b/dynare++/tests/m_1_3_0_0_0_0_0_0.mod deleted file mode 100644 index a95e8137d..000000000 --- a/dynare++/tests/m_1_3_0_0_0_0_0_0.mod +++ /dev/null @@ -1,53 +0,0 @@ -var lambda a1 a2 k1 k2 i1 i2 c1 c2 l1 l2; -varexo e e1 e2; -parameters beta delta rho sigma phi AA alpha Le gamma1 gamma2 mu1 mu2 chi1 chi2 b1 b2 tau1 tau2; -beta = 0.99; -delta = 0.025; -rho = 0.95; -sigma = 0.01; -phi = 0.5; -alpha = 0.36; -AA = 0.028058361; -tau1 = 1.0604611e-11; -tau2 = 2.9305887e-08; -Le = 2.5; -gamma1 = 0.2; -gamma2 = 0.4; -chi1 = 0.75; -chi2 = 0.9; -mu1 = -0.3; -mu2 = 0.3; -b1 = 3.6164368; -b2 = 1.4937381; - -model; -log(a1) = rho*log(a1(-1))+sigma*(e+e1); -log(a2) = rho*log(a2(-1))+sigma*(e+e2); -lambda = tau1*c1^(-1/chi1)*(c1^(1-1/chi1)+b1*(Le-l1)^(1-1/chi1))^((1-1/gamma1)/(1-1/chi1)-1); -lambda = tau2*c2^(-1/chi2)*(c2^(1-1/chi2)+b2*(Le-l2)^(1-1/chi2))^((1-1/gamma2)/(1-1/chi2)-1); -tau1*(-b1)*(Le-l1)^(-1/chi1)*(c1^(1-1/chi1)+b1*(Le-l1)^(1-1/chi1))^((1-1/gamma1)/(1-1/chi1)-1) = -lambda*a1*AA*(1-alpha)*l1^(mu1-1)*(alpha*k1(-1)^mu1+(1-alpha)*l1^mu1)^(1/mu1-1); -tau2*(-b2)*(Le-l2)^(-1/chi2)*(c2^(1-1/chi2)+b2*(Le-l2)^(1-1/chi2))^((1-1/gamma2)/(1-1/chi2)-1) = -lambda*a2*AA*(1-alpha)*l2^(mu2-1)*(alpha*k2(-1)^mu2+(1-alpha)*l2^mu2)^(1/mu2-1); -lambda*(1+phi*(i1/k1(-1)-delta)) =beta*lambda(+1)*(1+a1(+1)*AA*alpha*k1^(mu1-1)*(alpha*k1^mu1+(1-alpha)*l1(+1)^mu1)^(1/mu1-1)+phi*(1-delta+i1(+1)/k1-0.5*(i1(+1)/k1-delta))*(i1(+1)/k1-delta)); -lambda*(1+phi*(i2/k2(-1)-delta)) =beta*lambda(+1)*(1+a2(+1)*AA*alpha*k2^(mu2-1)*(alpha*k2^mu2+(1-alpha)*l2(+1)^mu2)^(1/mu2-1)+phi*(1-delta+i2(+1)/k2-0.5*(i2(+1)/k2-delta))*(i2(+1)/k2-delta)); -k1 = i1 + (1-delta)*k1(-1); -k2 = i2 + (1-delta)*k2(-1); -c1+i1-delta*k1(-1) + c2+i2-delta*k2(-1) = a1*AA*(alpha*k1(-1)^mu1+(1-alpha)*l1^mu1)^(1/mu1)-(phi/2)*k1(-1)*(i1/k1(-1)-delta)^2 + a2*AA*(alpha*k2(-1)^mu2+(1-alpha)*l2^mu2)^(1/mu2)-(phi/2)*k2(-1)*(i2/k2(-1)-delta)^2; -end; - -initval; -a1 = 1; -a2 = 1; -k1 = 1; -k2 = 1; -c1 = 0.028058361; -c2 = 0.028058361; -i1 = 0.025; -i2 = 0.025; -l1 = 1; -l2 = 1; -lambda = 1; -end; - -vcov = [1 0 0; 0 1 0; 0 0 1]; - -order = 4; diff --git a/dynare++/tests/m_1_3_0_0_0_0_0_1.mod b/dynare++/tests/m_1_3_0_0_0_0_0_1.mod deleted file mode 100644 index 05e29ffd8..000000000 --- a/dynare++/tests/m_1_3_0_0_0_0_0_1.mod +++ /dev/null @@ -1,82 +0,0 @@ -var lambda a1 a2 a3 a4 k1 k2 k3 k4 i1 i2 i3 i4 c1 c2 c3 c4 l1 l2 l3 l4; -varexo e e1 e2 e3 e4; -parameters beta delta rho sigma phi AA alpha Le gamma1 gamma2 gamma3 gamma4 mu1 mu2 mu3 mu4 chi1 chi2 chi3 chi4 b1 b2 b3 b4 tau1 tau2 tau3 tau4; -beta = 0.99; -delta = 0.025; -rho = 0.95; -sigma = 0.001; -phi = 0.5; -alpha = 0.36; -AA = 0.028058361; -tau1 = 1.0604611e-11; -tau2 = 1.8099765e-09; -tau3 = 2.1096359e-08; -tau4 = 2.9305887e-08; -Le = 2.5; -gamma1 = 0.2; -gamma2 = 0.266666666667; -gamma3 = 0.333333333333; -gamma4 = 0.4; -chi1 = 0.75; -chi2 = 0.8; -chi3 = 0.85; -chi4 = 0.9; -mu1 = -0.3; -mu2 = -0.1; -mu3 = 0.1; -mu4 = 0.3; -b1 = 3.6164368; -b2 = 2.5958433; -b3 = 1.9373921; -b4 = 1.4937381; - -model; -log(a1) = rho*log(a1(-1))+sigma*(e+e1); -log(a2) = rho*log(a2(-1))+sigma*(e+e2); -log(a3) = rho*log(a3(-1))+sigma*(e+e3); -log(a4) = rho*log(a4(-1))+sigma*(e+e4); -lambda = tau1*c1^(-1/chi1)*(c1^(1-1/chi1)+b1*(Le-l1)^(1-1/chi1))^((1-1/gamma1)/(1-1/chi1)-1); -lambda = tau2*c2^(-1/chi2)*(c2^(1-1/chi2)+b2*(Le-l2)^(1-1/chi2))^((1-1/gamma2)/(1-1/chi2)-1); -lambda = tau3*c3^(-1/chi3)*(c3^(1-1/chi3)+b3*(Le-l3)^(1-1/chi3))^((1-1/gamma3)/(1-1/chi3)-1); -lambda = tau4*c4^(-1/chi4)*(c4^(1-1/chi4)+b4*(Le-l4)^(1-1/chi4))^((1-1/gamma4)/(1-1/chi4)-1); -tau1*(-b1)*(Le-l1)^(-1/chi1)*(c1^(1-1/chi1)+b1*(Le-l1)^(1-1/chi1))^((1-1/gamma1)/(1-1/chi1)-1) = -lambda*a1*AA*(1-alpha)*l1^(mu1-1)*(alpha*k1(-1)^mu1+(1-alpha)*l1^mu1)^(1/mu1-1); -tau2*(-b2)*(Le-l2)^(-1/chi2)*(c2^(1-1/chi2)+b2*(Le-l2)^(1-1/chi2))^((1-1/gamma2)/(1-1/chi2)-1) = -lambda*a2*AA*(1-alpha)*l2^(mu2-1)*(alpha*k2(-1)^mu2+(1-alpha)*l2^mu2)^(1/mu2-1); -tau3*(-b3)*(Le-l3)^(-1/chi3)*(c3^(1-1/chi3)+b3*(Le-l3)^(1-1/chi3))^((1-1/gamma3)/(1-1/chi3)-1) = -lambda*a3*AA*(1-alpha)*l3^(mu3-1)*(alpha*k3(-1)^mu3+(1-alpha)*l3^mu3)^(1/mu3-1); -tau4*(-b4)*(Le-l4)^(-1/chi4)*(c4^(1-1/chi4)+b4*(Le-l4)^(1-1/chi4))^((1-1/gamma4)/(1-1/chi4)-1) = -lambda*a4*AA*(1-alpha)*l4^(mu4-1)*(alpha*k4(-1)^mu4+(1-alpha)*l4^mu4)^(1/mu4-1); -lambda*(1+phi*(i1/k1(-1)-delta)) =beta*lambda(+1)*(1+a1(+1)*AA*alpha*k1^(mu1-1)*(alpha*k1^mu1+(1-alpha)*l1(+1)^mu1)^(1/mu1-1)+phi*(1-delta+i1(+1)/k1-0.5*(i1(+1)/k1-delta))*(i1(+1)/k1-delta)); -lambda*(1+phi*(i2/k2(-1)-delta)) =beta*lambda(+1)*(1+a2(+1)*AA*alpha*k2^(mu2-1)*(alpha*k2^mu2+(1-alpha)*l2(+1)^mu2)^(1/mu2-1)+phi*(1-delta+i2(+1)/k2-0.5*(i2(+1)/k2-delta))*(i2(+1)/k2-delta)); -lambda*(1+phi*(i3/k3(-1)-delta)) =beta*lambda(+1)*(1+a3(+1)*AA*alpha*k3^(mu3-1)*(alpha*k3^mu3+(1-alpha)*l3(+1)^mu3)^(1/mu3-1)+phi*(1-delta+i3(+1)/k3-0.5*(i3(+1)/k3-delta))*(i3(+1)/k3-delta)); -lambda*(1+phi*(i4/k4(-1)-delta)) =beta*lambda(+1)*(1+a4(+1)*AA*alpha*k4^(mu4-1)*(alpha*k4^mu4+(1-alpha)*l4(+1)^mu4)^(1/mu4-1)+phi*(1-delta+i4(+1)/k4-0.5*(i4(+1)/k4-delta))*(i4(+1)/k4-delta)); -k1 = i1 + (1-delta)*k1(-1); -k2 = i2 + (1-delta)*k2(-1); -k3 = i3 + (1-delta)*k3(-1); -k4 = i4 + (1-delta)*k4(-1); -c1+i1-delta*k1(-1) + c2+i2-delta*k2(-1) + c3+i3-delta*k3(-1) + c4+i4-delta*k4(-1) = a1*AA*(alpha*k1(-1)^mu1+(1-alpha)*l1^mu1)^(1/mu1)-(phi/2)*k1(-1)*(i1/k1(-1)-delta)^2 + a2*AA*(alpha*k2(-1)^mu2+(1-alpha)*l2^mu2)^(1/mu2)-(phi/2)*k2(-1)*(i2/k2(-1)-delta)^2 + a3*AA*(alpha*k3(-1)^mu3+(1-alpha)*l3^mu3)^(1/mu3)-(phi/2)*k3(-1)*(i3/k3(-1)-delta)^2 + a4*AA*(alpha*k4(-1)^mu4+(1-alpha)*l4^mu4)^(1/mu4)-(phi/2)*k4(-1)*(i4/k4(-1)-delta)^2; -end; -initval; -a1 = 1; -a2 = 1; -a3 = 1; -a4 = 1; -k1 = 1; -k2 = 1; -k3 = 1; -k4 = 1; -c1 = 0.028058361; -c2 = 0.028058361; -c3 = 0.028058361; -c4 = 0.028058361; -i1 = 0.025; -i2 = 0.025; -i3 = 0.025; -i4 = 0.025; -l1 = 1; -l2 = 1; -l3 = 1; -l4 = 1; -lambda = 1; -end; - -vcov = [1.0 0 0 0 0; 0 1.0 0 0 0; 0 0 1.0 0 0; 0 0 0 1.0 0; 0 0 0 0 1.0]; - -order = 4; diff --git a/dynare++/tests/or0a.mod b/dynare++/tests/or0a.mod deleted file mode 100644 index 20b962e28..000000000 --- a/dynare++/tests/or0a.mod +++ /dev/null @@ -1,119 +0,0 @@ -var -C -CF -CF_STAR -CH -CH_STAR -CN -CN_STAR -CT -CT_STAR -C_STAR -E -KE -KE_STAR -L -L_STAR -P -PF -PF_STAR -PH -PH_STAR -PN -PN_STAR -PT -PT_STAR -P_STAR -W -W_STAR -Y -Y_STAR -; - -varexo k k_star m m_star; - -parameters epsi chi thet nu phi gam; - -epsi = 0.5; -nu = 3; -chi = 1.2; -phi = 4; -thet = 3; -gam = 0.5; - -model; -C = (1/chi)*(exp(m)/P)^epsi; -C_STAR = (1/chi)*(exp(m_star)/P_STAR)^epsi; -CN = (1-gam)*(P/PN)*C; -CN_STAR = (1-gam)*(P_STAR/PN_STAR)*C_STAR; -CT = gam*(P/PT)*C; -CT_STAR = gam*(P_STAR/PT_STAR)*C_STAR; -CH = 0.5*(PT/PH)*CT; -CH_STAR = 0.5*(PT_STAR/PH_STAR)*CT_STAR; -CF = 0.5*(PT/PF)*CT; -CF_STAR = 0.5*(PT_STAR/PF_STAR)*CT_STAR; -P = PT^gam*PN^(1-gam); -P_STAR = PT_STAR^gam*PN_STAR^(1-gam); -PT = sqrt(PH*PF); -PT_STAR = sqrt(PH_STAR*PF_STAR); -PH = (thet/(thet-1))*W(-1); -PF_STAR = (thet/(thet-1))*W_STAR(-1); -PN = PH; -PN_STAR = PF_STAR; -L = Y; -L_STAR = Y_STAR; -(L(+1)/(P(+1)*C(+1)))*W = (phi/(phi-1))*KE(+1)*L(+1)^nu; -(L_STAR(+1)/(P_STAR(+1)*C_STAR(+1)))*W_STAR = (phi/(phi-1))*KE_STAR(+1)*L_STAR(+1)^nu; -P*C = Y*PH; -P_STAR*C_STAR = Y_STAR*PF_STAR; -Y = CH + CH_STAR + CN; -Y_STAR = CF + CF_STAR + CN_STAR; -PT = E*PT_STAR; -KE = exp(k); -KE_STAR = exp(k_star); -end; - -initval; -C = 1; -PH = 1; -P = 1; -PN = 1; -PT = 1; -L = 1; -Y = 1; -W = 1; -CF = 0.25; -CH = 0.25; -CT = 0.5; -CN = 0.5; -PF = 1; -C_STAR = 1; -PH_STAR = 1; -P_STAR = 1; -PN_STAR = 1; -PT_STAR = 1; -L_STAR = 1; -Y_STAR = 1; -W_STAR = 1; -CF_STAR = 0.25; -CH_STAR = 0.25; -CT_STAR = 0.5; -CN_STAR = 0.5; -PF_STAR = 1; -KE = 1; -KE_STAR = 1; -E = 1; -k = 0; -k_star = 0; -m = 0; -m_star = 0; -end; - -vcov = [ -0.01 0 -0.01 0; -0 0.01 0 -0.01; --0.01 0 0.01 0; -0 -0.01 0 0.01 -]; - -order=4; diff --git a/dynare++/tests/portfolio.mod b/dynare++/tests/portfolio.mod deleted file mode 100644 index 5309dce0b..000000000 --- a/dynare++/tests/portfolio.mod +++ /dev/null @@ -1,52 +0,0 @@ -var DOTQ Q1 Q2 X1 X2 C D1 D2; - -varexo E_D1 E_D2; - -parameters beta, r1, r2, gamma, d, rho1, rho2; - -beta = 0.95; -r1 = 0.2; -r2 = 0.05; - -gamma = 0.78; -d = 0.10; - -rho1 = 0.8; -rho2 = 0.2; - -model; -C + X1 + X2 = D1*Q1 + D2*Q2; -Q1+Q2 = 1; -C^(-gamma)/(1-2*r1*X1) = beta*DOTQ(+1)^(-gamma)*C(+1)^(-gamma)/(1-2*r1*X1(+1))*(D1(+1)*(1-2*r1*X1(+1))+1); -C^(-gamma)/(1-2*r2*X2) = beta*DOTQ(+1)^(-gamma)*C(+1)^(-gamma)/(1-2*r2*X2(+1))*(D2(+1)*(1-2*r2*X2(+1))+1); -DOTQ*Q1 = Q1(-1) + X1(-1) - r1*X1(-1)^2; -DOTQ*Q2 = Q2(-1) + X2(-1) - r2*X2(-1)^2; - -D1/d = D1(-1)^rho1/(d^rho1)*exp(E_D1); -D2/d = D2(-1)^rho2/(d^rho2)*exp(E_D2); - -/* -D1-d = rho1*(D1(-1)-d) + E_D1; -D2-d = rho2*(D2(-1)-d) + E_D2; -*/ -end; - -initval; -C =0.0441234; -D1 =0.1000000000000; -D2 =0.1000000000000; - -DOTQ =1.05567; -Q1 =0.333333; -Q2 =0.666667; - -X1 =0.0186255; -X2 =0.0372511; -end; - -vcov = [ -0.04 0; -0 0.01 -]; - -order=5; diff --git a/dynare++/tests/portfolio4.mod b/dynare++/tests/portfolio4.mod deleted file mode 100644 index 4413aa5ed..000000000 --- a/dynare++/tests/portfolio4.mod +++ /dev/null @@ -1,86 +0,0 @@ -var DOTQ Q1 Q2 Q3 Q4 X1 X2 X3 X4 C D1 D2 D3 D4 V; - -varexo E_D1 E_D2 E_D3 E_D4; - -parameters beta, r1, r2, r3, r4, gamma, ed1, ed2, ed3, ed4, rho1, rho2, rho3, rho4; - -beta = 0.95; -r1 = 0.2; -r2 = 0.1; -r3 = 0.06; -r4 = 0.03; - -gamma = 0.7; -ed1 = 0.1; -ed2 = 0.1; -ed3 = 0.1; -ed4 = 0.1; - -rho1 = 0.3; -rho2 = 0.01; -rho3 = 0.6; -rho4 = 0.6; - -model; -Q1+Q2+Q3+Q4 = 1; -C + X1 + X2 + X3 + X4 = D1*Q1 + D2*Q2 + D3*Q3 + D4*Q4; -DOTQ*Q1 = Q1(-1) + X1(-1) - r1*X1(-1)*X1(-1); -DOTQ*Q2 = Q2(-1) + X2(-1) - r2*X2(-1)*X2(-1); -DOTQ*Q3 = Q3(-1) + X3(-1) - r3*X3(-1)*X3(-1); -DOTQ*Q4 = Q4(-1) + X4(-1) - r4*X4(-1)*X4(-1); -C^(-gamma)/(1-2*r1*X1) = beta*DOTQ(+1)^(-gamma)*C(+1)^(-gamma)/(1-2*r1*X1(+1))*(D1(+1)*(1-2*r1*X1(+1))+1); -C^(-gamma)/(1-2*r2*X2) = beta*DOTQ(+1)^(-gamma)*C(+1)^(-gamma)/(1-2*r2*X2(+1))*(D2(+1)*(1-2*r2*X2(+1))+1); -C^(-gamma)/(1-2*r3*X3) = beta*DOTQ(+1)^(-gamma)*C(+1)^(-gamma)/(1-2*r3*X3(+1))*(D3(+1)*(1-2*r3*X3(+1))+1); -C^(-gamma)/(1-2*r4*X4) = beta*DOTQ(+1)^(-gamma)*C(+1)^(-gamma)/(1-2*r4*X4(+1))*(D4(+1)*(1-2*r4*X4(+1))+1); - -V = C^(1-gamma)/(1-gamma) + beta*V(+1); - -D1/ed1 = D1(-1)^rho1/(ed1^rho1)*exp(E_D1); -D2/ed2 = D2(-1)^rho2/(ed2^rho2)*exp(E_D2); -D3/ed3 = D3(-1)^rho3/(ed3^rho3)*exp(E_D3); -D4/ed4 = D4(-1)^rho4/(ed4^rho4)*exp(E_D4); - -/* -D1-ed1 = rho1*(D1(-1)-ed1) + E_D1; -D2-ed2 = rho2*(D2(-1)-ed2) + E_D2; -D3-ed3 = rho3*(D3(-1)-ed3) + E_D3; -D4-ed4 = rho4*(D4(-1)-ed4) + E_D4; -*/ - -end; - -initval; -D1 = ed1; -D2 = ed2; -D3 = ed3; -D4 = ed4; -DOTQ = 1.05; // provide a guess not larger than the true value -X1 = 1/2/r1*(1-1/D1*(1/beta*DOTQ^gamma - 1)); -X2 = 1/2/r2*(1-1/D2*(1/beta*DOTQ^gamma - 1)); -X3 = 1/2/r3*(1-1/D3*(1/beta*DOTQ^gamma - 1)); -X4 = 1/2/r4*(1-1/D4*(1/beta*DOTQ^gamma - 1)); -Q1 = 1/(DOTQ-1)*(X1 - r1*X1*X1); -Q2 = 1/(DOTQ-1)*(X2 - r2*X2*X2); -Q3 = 1/(DOTQ-1)*(X3 - r3*X3*X3); -Q4 = 1/(DOTQ-1)*(X4 - r4*X4*X4); -C = ed1*Q1 + ed2*Q2 + ed3*Q3 + ed4*Q4 - X1 - X2 - X3 - X4; -V = 1/(1-beta)*C^(1-gamma)/(1-gamma); -end; - -/* -vcov = [ -0.0005 0 0 0; -0 0.00025 0 0; -0 0 0.0005 0; -0 0 0 0.00025 -]; -*/ - -vcov = [ -0.05 0 0 0; -0 0.025 0 0; -0 0 0.05 0; -0 0 0 0.025 -]; - -order=5; diff --git a/dynare++/tests/portfolio4_norm.mod b/dynare++/tests/portfolio4_norm.mod deleted file mode 100644 index fdedaaa5a..000000000 --- a/dynare++/tests/portfolio4_norm.mod +++ /dev/null @@ -1,86 +0,0 @@ -var DOTQ Q1 Q2 Q3 Q4 X1 X2 X3 X4 C D1 D2 D3 D4 V; - -varexo E_D1 E_D2 E_D3 E_D4; - -parameters beta, r1, r2, r3, r4, gamma, ed1, ed2, ed3, ed4, rho1, rho2, rho3, rho4; - -beta = 0.95; -r1 = 0.2; -r2 = 0.1; -r3 = 0.06; -r4 = 0.03; - -gamma = 0.7; -ed1 = 0.1; -ed2 = 0.1; -ed3 = 0.1; -ed4 = 0.1; - -rho1 = 0.3; -rho2 = 0.01; -rho3 = 0.6; -rho4 = 0.6; - -model; -1 = (C + X1 + X2 + X3 + X4)/ (D1*Q1 + D2*Q2 + D3*Q3 + D4*Q4); -1 = (Q1(-1) + X1(-1) - r1*X1(-1)*X1(-1))/(DOTQ*Q1); -1 = (Q2(-1) + X2(-1) - r2*X2(-1)*X2(-1))/(DOTQ*Q2); -1 = (Q3(-1) + X3(-1) - r3*X3(-1)*X3(-1))/(DOTQ*Q3); -1 = (Q4(-1) + X4(-1) - r4*X4(-1)*X4(-1))/(DOTQ*Q4); -Q1+Q2+Q3+Q4 = 1; -1 = beta*DOTQ(+1)^(-gamma)*C(+1)^(-gamma)/(1-2*r1*X1(+1))*(D1(+1)*(1-2*r1*X1(+1))+1)/(C^(-gamma)/(1-2*r1*X1)); -1 = beta*DOTQ(+1)^(-gamma)*C(+1)^(-gamma)/(1-2*r2*X2(+1))*(D2(+1)*(1-2*r2*X2(+1))+1)/(C^(-gamma)/(1-2*r2*X2)); -1 = beta*DOTQ(+1)^(-gamma)*C(+1)^(-gamma)/(1-2*r3*X3(+1))*(D3(+1)*(1-2*r3*X3(+1))+1)/(C^(-gamma)/(1-2*r3*X3)); -1 = beta*DOTQ(+1)^(-gamma)*C(+1)^(-gamma)/(1-2*r4*X4(+1))*(D4(+1)*(1-2*r4*X4(+1))+1)/(C^(-gamma)/(1-2*r4*X4)); - - -1 = D1(-1)^rho1/D1*ed1^(1-rho1)*exp(E_D1); -1 = D2(-1)^rho2/D2*ed2^(1-rho2)*exp(E_D2); -1 = D3(-1)^rho3/D3*ed3^(1-rho3)*exp(E_D3); -1 = D4(-1)^rho4/D4*ed4^(1-rho4)*exp(E_D4); - -/* -D1-ed1 = rho1*(D1(-1)-ed1) + E_D1; -D2-ed2 = rho2*(D2(-1)-ed2) + E_D2; -D3-ed3 = rho3*(D3(-1)-ed3) + E_D3; -D4-ed4 = rho4*(D4(-1)-ed4) + E_D4; -*/ - -V/(C^(1-gamma)/(1-gamma) + beta*V(+1)) = 1; -end; - -initval; -Q1 =0.0769231; -Q2 =0.1538462; -Q3 =0.2564103; -Q4 =0.5128205; -X1 =0.0049761; -X2 =0.0099522; -X3 =0.0165871; -X4 =0.0331741; -D1 =0.1; -D2 =0.1; -D3 =0.1; -D4 =0.1; -DOTQ =1.0646251; -C =0.0353105; -V =24.450057; -end; - -/* -vcov = [ -0.0005 0 0 0; -0 0.00025 0 0; -0 0 0.0005 0; -0 0 0 0.00025 -]; -*/ - -vcov = [ -0.05 0 0 0; -0 0.025 0 0; -0 0 0.05 0; -0 0 0 0.025 -]; - -order=4; diff --git a/dynare++/tests/psd_exo3.mod b/dynare++/tests/psd_exo3.mod deleted file mode 100644 index ff59dab36..000000000 --- a/dynare++/tests/psd_exo3.mod +++ /dev/null @@ -1,26 +0,0 @@ -var c k x; -varexo rho; - -parameters a alph gam bet lamb; -alph = 0.7; -bet = 0.95; -gam = 2; -a = 1.052632; -lamb = 0.9; - -model; -c^(-gam) = bet*c(+1)^(-gam)*a*exp(x(+1))*k^(-alph); -k = a*exp(x)*k(-1)^(1-alph)/(1-alph)-c; -x = lamb*x(-1)+rho; -end; - -initval; -k = 1; -c = 2.508; -x = 0; -rho = 0; -end; - -vcov=[0.0001]; - -order=6; \ No newline at end of file diff --git a/dynare++/tests/q3a2.mod b/dynare++/tests/q3a2.mod deleted file mode 100644 index 650b27d3f..000000000 --- a/dynare++/tests/q3a2.mod +++ /dev/null @@ -1,33 +0,0 @@ -var c,a1,k1,a2,k2; -varexo e,e1,e2; -parameters beta, gamma, phi, delta, alpha, rho, zeta, sigma, N; -alpha = 0.36; -delta = 0.025; -phi = 2; -gamma = 1; -beta = 0.99; -rho = 0.95; -zeta = 2; -sigma = 0.005; -N = 2; -model; -c^(-gamma)*(1+phi*zeta*(k1-k1(-1))^(zeta-1)/(2*k1(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k1-k1(-1))^(zeta-1)/(2*k1(-1))+phi*(k1-k1(-1))^zeta/(2*k1(-1)^2)-delta+alpha*a1(+1)*k1^(alpha-1)); -log(a1) = rho*log(a1(-1))+sigma*(e+e1); -c^(-gamma)*(1+phi*zeta*(k2-k2(-1))^(zeta-1)/(2*k2(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k2-k2(-1))^(zeta-1)/(2*k2(-1))+phi*(k2-k2(-1))^zeta/(2*k2(-1)^2)-delta+alpha*a2(+1)*k2^(alpha-1)); -log(a2) = rho*log(a2(-1))+sigma*(e+e2); -N*c+k1+phi*(k1-k1(-1))^zeta/(2*k1)-(1-delta)*k1(-1)+k2+phi*(k2-k2(-1))^zeta/(2*k2)-(1-delta)*k2(-1)= a1*k1(-1)^alpha+a2*k2(-1)^alpha; -end; -initval; -c=1; -e=0; -a1=1; -e1=0; -k1=10; -a2=1; -e2=0; -k2=10; -end; - -vcov=[1 0 0; 0 1 0; 0 0 1]; - -order = 4; \ No newline at end of file diff --git a/dynare++/tests/q3a50.mod b/dynare++/tests/q3a50.mod deleted file mode 100644 index df2fe4c6e..000000000 --- a/dynare++/tests/q3a50.mod +++ /dev/null @@ -1,324 +0,0 @@ -var c,a1,k1,a2,k2,a3,k3,a4,k4,a5,k5,a6,k6,a7,k7,a8,k8,a9,k9,a10,k10,a11,k11,a12,k12,a13,k13,a14,k14,a15,k15,a16,k16,a17,k17,a18,k18,a19,k19,a20,k20,a21,k21,a22,k22,a23,k23,a24,k24,a25,k25,a26,k26,a27,k27,a28,k28,a29,k29,a30,k30,a31,k31,a32,k32,a33,k33,a34,k34,a35,k35,a36,k36,a37,k37,a38,k38,a39,k39,a40,k40,a41,k41,a42,k42,a43,k43,a44,k44,a45,k45,a46,k46,a47,k47,a48,k48,a49,k49,a50,k50; -varexo e,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19,e20,e21,e22,e23,e24,e25,e26,e27,e28,e29,e30,e31,e32,e33,e34,e35,e36,e37,e38,e39,e40,e41,e42,e43,e44,e45,e46,e47,e48,e49,e50; -parameters beta, gamma, phi, delta, alpha, rho, zeta, sigma, N; -alpha = 0.36; -delta = 0.1; -phi = 2; -gamma = 1; -beta = 0.99; -rho = 0.95; -zeta = 2; -sigma = 2; -N = 50; -model; -c^(-gamma)*(1+phi*zeta*(k1-k1(-1))^(zeta-1)/(2*k1(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k1-k1(-1))^(zeta-1)/(2*k1(-1))+phi*(k1-k1(-1))^zeta/(2*k1(-1)^2)-delta+alpha*a1(+1)*k1^(alpha-1)); -log(a1) = rho*log(a1(-1))+sigma*(e+e1); -c^(-gamma)*(1+phi*zeta*(k2-k2(-1))^(zeta-1)/(2*k2(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k2-k2(-1))^(zeta-1)/(2*k2(-1))+phi*(k2-k2(-1))^zeta/(2*k2(-1)^2)-delta+alpha*a2(+1)*k2^(alpha-1)); -log(a2) = rho*log(a2(-1))+sigma*(e+e2); -c^(-gamma)*(1+phi*zeta*(k3-k3(-1))^(zeta-1)/(2*k3(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k3-k3(-1))^(zeta-1)/(2*k3(-1))+phi*(k3-k3(-1))^zeta/(2*k3(-1)^2)-delta+alpha*a3(+1)*k3^(alpha-1)); -log(a3) = rho*log(a3(-1))+sigma*(e+e3); -c^(-gamma)*(1+phi*zeta*(k4-k4(-1))^(zeta-1)/(2*k4(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k4-k4(-1))^(zeta-1)/(2*k4(-1))+phi*(k4-k4(-1))^zeta/(2*k4(-1)^2)-delta+alpha*a4(+1)*k4^(alpha-1)); -log(a4) = rho*log(a4(-1))+sigma*(e+e4); -c^(-gamma)*(1+phi*zeta*(k5-k5(-1))^(zeta-1)/(2*k5(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k5-k5(-1))^(zeta-1)/(2*k5(-1))+phi*(k5-k5(-1))^zeta/(2*k5(-1)^2)-delta+alpha*a5(+1)*k5^(alpha-1)); -log(a5) = rho*log(a5(-1))+sigma*(e+e5); -c^(-gamma)*(1+phi*zeta*(k6-k6(-1))^(zeta-1)/(2*k6(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k6-k6(-1))^(zeta-1)/(2*k6(-1))+phi*(k6-k6(-1))^zeta/(2*k6(-1)^2)-delta+alpha*a6(+1)*k6^(alpha-1)); -log(a6) = rho*log(a6(-1))+sigma*(e+e6); -c^(-gamma)*(1+phi*zeta*(k7-k7(-1))^(zeta-1)/(2*k7(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k7-k7(-1))^(zeta-1)/(2*k7(-1))+phi*(k7-k7(-1))^zeta/(2*k7(-1)^2)-delta+alpha*a7(+1)*k7^(alpha-1)); -log(a7) = rho*log(a7(-1))+sigma*(e+e7); -c^(-gamma)*(1+phi*zeta*(k8-k8(-1))^(zeta-1)/(2*k8(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k8-k8(-1))^(zeta-1)/(2*k8(-1))+phi*(k8-k8(-1))^zeta/(2*k8(-1)^2)-delta+alpha*a8(+1)*k8^(alpha-1)); -log(a8) = rho*log(a8(-1))+sigma*(e+e8); -c^(-gamma)*(1+phi*zeta*(k9-k9(-1))^(zeta-1)/(2*k9(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k9-k9(-1))^(zeta-1)/(2*k9(-1))+phi*(k9-k9(-1))^zeta/(2*k9(-1)^2)-delta+alpha*a9(+1)*k9^(alpha-1)); -log(a9) = rho*log(a9(-1))+sigma*(e+e9); -c^(-gamma)*(1+phi*zeta*(k10-k10(-1))^(zeta-1)/(2*k10(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k10-k10(-1))^(zeta-1)/(2*k10(-1))+phi*(k10-k10(-1))^zeta/(2*k10(-1)^2)-delta+alpha*a10(+1)*k10^(alpha-1)); -log(a10) = rho*log(a10(-1))+sigma*(e+e10); -c^(-gamma)*(1+phi*zeta*(k11-k11(-1))^(zeta-1)/(2*k11(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k11-k11(-1))^(zeta-1)/(2*k11(-1))+phi*(k11-k11(-1))^zeta/(2*k11(-1)^2)-delta+alpha*a11(+1)*k11^(alpha-1)); -log(a11) = rho*log(a11(-1))+sigma*(e+e11); -c^(-gamma)*(1+phi*zeta*(k12-k12(-1))^(zeta-1)/(2*k12(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k12-k12(-1))^(zeta-1)/(2*k12(-1))+phi*(k12-k12(-1))^zeta/(2*k12(-1)^2)-delta+alpha*a12(+1)*k12^(alpha-1)); -log(a12) = rho*log(a12(-1))+sigma*(e+e12); -c^(-gamma)*(1+phi*zeta*(k13-k13(-1))^(zeta-1)/(2*k13(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k13-k13(-1))^(zeta-1)/(2*k13(-1))+phi*(k13-k13(-1))^zeta/(2*k13(-1)^2)-delta+alpha*a13(+1)*k13^(alpha-1)); -log(a13) = rho*log(a13(-1))+sigma*(e+e13); -c^(-gamma)*(1+phi*zeta*(k14-k14(-1))^(zeta-1)/(2*k14(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k14-k14(-1))^(zeta-1)/(2*k14(-1))+phi*(k14-k14(-1))^zeta/(2*k14(-1)^2)-delta+alpha*a14(+1)*k14^(alpha-1)); -log(a14) = rho*log(a14(-1))+sigma*(e+e14); -c^(-gamma)*(1+phi*zeta*(k15-k15(-1))^(zeta-1)/(2*k15(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k15-k15(-1))^(zeta-1)/(2*k15(-1))+phi*(k15-k15(-1))^zeta/(2*k15(-1)^2)-delta+alpha*a15(+1)*k15^(alpha-1)); -log(a15) = rho*log(a15(-1))+sigma*(e+e15); -c^(-gamma)*(1+phi*zeta*(k16-k16(-1))^(zeta-1)/(2*k16(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k16-k16(-1))^(zeta-1)/(2*k16(-1))+phi*(k16-k16(-1))^zeta/(2*k16(-1)^2)-delta+alpha*a16(+1)*k16^(alpha-1)); -log(a16) = rho*log(a16(-1))+sigma*(e+e16); -c^(-gamma)*(1+phi*zeta*(k17-k17(-1))^(zeta-1)/(2*k17(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k17-k17(-1))^(zeta-1)/(2*k17(-1))+phi*(k17-k17(-1))^zeta/(2*k17(-1)^2)-delta+alpha*a17(+1)*k17^(alpha-1)); -log(a17) = rho*log(a17(-1))+sigma*(e+e17); -c^(-gamma)*(1+phi*zeta*(k18-k18(-1))^(zeta-1)/(2*k18(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k18-k18(-1))^(zeta-1)/(2*k18(-1))+phi*(k18-k18(-1))^zeta/(2*k18(-1)^2)-delta+alpha*a18(+1)*k18^(alpha-1)); -log(a18) = rho*log(a18(-1))+sigma*(e+e18); -c^(-gamma)*(1+phi*zeta*(k19-k19(-1))^(zeta-1)/(2*k19(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k19-k19(-1))^(zeta-1)/(2*k19(-1))+phi*(k19-k19(-1))^zeta/(2*k19(-1)^2)-delta+alpha*a19(+1)*k19^(alpha-1)); -log(a19) = rho*log(a19(-1))+sigma*(e+e19); -c^(-gamma)*(1+phi*zeta*(k20-k20(-1))^(zeta-1)/(2*k20(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k20-k20(-1))^(zeta-1)/(2*k20(-1))+phi*(k20-k20(-1))^zeta/(2*k20(-1)^2)-delta+alpha*a20(+1)*k20^(alpha-1)); -log(a20) = rho*log(a20(-1))+sigma*(e+e20); -c^(-gamma)*(1+phi*zeta*(k21-k21(-1))^(zeta-1)/(2*k21(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k21-k21(-1))^(zeta-1)/(2*k21(-1))+phi*(k21-k21(-1))^zeta/(2*k21(-1)^2)-delta+alpha*a21(+1)*k21^(alpha-1)); -log(a21) = rho*log(a21(-1))+sigma*(e+e21); -c^(-gamma)*(1+phi*zeta*(k22-k22(-1))^(zeta-1)/(2*k22(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k22-k22(-1))^(zeta-1)/(2*k22(-1))+phi*(k22-k22(-1))^zeta/(2*k22(-1)^2)-delta+alpha*a22(+1)*k22^(alpha-1)); -log(a22) = rho*log(a22(-1))+sigma*(e+e22); -c^(-gamma)*(1+phi*zeta*(k23-k23(-1))^(zeta-1)/(2*k23(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k23-k23(-1))^(zeta-1)/(2*k23(-1))+phi*(k23-k23(-1))^zeta/(2*k23(-1)^2)-delta+alpha*a23(+1)*k23^(alpha-1)); -log(a23) = rho*log(a23(-1))+sigma*(e+e23); -c^(-gamma)*(1+phi*zeta*(k24-k24(-1))^(zeta-1)/(2*k24(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k24-k24(-1))^(zeta-1)/(2*k24(-1))+phi*(k24-k24(-1))^zeta/(2*k24(-1)^2)-delta+alpha*a24(+1)*k24^(alpha-1)); -log(a24) = rho*log(a24(-1))+sigma*(e+e24); -c^(-gamma)*(1+phi*zeta*(k25-k25(-1))^(zeta-1)/(2*k25(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k25-k25(-1))^(zeta-1)/(2*k25(-1))+phi*(k25-k25(-1))^zeta/(2*k25(-1)^2)-delta+alpha*a25(+1)*k25^(alpha-1)); -log(a25) = rho*log(a25(-1))+sigma*(e+e25); -c^(-gamma)*(1+phi*zeta*(k26-k26(-1))^(zeta-1)/(2*k26(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k26-k26(-1))^(zeta-1)/(2*k26(-1))+phi*(k26-k26(-1))^zeta/(2*k26(-1)^2)-delta+alpha*a26(+1)*k26^(alpha-1)); -log(a26) = rho*log(a26(-1))+sigma*(e+e26); -c^(-gamma)*(1+phi*zeta*(k27-k27(-1))^(zeta-1)/(2*k27(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k27-k27(-1))^(zeta-1)/(2*k27(-1))+phi*(k27-k27(-1))^zeta/(2*k27(-1)^2)-delta+alpha*a27(+1)*k27^(alpha-1)); -log(a27) = rho*log(a27(-1))+sigma*(e+e27); -c^(-gamma)*(1+phi*zeta*(k28-k28(-1))^(zeta-1)/(2*k28(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k28-k28(-1))^(zeta-1)/(2*k28(-1))+phi*(k28-k28(-1))^zeta/(2*k28(-1)^2)-delta+alpha*a28(+1)*k28^(alpha-1)); -log(a28) = rho*log(a28(-1))+sigma*(e+e28); -c^(-gamma)*(1+phi*zeta*(k29-k29(-1))^(zeta-1)/(2*k29(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k29-k29(-1))^(zeta-1)/(2*k29(-1))+phi*(k29-k29(-1))^zeta/(2*k29(-1)^2)-delta+alpha*a29(+1)*k29^(alpha-1)); -log(a29) = rho*log(a29(-1))+sigma*(e+e29); -c^(-gamma)*(1+phi*zeta*(k30-k30(-1))^(zeta-1)/(2*k30(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k30-k30(-1))^(zeta-1)/(2*k30(-1))+phi*(k30-k30(-1))^zeta/(2*k30(-1)^2)-delta+alpha*a30(+1)*k30^(alpha-1)); -log(a30) = rho*log(a30(-1))+sigma*(e+e30); -c^(-gamma)*(1+phi*zeta*(k31-k31(-1))^(zeta-1)/(2*k31(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k31-k31(-1))^(zeta-1)/(2*k31(-1))+phi*(k31-k31(-1))^zeta/(2*k31(-1)^2)-delta+alpha*a31(+1)*k31^(alpha-1)); -log(a31) = rho*log(a31(-1))+sigma*(e+e31); -c^(-gamma)*(1+phi*zeta*(k32-k32(-1))^(zeta-1)/(2*k32(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k32-k32(-1))^(zeta-1)/(2*k32(-1))+phi*(k32-k32(-1))^zeta/(2*k32(-1)^2)-delta+alpha*a32(+1)*k32^(alpha-1)); -log(a32) = rho*log(a32(-1))+sigma*(e+e32); -c^(-gamma)*(1+phi*zeta*(k33-k33(-1))^(zeta-1)/(2*k33(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k33-k33(-1))^(zeta-1)/(2*k33(-1))+phi*(k33-k33(-1))^zeta/(2*k33(-1)^2)-delta+alpha*a33(+1)*k33^(alpha-1)); -log(a33) = rho*log(a33(-1))+sigma*(e+e33); -c^(-gamma)*(1+phi*zeta*(k34-k34(-1))^(zeta-1)/(2*k34(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k34-k34(-1))^(zeta-1)/(2*k34(-1))+phi*(k34-k34(-1))^zeta/(2*k34(-1)^2)-delta+alpha*a34(+1)*k34^(alpha-1)); -log(a34) = rho*log(a34(-1))+sigma*(e+e34); -c^(-gamma)*(1+phi*zeta*(k35-k35(-1))^(zeta-1)/(2*k35(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k35-k35(-1))^(zeta-1)/(2*k35(-1))+phi*(k35-k35(-1))^zeta/(2*k35(-1)^2)-delta+alpha*a35(+1)*k35^(alpha-1)); -log(a35) = rho*log(a35(-1))+sigma*(e+e35); -c^(-gamma)*(1+phi*zeta*(k36-k36(-1))^(zeta-1)/(2*k36(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k36-k36(-1))^(zeta-1)/(2*k36(-1))+phi*(k36-k36(-1))^zeta/(2*k36(-1)^2)-delta+alpha*a36(+1)*k36^(alpha-1)); -log(a36) = rho*log(a36(-1))+sigma*(e+e36); -c^(-gamma)*(1+phi*zeta*(k37-k37(-1))^(zeta-1)/(2*k37(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k37-k37(-1))^(zeta-1)/(2*k37(-1))+phi*(k37-k37(-1))^zeta/(2*k37(-1)^2)-delta+alpha*a37(+1)*k37^(alpha-1)); -log(a37) = rho*log(a37(-1))+sigma*(e+e37); -c^(-gamma)*(1+phi*zeta*(k38-k38(-1))^(zeta-1)/(2*k38(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k38-k38(-1))^(zeta-1)/(2*k38(-1))+phi*(k38-k38(-1))^zeta/(2*k38(-1)^2)-delta+alpha*a38(+1)*k38^(alpha-1)); -log(a38) = rho*log(a38(-1))+sigma*(e+e38); -c^(-gamma)*(1+phi*zeta*(k39-k39(-1))^(zeta-1)/(2*k39(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k39-k39(-1))^(zeta-1)/(2*k39(-1))+phi*(k39-k39(-1))^zeta/(2*k39(-1)^2)-delta+alpha*a39(+1)*k39^(alpha-1)); -log(a39) = rho*log(a39(-1))+sigma*(e+e39); -c^(-gamma)*(1+phi*zeta*(k40-k40(-1))^(zeta-1)/(2*k40(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k40-k40(-1))^(zeta-1)/(2*k40(-1))+phi*(k40-k40(-1))^zeta/(2*k40(-1)^2)-delta+alpha*a40(+1)*k40^(alpha-1)); -log(a40) = rho*log(a40(-1))+sigma*(e+e40); -c^(-gamma)*(1+phi*zeta*(k41-k41(-1))^(zeta-1)/(2*k41(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k41-k41(-1))^(zeta-1)/(2*k41(-1))+phi*(k41-k41(-1))^zeta/(2*k41(-1)^2)-delta+alpha*a41(+1)*k41^(alpha-1)); -log(a41) = rho*log(a41(-1))+sigma*(e+e41); -c^(-gamma)*(1+phi*zeta*(k42-k42(-1))^(zeta-1)/(2*k42(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k42-k42(-1))^(zeta-1)/(2*k42(-1))+phi*(k42-k42(-1))^zeta/(2*k42(-1)^2)-delta+alpha*a42(+1)*k42^(alpha-1)); -log(a42) = rho*log(a42(-1))+sigma*(e+e42); -c^(-gamma)*(1+phi*zeta*(k43-k43(-1))^(zeta-1)/(2*k43(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k43-k43(-1))^(zeta-1)/(2*k43(-1))+phi*(k43-k43(-1))^zeta/(2*k43(-1)^2)-delta+alpha*a43(+1)*k43^(alpha-1)); -log(a43) = rho*log(a43(-1))+sigma*(e+e43); -c^(-gamma)*(1+phi*zeta*(k44-k44(-1))^(zeta-1)/(2*k44(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k44-k44(-1))^(zeta-1)/(2*k44(-1))+phi*(k44-k44(-1))^zeta/(2*k44(-1)^2)-delta+alpha*a44(+1)*k44^(alpha-1)); -log(a44) = rho*log(a44(-1))+sigma*(e+e44); -c^(-gamma)*(1+phi*zeta*(k45-k45(-1))^(zeta-1)/(2*k45(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k45-k45(-1))^(zeta-1)/(2*k45(-1))+phi*(k45-k45(-1))^zeta/(2*k45(-1)^2)-delta+alpha*a45(+1)*k45^(alpha-1)); -log(a45) = rho*log(a45(-1))+sigma*(e+e45); -c^(-gamma)*(1+phi*zeta*(k46-k46(-1))^(zeta-1)/(2*k46(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k46-k46(-1))^(zeta-1)/(2*k46(-1))+phi*(k46-k46(-1))^zeta/(2*k46(-1)^2)-delta+alpha*a46(+1)*k46^(alpha-1)); -log(a46) = rho*log(a46(-1))+sigma*(e+e46); -c^(-gamma)*(1+phi*zeta*(k47-k47(-1))^(zeta-1)/(2*k47(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k47-k47(-1))^(zeta-1)/(2*k47(-1))+phi*(k47-k47(-1))^zeta/(2*k47(-1)^2)-delta+alpha*a47(+1)*k47^(alpha-1)); -log(a47) = rho*log(a47(-1))+sigma*(e+e47); -c^(-gamma)*(1+phi*zeta*(k48-k48(-1))^(zeta-1)/(2*k48(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k48-k48(-1))^(zeta-1)/(2*k48(-1))+phi*(k48-k48(-1))^zeta/(2*k48(-1)^2)-delta+alpha*a48(+1)*k48^(alpha-1)); -log(a48) = rho*log(a48(-1))+sigma*(e+e48); -c^(-gamma)*(1+phi*zeta*(k49-k49(-1))^(zeta-1)/(2*k49(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k49-k49(-1))^(zeta-1)/(2*k49(-1))+phi*(k49-k49(-1))^zeta/(2*k49(-1)^2)-delta+alpha*a49(+1)*k49^(alpha-1)); -log(a49) = rho*log(a49(-1))+sigma*(e+e49); -c^(-gamma)*(1+phi*zeta*(k50-k50(-1))^(zeta-1)/(2*k50(-1))) = beta*c(+1)^(-gamma)*(1+phi*zeta*(k50-k50(-1))^(zeta-1)/(2*k50(-1))+phi*(k50-k50(-1))^zeta/(2*k50(-1)^2)-delta+alpha*a50(+1)*k50^(alpha-1)); -log(a50) = rho*log(a50(-1))+sigma*(e+e50); -N*c+k1+phi*(k1-k1(-1))^zeta/(2*k1)-(1-delta)*k1(-1)+k2+phi*(k2-k2(-1))^zeta/(2*k2)-(1-delta)*k2(-1)+k3+phi*(k3-k3(-1))^zeta/(2*k3)-(1-delta)*k3(-1)+k4+phi*(k4-k4(-1))^zeta/(2*k4)-(1-delta)*k4(-1)+k5+phi*(k5-k5(-1))^zeta/(2*k5)-(1-delta)*k5(-1)+k6+phi*(k6-k6(-1))^zeta/(2*k6)-(1-delta)*k6(-1)+k7+phi*(k7-k7(-1))^zeta/(2*k7)-(1-delta)*k7(-1)+k8+phi*(k8-k8(-1))^zeta/(2*k8)-(1-delta)*k8(-1)+k9+phi*(k9-k9(-1))^zeta/(2*k9)-(1-delta)*k9(-1)+k10+phi*(k10-k10(-1))^zeta/(2*k10)-(1-delta)*k10(-1)+k11+phi*(k11-k11(-1))^zeta/(2*k11)-(1-delta)*k11(-1)+k12+phi*(k12-k12(-1))^zeta/(2*k12)-(1-delta)*k12(-1)+k13+phi*(k13-k13(-1))^zeta/(2*k13)-(1-delta)*k13(-1)+k14+phi*(k14-k14(-1))^zeta/(2*k14)-(1-delta)*k14(-1)+k15+phi*(k15-k15(-1))^zeta/(2*k15)-(1-delta)*k15(-1)+k16+phi*(k16-k16(-1))^zeta/(2*k16)-(1-delta)*k16(-1)+k17+phi*(k17-k17(-1))^zeta/(2*k17)-(1-delta)*k17(-1)+k18+phi*(k18-k18(-1))^zeta/(2*k18)-(1-delta)*k18(-1)+k19+phi*(k19-k19(-1))^zeta/(2*k19)-(1-delta)*k19(-1)+k20+phi*(k20-k20(-1))^zeta/(2*k20)-(1-delta)*k20(-1)+k21+phi*(k21-k21(-1))^zeta/(2*k21)-(1-delta)*k21(-1)+k22+phi*(k22-k22(-1))^zeta/(2*k22)-(1-delta)*k22(-1)+k23+phi*(k23-k23(-1))^zeta/(2*k23)-(1-delta)*k23(-1)+k24+phi*(k24-k24(-1))^zeta/(2*k24)-(1-delta)*k24(-1)+k25+phi*(k25-k25(-1))^zeta/(2*k25)-(1-delta)*k25(-1)+k26+phi*(k26-k26(-1))^zeta/(2*k26)-(1-delta)*k26(-1)+k27+phi*(k27-k27(-1))^zeta/(2*k27)-(1-delta)*k27(-1)+k28+phi*(k28-k28(-1))^zeta/(2*k28)-(1-delta)*k28(-1)+k29+phi*(k29-k29(-1))^zeta/(2*k29)-(1-delta)*k29(-1)+k30+phi*(k30-k30(-1))^zeta/(2*k30)-(1-delta)*k30(-1)+k31+phi*(k31-k31(-1))^zeta/(2*k31)-(1-delta)*k31(-1)+k32+phi*(k32-k32(-1))^zeta/(2*k32)-(1-delta)*k32(-1)+k33+phi*(k33-k33(-1))^zeta/(2*k33)-(1-delta)*k33(-1)+k34+phi*(k34-k34(-1))^zeta/(2*k34)-(1-delta)*k34(-1)+k35+phi*(k35-k35(-1))^zeta/(2*k35)-(1-delta)*k35(-1)+k36+phi*(k36-k36(-1))^zeta/(2*k36)-(1-delta)*k36(-1)+k37+phi*(k37-k37(-1))^zeta/(2*k37)-(1-delta)*k37(-1)+k38+phi*(k38-k38(-1))^zeta/(2*k38)-(1-delta)*k38(-1)+k39+phi*(k39-k39(-1))^zeta/(2*k39)-(1-delta)*k39(-1)+k40+phi*(k40-k40(-1))^zeta/(2*k40)-(1-delta)*k40(-1)+k41+phi*(k41-k41(-1))^zeta/(2*k41)-(1-delta)*k41(-1)+k42+phi*(k42-k42(-1))^zeta/(2*k42)-(1-delta)*k42(-1)+k43+phi*(k43-k43(-1))^zeta/(2*k43)-(1-delta)*k43(-1)+k44+phi*(k44-k44(-1))^zeta/(2*k44)-(1-delta)*k44(-1)+k45+phi*(k45-k45(-1))^zeta/(2*k45)-(1-delta)*k45(-1)+k46+phi*(k46-k46(-1))^zeta/(2*k46)-(1-delta)*k46(-1)+k47+phi*(k47-k47(-1))^zeta/(2*k47)-(1-delta)*k47(-1)+k48+phi*(k48-k48(-1))^zeta/(2*k48)-(1-delta)*k48(-1)+k49+phi*(k49-k49(-1))^zeta/(2*k49)-(1-delta)*k49(-1)+k50+phi*(k50-k50(-1))^zeta/(2*k50)-(1-delta)*k50(-1)= a1*k1(-1)^alpha+a2*k2(-1)^alpha+a3*k3(-1)^alpha+a4*k4(-1)^alpha+a5*k5(-1)^alpha+a6*k6(-1)^alpha+a7*k7(-1)^alpha+a8*k8(-1)^alpha+a9*k9(-1)^alpha+a10*k10(-1)^alpha+a11*k11(-1)^alpha+a12*k12(-1)^alpha+a13*k13(-1)^alpha+a14*k14(-1)^alpha+a15*k15(-1)^alpha+a16*k16(-1)^alpha+a17*k17(-1)^alpha+a18*k18(-1)^alpha+a19*k19(-1)^alpha+a20*k20(-1)^alpha+a21*k21(-1)^alpha+a22*k22(-1)^alpha+a23*k23(-1)^alpha+a24*k24(-1)^alpha+a25*k25(-1)^alpha+a26*k26(-1)^alpha+a27*k27(-1)^alpha+a28*k28(-1)^alpha+a29*k29(-1)^alpha+a30*k30(-1)^alpha+a31*k31(-1)^alpha+a32*k32(-1)^alpha+a33*k33(-1)^alpha+a34*k34(-1)^alpha+a35*k35(-1)^alpha+a36*k36(-1)^alpha+a37*k37(-1)^alpha+a38*k38(-1)^alpha+a39*k39(-1)^alpha+a40*k40(-1)^alpha+a41*k41(-1)^alpha+a42*k42(-1)^alpha+a43*k43(-1)^alpha+a44*k44(-1)^alpha+a45*k45(-1)^alpha+a46*k46(-1)^alpha+a47*k47(-1)^alpha+a48*k48(-1)^alpha+a49*k49(-1)^alpha+a50*k50(-1)^alpha; -end; -initval; -c=1; -e=0; -a1=1; -e1=0; -k1=10; -a2=1; -e2=0; -k2=10; -a3=1; -e3=0; -k3=10; -a4=1; -e4=0; -k4=10; -a5=1; -e5=0; -k5=10; -a6=1; -e6=0; -k6=10; -a7=1; -e7=0; -k7=10; -a8=1; -e8=0; -k8=10; -a9=1; -e9=0; -k9=10; -a10=1; -e10=0; -k10=10; -a11=1; -e11=0; -k11=10; -a12=1; -e12=0; -k12=10; -a13=1; -e13=0; -k13=10; -a14=1; -e14=0; -k14=10; -a15=1; -e15=0; -k15=10; -a16=1; -e16=0; -k16=10; -a17=1; -e17=0; -k17=10; -a18=1; -e18=0; -k18=10; -a19=1; -e19=0; -k19=10; -a20=1; -e20=0; -k20=10; -a21=1; -e21=0; -k21=10; -a22=1; -e22=0; -k22=10; -a23=1; -e23=0; -k23=10; -a24=1; -e24=0; -k24=10; -a25=1; -e25=0; -k25=10; -a26=1; -e26=0; -k26=10; -a27=1; -e27=0; -k27=10; -a28=1; -e28=0; -k28=10; -a29=1; -e29=0; -k29=10; -a30=1; -e30=0; -k30=10; -a31=1; -e31=0; -k31=10; -a32=1; -e32=0; -k32=10; -a33=1; -e33=0; -k33=10; -a34=1; -e34=0; -k34=10; -a35=1; -e35=0; -k35=10; -a36=1; -e36=0; -k36=10; -a37=1; -e37=0; -k37=10; -a38=1; -e38=0; -k38=10; -a39=1; -e39=0; -k39=10; -a40=1; -e40=0; -k40=10; -a41=1; -e41=0; -k41=10; -a42=1; -e42=0; -k42=10; -a43=1; -e43=0; -k43=10; -a44=1; -e44=0; -k44=10; -a45=1; -e45=0; -k45=10; -a46=1; -e46=0; -k46=10; -a47=1; -e47=0; -k47=10; -a48=1; -e48=0; -k48=10; -a49=1; -e49=0; -k49=10; -a50=1; -e50=0; -k50=10; -end; - -vcov = [ -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0; -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]; - -order = 2; diff --git a/dynare++/tests/sedmodel1.mod b/dynare++/tests/sedmodel1.mod deleted file mode 100644 index a8ad53698..000000000 --- a/dynare++/tests/sedmodel1.mod +++ /dev/null @@ -1,77 +0,0 @@ -var A, Disp, G, Int, L, - LStar, pi, Welf, WelfStar, x0, - Y, YGap, YStar, z1, z2, Cbar, Cequiv; -varexo eps1 eps2 eps3; - -parameters alpha beta gamma rhoa rhog rho phi chi chi0 theta xi -ABar GBar KBar ZBar piBar Istar; -alpha = 0.3; - beta = 0.99; - gamma = 15; - rhoa = 0.8; - rhog = 0.7; - phi = 1.5; - chi = 1.5; - chi0 = 1; - theta = 0.333333333333; - xi = 0.75; - ABar = 4.0266; - GBar = 0.3163; - KBar = 9.489; - ZBar = .03; - piBar = 1; - rho=.8; - Istar=1.01010101010101; - - -model; -z1 - ((Y-G)^(1-phi) + beta *xi *piBar *pi(+1)^(1/theta) *z1(+1)); -z2 - (Y *chi0 *(1-L-ZBar)^(-chi) / ((1-alpha) *A *KBar^alpha - *L^(-alpha)) + beta *xi *pi(+1)^((1+theta)/theta) *z2(+1)); -x0 - (1+theta)*z2 /z1; -pi^(-1/theta) - ((1-xi) *(x0*pi)^(-1/theta) + xi *piBar^(-1/theta)); -Y - (Disp^(-1) *A *KBar^alpha *L^(1-alpha)); -Disp - ((1-xi) *x0^(-(1+theta)/theta) - + xi *(piBar/pi)^(-(1+theta)/theta) *Disp(-1)); -log(A/ABar) - (rhoa *log(A(-1)/ABar) + eps1); -log(G/GBar) - (rhog *log(G(-1)/GBar) + eps2); -(Y-G)^(-phi) - (beta *(Int/pi(+1)) *(Y(+1)-G(+1))^(-phi)); -Welf - ((Y-G)^(1-phi) /(1-phi) - + chi0*(1-L-ZBar)^(1-chi) /(1-chi) + beta *Welf(+1)); -Cequiv = (((1-beta)*Welf-chi0*(1-LStar-ZBar)^(1-chi) /(1-chi))*(1-phi))^(1/(1-phi)); -(1-alpha) *A *KBar^alpha *LStar^(-alpha) - - (1+theta) *YStar *(YStar-G)^(phi-1) *chi0 - *(1-LStar-ZBar)^(-chi); -YStar - A *KBar^alpha *LStar^(1-alpha); -YGap - (log(Y/YStar)); -WelfStar - ((YStar-G)^(1-phi) /(1-phi) - + chi0*(1-LStar-ZBar)^(1-chi) /(1-chi) + beta *WelfStar(+1)); -Int = (Int(-1)^rho)*((Istar*(pi/piBar)^gamma)^(1-rho))*exp(eps3); -Cbar=(1/100)*((1-phi)*((1-beta)*WelfStar-chi0*(1-LStar-ZBar)^(1-chi)/(1-chi)))^(1/(1-phi)); -end; - -initval; -A= 4.022; -Disp= 1; -G= 0.3; -Int= 1.0101; -L= 0.22; -LStar= 0.22; -pi= 1; -Welf= -359; -WelfStar= -359; -x0= 1; -Y= 2.8; -YGap= 0; -YStar= 2.8; -z1= 2.5; -z2= 1.8; -Cbar= 0.024; -Cequiv = 0.024; -end; - -vcov = [0.001 0 0 ; 0 0.001 0; 0 0 0.001]; - -order=4; - - diff --git a/dynare++/tests/sw_euro.mod b/dynare++/tests/sw_euro.mod deleted file mode 100644 index fc6da21fb..000000000 --- a/dynare++/tests/sw_euro.mod +++ /dev/null @@ -1,98 +0,0 @@ -var MC EH EF R_KF QF CF IF YF LF PIEF WF RF R_KH QH CH IH YH LH PIEH WH RH EE_A PIE_BAR EE_B EE_G EE_L EE_I KF KH ONE; - -varexo E_A E_B E_G E_L E_I ETA_R E_PIE_BAR ETA_Q ETA_P ETA_W ; - -parameters xi_e lambda_w alpha czcap beta phi_i tau sig_c hab ccs cinvs phi_y gamma_w xi_w gamma_p xi_p sig_l r_dpi r_pie r_dy r_y rho rho_a rho_pb rho_b rho_g rho_l rho_i ; -alpha=.30; -beta=0.99; -tau=0.025; -ccs=0.6; -cinvs=.22; -lambda_w = 0.5; -phi_i= 6.771; -sig_c= 1.353; -hab= 0.573; -xi_w= 0.737; -sig_l= 2.400; -xi_p= 0.908; -xi_e= 0.599; -gamma_w= 0.763; -gamma_p= 0.469; -czcap= 0.169; -phi_y= 1.408; -r_pie= 1.684; -r_dpi= 0.14; -rho= 0.961; -r_y= 0.099; -r_dy= 0.159; -rho_a= 0.823; -rho_b= 0.855; -rho_g= 0.949; -rho_l= 0.889; -rho_i= 0.927; -rho_pb= 0.924; - - -model; - CF = (1/(1+hab))*(CF(1)+hab*CF(-1))-((1-hab)/((1+hab)*sig_c))*(RF-PIEF(1)-EE_B) ; - 0 = alpha*R_KF+(1-alpha)*WF -EE_A ; - PIEF = 0*ONE; - IF = (1/(1+beta))* (( IF(-1) + beta*(IF(1)))+(1/phi_i)*QF)+0*ETA_Q+EE_I ; - QF = -(RF-PIEF(1))+(1-beta*(1-tau))*((1+czcap)/czcap)*R_KF(1)+beta*(1-tau)*QF(1) +0*EE_I ; - KF = (1-tau)*KF(-1)+tau*IF(-1) ; - YF = (ccs*CF+cinvs*IF)+EE_G ; - YF = 1*phi_y*( alpha*KF+alpha*(1/czcap)*R_KF+(1-alpha)*LF+EE_A ) ; - WF = (sig_c/(1-hab))*(CF-hab*CF(-1)) + sig_l*LF - EE_L ; - LF = R_KF*((1+czcap)/czcap)-WF+KF ; - EF = EF(-1)+EF(1)-EF+(LF-EF)*((1-xi_e)*(1-xi_e*beta)/(xi_e)); - - CH = (hab/(1+hab))*CH(-1)+(1/(1+hab))*CH(1)-((1-hab)/((1+hab)*sig_c))*(RH-PIEH(1)-EE_B) ; - IH = (1/(1+beta))* (( IH(-1) + beta*(IH(1)))+(1/phi_i)*QH )+1*ETA_Q+1*EE_I ; - QH = -(RH-PIEH(1))+(1-beta*(1-tau))*((1+czcap)/czcap)*R_KH(1)+beta*(1-tau)*QH(1) +EE_I*0+0*ETA_Q ; - KH = (1-tau)*KH(-1)+tau*IH(-1) ; - YH = (ccs*CH+cinvs*IH)+ EE_G ; - YH = phi_y*( alpha*KH+alpha*(1/czcap)*R_KH+(1-alpha)*LH ) +phi_y*EE_A ; - PIEH = (1/(1+beta*gamma_p))* - ( - (beta)*(PIEH(1)) +(gamma_p)*(PIEH(-1)) - +((1-xi_p)*(1-beta*xi_p)/(xi_p))*(MC) - ) + ETA_P ; - - MC = alpha*R_KH+(1-alpha)*WH -EE_A; - WH = (1/(1+beta))*(beta*WH(+1)+WH(-1)) - +(beta/(1+beta))*(PIEH(+1)) - -((1+beta*gamma_w)/(1+beta))*(PIEH) - +(gamma_w/(1+beta))*(PIEH(-1)) - -(1/(1+beta))*(((1-beta*xi_w)*(1-xi_w))/(((1+(((1+lambda_w)*sig_l)/(lambda_w))))*xi_w))*(WH-sig_l*LH-(sig_c/(1-hab))*(CH-hab*CH(-1))+EE_L) - +ETA_W; - LH = R_KH*((1+czcap)/czcap)-WH+KH ; - RH = r_dpi*(PIEH-PIEH(-1)) - +(1-rho)*(r_pie*(PIEH(-1)-PIE_BAR)+r_y*(YH-YF)) - +r_dy*(YH-YF-(YH(-1)-YF(-1))) - +rho*(RH(-1)-PIE_BAR) - +PIE_BAR - +ETA_R; - EH = EH(-1)+EH(1)-EH+(LH-EH)*((1-xi_e)*(1-xi_e*beta)/(xi_e)); - - - EE_A = (rho_a)*EE_A(-1) + E_A; - PIE_BAR = rho_pb*PIE_BAR(-1)+ E_PIE_BAR ; - EE_B = rho_b*EE_B(-1) + E_B ; - EE_G = rho_g*EE_G(-1) + E_G ; - EE_L = rho_l*EE_L(-1) + E_L ; - EE_I = rho_i*EE_I(-1) + E_I ; - ONE = 0*ONE(-1) ; -end; - -vcov = [0.357604 0 0 0 0 0 0 0 0 0; - 0 0.112896 0 0 0 0 0 0 0 0; - 0 0 0.105625 0 0 0 0 0 0 0; - 0 0 0 12.39040 0 0 0 0 0 0; - 0 0 0 0 0.722500 0 0 0 0 0; - 0 0 0 0 0 0.656100 0 0 0 0; - 0 0 0 0 0 0 0.000289 0 0 0; - 0 0 0 0 0 0 0 0.364816 0 0; - 0 0 0 0 0 0 0 0 0.025600 0; - 0 0 0 0 0 0 0 0 0 0.083521]; - -order = 1; diff --git a/dynare++/tests/swma_pie.mod b/dynare++/tests/swma_pie.mod deleted file mode 100644 index bf6183ba6..000000000 --- a/dynare++/tests/swma_pie.mod +++ /dev/null @@ -1,187 +0,0 @@ -// this model has sticky wages and adjustment costs in -// investment, consumer goods sector is perfectly competitive, thus MC=1 -// with money and transaction costs based on money velocity -// and it has a financial accelerator -// wage is indexed to past consumer price inflation - -// LAMBDA Lagrange multiplier on household's budget constraint (divided by price level) -// PIE inflation of CPI -// PIETILDE to what inflation new wage setters index (here PIE(-1) but could be PIEW(-1)) -// INT nominal interest rate -// C real consumption -// I real investment -// K real capital -// R real rental rate of capital -// W real wage -// L labour -// Y real output -// PIEW nominal wage inflation -// VW wage front loading term for newly set wages -// BBD, BBE, BBF, BBG terms in nominator and denominator in wage FOC -// G government -// SL process for labor shock -// SC process for consumption shock -// SY process for technology shock -// RM real money balances hold -// Q real price of capital -// Q_M1 lagged Q -// RK nominal return of capital for enterpreneurs -// OMEGABAR threshold value for idiosyncratic shock -// N real net worth of borrowers -// WF lifetime utility - -var LAMBDA PIE PIETILDE INT C I K R W L Y PIEW VW BBD BBE BBF BBG G SL SC SY RM - Q Q_M1 RK OMEGABAR N ACAL ACALPRIME BCAL BCALPRIME WF; - -varexo E_C E_L E_Y E_GOV E_INT; - -parameters dep beta gamma eta biga alpha sigmaw phiw deltaw sg pietar h psi nu osigma mu tc1 tc2 ksi1 ksi2 c_weight rho_g rho_l rho_c rho_y; -dep = 0.025; -beta = 0.99; -gamma = 1; -eta = 2; -alpha = 0.30; -biga = alpha^(-alpha)*(1-alpha)^(alpha-1); -sigmaw = 11; -phiw = 2; -deltaw = 0.75; -sg = 0.18; -pietar = 1.03^0.25; -h = 0.8; -// investment adjustment costs -psi = 12; -// enterpreneur saving rate -nu = 0.94; -// stderr of enterpreneur's idiosyncratic shocks -osigma = 0.5; -// monitoring cost for lender -mu = 0.2; -// consumption transaction costs -tc1 = 0.05; -tc2 = 0.5; -// Taylor rule -ksi1 = 0.106; -ksi2 = 3; -rho_g = 0.90; -rho_l = 0.90; -rho_c = 0.90; -rho_y = 0.90; -// weight of consumption utility -c_weight = 1; - -model; -// capital accumulation -K = (1 - dep - psi/2*(I(-1)/K(-1)-dep)^2)*K(-1) + I(-1); -// FOC bonds -LAMBDA = beta*INT*LAMBDA(+1)/PIE(+1); -// FOC consumption (right hand side is equal to LAMBDA*(1+TC+TCPRIME*C/RM)) -SC*c_weight*(C-h*C(-1))^(-eta) = LAMBDA*(1+2*tc1*C/RM-2*sqrt(tc1*tc2)); -// FOC money (right hand side is equal to 1 - TCPRIME*C*C/RM/RM) -beta*LAMBDA(+1)/LAMBDA/PIE(+1) = 1 - tc1*C*C/RM/RM + tc2; -// FOC investment removed -// FOC capital(+1) removed -// real price of capital -Q = (1-psi*(I/K-dep))^(-1); -// nominal return on capital -RK = PIE*(R + Q*(1 - dep + psi*(I/K-dep)*I/K -psi/2*(I/K-dep)^2))/Q(-1); -// FOC in optimal contract for K(+1) -RK(+1)*(BCAL(+1)*ACALPRIME(+1)/BCALPRIME(+1)-ACAL(+1)) = INT(+1)*ACALPRIME(+1)/BCALPRIME(+1); -// Participation constraint -//RK(+1)*BCAL(+1) = INT(+1)*(1-N(+1)*PIE(+1)/Q/K(+1)); -RK*BCAL = INT*(1-N*PIE/Q(-1)/K); -// evolution of net worth (real) -N*PIE*PIE(-1) = nu*(ACAL(-1)+BCAL(-1))*RK(-1)*Q_M1(-1)*K(-1) - nu*INT(-1)*(Q_M1(-1)*K(-1)-N(-1)*PIE); -// marginal cost is 1 -1 = biga*(W/SY)^(1-alpha)*R^alpha; -// labor attaining minimal MC -L = (1-alpha)/W*Y; -// capital attaining minimal MC -K = alpha/R*Y; -// FOC for newly set wages -W*VW = sigmaw/(sigmaw-1)*(BBD*VW^(-sigmaw*gamma) + phiw*BBE*VW^(-sigmaw) - phiw*BBF)/BBG; -// definition of BBD -BBD = SL*L^(1+gamma) + deltaw*beta*(PIETILDE(+1)/PIEW(+1))^(-sigmaw*(1+gamma))*BBD(+1); -// definition of BBE -BBE = LAMBDA*L*W + deltaw*beta*(PIETILDE(+1)/PIEW(+1))^(-2*sigmaw)*BBE(+1); -// definition of BBF -BBF = LAMBDA*L*W + deltaw*beta*(PIETILDE(+1)/PIEW(+1))^(-sigmaw)*BBF(+1); -// definition of BBG -BBG = LAMBDA*L + deltaw*beta*(PIETILDE(+1)/PIEW(+1))^(-sigmaw)*PIETILDE(+1)/PIE(+1)*BBG(+1); -// price index -1 = (1-deltaw)*VW^(1-sigmaw) + deltaw*(PIETILDE/PIEW)^(1-sigmaw); -// definition of ACAL -ACAL = 0.5*erfc((log(OMEGABAR) - 0.5*osigma^2)/osigma/sqrt(2.0)) - OMEGABAR/2*erfc((log(OMEGABAR) + 0.5*osigma^2)/osigma/sqrt(2.0)); -// definition of BCAL -BCAL = OMEGABAR/2*erfc((log(OMEGABAR) + 0.5*osigma^2)/osigma/sqrt(2.0)) + (1-mu)/2*(1+erf((log(OMEGABAR) - 0.5*osigma^2)/osigma/sqrt(2.0))); -// definition of ACALPRIME -ACALPRIME = -0.5*erfc((log(OMEGABAR) + 0.5*osigma^2)/osigma/sqrt(2.0)); -// definition of BCALPRIME -BCALPRIME = -ACALPRIME - mu/osigma/2.506628274631*exp(-((log(OMEGABAR) + 0.5*osigma)^2)/2/osigma/osigma); -// identity for PIEW -PIEW = PIE*W/W(-1); -// welfare identity -WF = SC*c_weight*(C-h*C(-1))^(1-eta)/(1-eta) - SL*L^(1+gamma)/(1+gamma) + beta*WF(+1); -// interest rate rule -INT = INT(-1)^ksi1*((PIE/beta)*(PIE/pietar)^ksi2)^(1-ksi1)*exp(E_INT); -// aggregate constraint -Y = C + I + G + (1-ACAL-BCAL)*RK*Q(-1)*K; -//Y = C + I + G; -// process for government -G/Y = (G(-1)/Y(-1))^rho_g*sg^(1-rho_g)*exp(E_GOV/sg); -// to what do they index (pietar, past inflation, past indexed inflation) -PIETILDE = PIE(-1); -//PIETILDE = pietar; -// exo processes -SL = SL(-1)^rho_l*exp(E_L); -SC = SC(-1)^rho_c*exp(E_C); -SY = SY(-1)^rho_y*exp(E_Y); -// lagged Q -Q_M1 = Q(-1); -end; - -initval; -RM = 0.1; -INT = pietar/beta; -PIE = pietar; -PIEW = pietar; -PIETILDE = pietar; -//R = dep/beta; -R = 0.1; -W = (1/biga/(R)^alpha)^(1/(1-alpha)); -LAMBDA = ((1-dep*alpha/R-sg)*(1-h)*c_weight/(1-alpha)*W^(1/gamma+1)*((sigmaw-1)/sigmaw)^(1/gamma))^(-1/(1/eta+1/gamma)); -L = (W*LAMBDA*(sigmaw-1)/sigmaw)^(1/gamma); -Y = W*L/(1-alpha); -K = alpha/R*Y; -I = dep*K; -G = sg*Y; -VW = 1; -BBD = L^(1+gamma)/(1-deltaw*beta); -BBE = LAMBDA*L*W/(1-deltaw*beta); -BBF = LAMBDA*L*W/(1-deltaw*beta); -BBG = LAMBDA*L/(1-deltaw*beta); -Q = 1; -Q_M1 = Q; -RK = 1/Q*PIE*(R+(1-dep)*Q); -OMEGABAR = 0.5; -ACAL = 0.5*erfc((log(OMEGABAR) - 0.5*osigma^2)/osigma/sqrt(2.0)) - OMEGABAR/2*erfc((log(OMEGABAR) + 0.5*osigma^2)/osigma/sqrt(2.0)); -BCAL = OMEGABAR/2*erfc((log(OMEGABAR) + 0.5*osigma^2)/osigma/sqrt(2.0)) + (1-mu)/2*(1+erf((log(OMEGABAR) - 0.5*osigma^2)/osigma/sqrt(2.0))); -ACALPRIME = -0.5*erfc((log(OMEGABAR) + 0.5*osigma^2)/osigma/sqrt(2.0)); -BCALPRIME = -ACALPRIME - mu/osigma/2.506628274631*exp(-((log(OMEGABAR) + 0.5*osigma)^2)/2/osigma/osigma); -N = (nu*(ACAL+BCAL)*RK*Q*K-nu*INT*Q*K)/(PIE*PIE-nu*INT*PIE); -C = Y - I - G - (1-ACAL-BCAL)*RK*Q*K; -SL = 1; -SC = 1; -SY = 1; -WF = 1/(1-beta)*(SC*c_weight*((1-h)*C)^(1-eta)/(1-eta) - SL*L^(1+gamma)/(1+gamma)); -end; - -vcov = [ -0.0001 0 0 0 0; -0 0.0001 0 0 0; -0 0 0.0001 0 0; -0 0 0 0.0001 0; -0 0 0 0 0.0001 -]; - -order = 4; - diff --git a/dynare++/tests/test.mod b/dynare++/tests/test.mod deleted file mode 100644 index 98b7158a7..000000000 --- a/dynare++/tests/test.mod +++ /dev/null @@ -1,39 +0,0 @@ -var a, b, c, h, k, y; -varexo e,u; - -parameters beta, rho, alpha, delta, theta, psi, tau, phi; - -alpha = 0.36; -rho = 0.95; -tau = 0.025; -beta = 0.99; -delta = 0.025; -psi = 0; -theta = 2.95; - -phi = 0.1; - -model; -c*theta*h^(1+psi)=(1-alpha)*y; -k = beta*(((exp(b)*c)/(exp(b(+1))*c(+1)))*(exp(b(+1))*alpha*y(+1)+(1-delta)*k)); -y = exp(a)*(k(-1)^alpha)*(h^(1-alpha)); -k = exp(b)*(y-c)+(1-delta)*k(-1); -a = rho*a(-1)+tau*b(-1) + e; -b = tau*a(-1)+rho*b(-1) + u; -end; - -initval; -y = 1; -c = 0.7; -h = 0.1; -k = 11; -a = 0; -b = 0; -e = 0; -u = 0; -end; - -vcov = [ 0.000081 0.000008;0.000008 0.000081]; - -order = 2; - diff --git a/dynare++/tests/test1.mod b/dynare++/tests/test1.mod deleted file mode 100644 index 04e7f6196..000000000 --- a/dynare++/tests/test1.mod +++ /dev/null @@ -1,42 +0,0 @@ -var y, c, k, a, h, b; -varexo e,u; - -parameters beta, rho, alpha, delta, theta, psi, tau, phi; - -alpha = 0.36; -rho = 0.95; -tau = 0.025; -beta = 0.99; -delta = 0.025; -psi = 0; -theta = 2.95; - -phi = 0.1; - -model; -c*theta*h^(1+psi)=(1-alpha)*y; -k = beta*(((exp(b)*c)/(exp(b(+1))*c(+1)))*(exp(b(+1))*alpha*y(+1)+(1-delta)*k)); -y = exp(a)*(k(-1)^alpha)*(h^(1-alpha)); -k = exp(b)*(y-c)+(1-delta)*k(-1); -a = rho*a(-1)+tau*b(-1) + e; -b = tau*a(-1)+rho*b(-1) + u; -end; - -initval; -y = 1; -c = 0.7; -h = 0.1; -k = 11; -a = 0; -b = 0; -e = 0; -u = 0; -end; - -vcov = [ 0.000081 0.0000081; 0.0000081 0.000081]; - -order = 1; - - - - diff --git a/dynare++/tests/test2.mod b/dynare++/tests/test2.mod deleted file mode 100644 index 0abc1dfa5..000000000 --- a/dynare++/tests/test2.mod +++ /dev/null @@ -1,39 +0,0 @@ -var y, c, k, a, h, b; -varexo e,u; - -parameters beta, rho, alpha, delta, theta, psi, tau, phi; - -alpha = 0.36; -rho = 0.95; -tau = 0.025; -beta = 0.99; -delta = 0.025; -psi = 0; -theta = 2.95; - -phi = 0.1; - -model; -c*theta*h^(1+psi)=(1-alpha)*y; -k = beta*(((exp(b)*c)/(exp(b(+1))*c(+1)))*(exp(b(+1))*alpha*y(+1)+(1-delta)*k)); -y = exp(a)*(k(-1)^alpha)*(h^(1-alpha)); -k = exp(b)*(y-c)+(1-delta)*k(-1); -a = rho*a(-1)+tau*b(-1) - rho*a(-2) - tau*b(-3) + e; -b = tau*a(-1)+rho*b(-1) - rho*b(-2) - tau*a(-3) + u; -end; - -initval; -y = 1.08; -c = 0.8; -h = 0.29; -k = 11.08; -a = 0; -b = 0; -e = 0; -u = 0; -end; - -vcov = [ 0.01 0.005; 0.005 0.01]; - -order = 1; - diff --git a/dynare++/tests/test2a.mod b/dynare++/tests/test2a.mod deleted file mode 100644 index f0b044181..000000000 --- a/dynare++/tests/test2a.mod +++ /dev/null @@ -1,39 +0,0 @@ -var y, c, k, a, h, b; -varexo e,u; - -parameters beta, rho, alpha, delta, theta, psi, tau, phi; - -alpha = 0.36; -rho = 0.95; -tau = 0.025; -beta = 0.99; -delta = 0.025; -psi = 0; -theta = 2.95; - -phi = 0.1; - -model; -c*theta*h^(1+psi)=(1-alpha)*y; -k = beta*(((exp(b)*c)/(exp(b(+1))*c(+1)))*(exp(b(+1))*alpha*y(+1)+(1-delta)*k)); -y = exp(a)*(k(-1)^alpha)*(h^(1-alpha)); -k = exp(b)*(y-c)+(1-delta)*k(-1); -a = rho*a(-1)+tau*b(-1) - rho*a(-2) - tau*b(-3) + e; -b = tau*a(-1)+rho*b(-1) - rho*b(-2) - tau*a(-3) + u; -end; - -initval; -y = 1.08; -c = 0.8; -h = 0.29; -k = 11.08; -a = 0; -b = 0; -e = 0; -u = 0; -end; - -vcov = [ 0.01 0.005; 0.005 0.01]; - -order = 2; - diff --git a/dynare++/tests/test3.mod b/dynare++/tests/test3.mod deleted file mode 100644 index 7f386f2a8..000000000 --- a/dynare++/tests/test3.mod +++ /dev/null @@ -1,30 +0,0 @@ -var y,x; -varexo u,v; -parameters a, b, c, d, e, f, g, h, j; - -a=0.8; -b=0.9; -c=0.9; -d=1; -e=-0.556875; -f=-0.172125; -g=-0.9; -h=-0.2754; -j=-1.8; - - -model; -x=a*x(-1)+u; -c*y(+1)^2+d*y^2+e*x^2+f*u^2-d*v^2+g+h*x(-1)*u+j*x(-1)*v=0; -end; - -initval; -x=0; -y=0.7237469; -u=0; -v=0; -end; - -vcov=[1 0; 0 1]; - -order = 2; \ No newline at end of file diff --git a/dynare++/tests/test4.mod b/dynare++/tests/test4.mod deleted file mode 100644 index 4250ac3a0..000000000 --- a/dynare++/tests/test4.mod +++ /dev/null @@ -1,27 +0,0 @@ -var y,x; -varexo u,v; -parameters a, b, c, d, e, f, m; - -a=0.8; -b=0.9; -c=0.9; -d=1; -e=1; -m=50; -f = 1; - -model; -x = a*x(-1)+u; -c*y(+1)^2+d*y^2+e*x^2-(c+d)*m^2-(c*b*b*a*a+d*b*b+e*a*a)*x(-1)^2-(c*b*b+e)*u^2-2*(c*m*b*a+d*m*b)*x(-1)-2*c*m*b*u-2*(c*b*b*a+e*a)*x(-1)*u-d*f^2*v^2-2*d*m*f*v-2*d*b*f*x(-1)*v=0; -end; - -initval; -x=1; -y=21; -u=0; -v=0; -end; - -vcov=[1 0; 0 1]; - -order = 2; diff --git a/dynare++/tests/test5.mod b/dynare++/tests/test5.mod deleted file mode 100644 index 4e2e5938a..000000000 --- a/dynare++/tests/test5.mod +++ /dev/null @@ -1,27 +0,0 @@ -var y,x; -varexo u,v; -parameters a, b, c, d, e, m, n; - -a=-0.8; -b=0.9; -c=0.9; -d=1; -e=1; -m=50; -n=0.2; - -model; -x=b*x(-1)+u; -a*y(+1)+y-(a*b^2+1)*x(-1)^2-2*a*b*x(-1)*u-a*u^2-a-2*x(-1)*v-v^2; -end; - -initval; -x=0; -y=0; -u=0; -v=0; -end; - -vcov=[1 0; 0 1]; - -order = 3; diff --git a/dynare++/tests/test6.mod b/dynare++/tests/test6.mod deleted file mode 100644 index 53f4e826c..000000000 --- a/dynare++/tests/test6.mod +++ /dev/null @@ -1,27 +0,0 @@ -var y,x; -varexo u,v; -parameters a, b, c, d, e, m, n; - -a=-0.8; -b=0.9; -c=0.9; -d=1; -e=1; -m=50; -n=0.2; - -model; -x=b*x(-1)+u; -a*y(+1)+y-(a*b^3+1)*x(-1)^3-3*a*b*x(-1)*u^2-3*a*b^2*x(-1)^2*u-a*u^3-a-v^2; -end; - -initval; -x=0; -y=0; -u=0; -v=0; -end; - -vcov=[1 0; 0 1]; - -order = 3; diff --git a/dynare++/tests/test7.mod b/dynare++/tests/test7.mod deleted file mode 100644 index f520b9453..000000000 --- a/dynare++/tests/test7.mod +++ /dev/null @@ -1,27 +0,0 @@ -var y,x; -varexo u,v; -parameters a, b, c, d, e, m, n; - -a=-0.8; -b=0.9; -c=0.9; -d=1; -e=1; -m=50; -n=0.2; - -model; -x=b*x(-1)+u; -a*y(+1)+y-(a*b^4+1)*x(-1)^4-4*a*b*x(-1)*u^3-4*a*b^3*x(-1)^3*u-6*a*(b*x(-1)*u)^2-a*u^4-v; -end; - -initval; -x=0; -y=0; -u=0; -v=0; -end; - -vcov=[1 0; 0 1]; - -order = 4; diff --git a/dynare++/tl/Makefile.am b/dynare++/tl/Makefile.am deleted file mode 100644 index ffebab6fe..000000000 --- a/dynare++/tl/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = cc testing diff --git a/dynare++/tl/cc/Makefile.am b/dynare++/tl/cc/Makefile.am deleted file mode 100644 index 026cb13f1..000000000 --- a/dynare++/tl/cc/Makefile.am +++ /dev/null @@ -1,45 +0,0 @@ -noinst_LIBRARIES = libtl.a - -libtl_a_SOURCES = \ - equivalence.cc \ - equivalence.hh \ - fine_container.cc \ - fine_container.hh \ - fs_tensor.cc \ - fs_tensor.hh \ - gs_tensor.cc \ - gs_tensor.hh \ - int_sequence.cc \ - int_sequence.hh \ - kron_prod.cc \ - kron_prod.hh \ - normal_moments.cc \ - normal_moments.hh \ - permutation.cc \ - permutation.hh \ - ps_tensor.cc \ - ps_tensor.hh \ - pyramid_prod.cc \ - pyramid_prod.hh \ - pyramid_prod2.cc \ - pyramid_prod2.hh \ - rfs_tensor.cc \ - rfs_tensor.hh \ - sparse_tensor.cc \ - sparse_tensor.hh \ - stack_container.cc \ - stack_container.hh \ - symmetry.cc \ - symmetry.hh \ - t_container.cc \ - t_container.hh \ - t_polynomial.cc \ - t_polynomial.hh \ - tensor.cc \ - tensor.hh \ - tl_exception.hh \ - tl_static.cc \ - tl_static.hh \ - twod_matrix.cc \ - twod_matrix.hh -libtl_a_CPPFLAGS = -I../../sylv/cc -I../../utils/cc $(CPPFLAGS_MATIO) diff --git a/dynare++/utils/cc/Makefile.am b/dynare++/utils/cc/Makefile.am deleted file mode 100644 index 93410c9b7..000000000 --- a/dynare++/utils/cc/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -noinst_LIBRARIES = libutils.a - -libutils_a_SOURCES = \ - exception.hh \ - pascal_triangle.cc \ - pascal_triangle.hh \ - int_power.hh \ - int_power.cc \ - sthread.hh \ - sthread.cc diff --git a/license.txt b/license.txt index 1996d6c0a..34140b637 100644 --- a/license.txt +++ b/license.txt @@ -278,9 +278,8 @@ Copyright: 2007-2017 Sébastien Villemot 2016-2017 Johannes Pfeifer License: GFDL-NIV-1.3+ -Files: dynare++/* +Files: doc/sylvester.tex doc/tl.tex Copyright: 2004-2011 Ondra Kamenik - 2019-2023 Dynare Team License: GPL-3+ Files: m4/ax_compare_version.m4 @@ -303,8 +302,11 @@ Copyright: 2010 Yannick Kalantzis License: GPL-3+ Files: mex/sources/gensylv/gensylv.cc -Copyright: 2005-2011 Ondra Kamenik - 2019-2020 Dynare Team + mex/sources/libkorder/kord/* mex/sources/libkorder/integ/* + mex/sources/libkorder/sylv/* mex/sources/libkorder/tl/* + mex/sources/libkorder/utils/* +Copyright: 2004-2011 Ondra Kamenik + 2019-2023 Dynare Team License: GPL-3+ Files: mex/sources/sobol/sobol.f08 diff --git a/mex/build/gensylv.am b/mex/build/gensylv.am index b664759aa..9ac05d7d1 100644 --- a/mex/build/gensylv.am +++ b/mex/build/gensylv.am @@ -1,8 +1,10 @@ mex_PROGRAMS = gensylv -gensylv_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/../../../dynare++/sylv/cc -I$(top_srcdir)/../../../dynare++/utils/cc +LIBKORDER_DIR = $(top_srcdir)/../../sources/libkorder -gensylv_LDADD = ../libdynare++/libdynare++.a +gensylv_CPPFLAGS = $(AM_CPPFLAGS) -I$(LIBKORDER_DIR)/sylv -I$(LIBKORDER_DIR)/utils + +gensylv_LDADD = ../libkorder/libkorder.a nodist_gensylv_SOURCES = gensylv.cc diff --git a/mex/build/k_order_perturbation.am b/mex/build/k_order_perturbation.am index 5da9f5c79..7102bc77e 100644 --- a/mex/build/k_order_perturbation.am +++ b/mex/build/k_order_perturbation.am @@ -1,11 +1,12 @@ mex_PROGRAMS = k_order_perturbation TOPDIR = $(top_srcdir)/../../sources/k_order_perturbation +LIBKORDER_DIR = $(top_srcdir)/../../sources/libkorder -k_order_perturbation_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/../../../dynare++/src -I$(top_srcdir)/../../../dynare++/kord -I$(top_srcdir)/../../../dynare++/tl/cc -I$(top_srcdir)/../../../dynare++/utils/cc -I$(top_srcdir)/../../../dynare++/sylv/cc -I$(top_srcdir)/../../../dynare++/integ/cc -I$(TOPDIR) $(CPPFLAGS_MATIO) +k_order_perturbation_CPPFLAGS = $(AM_CPPFLAGS) -I$(LIBKORDER_DIR) -I$(LIBKORDER_DIR)/kord -I$(LIBKORDER_DIR)/tl -I$(LIBKORDER_DIR)/utils -I$(LIBKORDER_DIR)/sylv -I$(LIBKORDER_DIR)/integ -I$(TOPDIR) $(CPPFLAGS_MATIO) k_order_perturbation_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_MATIO) -k_order_perturbation_LDADD = ../libdynare++/libdynare++.a ../libkorder/libkorder.a $(LIBADD_DLOPEN) $(LIBADD_MATIO) +k_order_perturbation_LDADD = ../libkorder/libkorder.a $(LIBADD_DLOPEN) $(LIBADD_MATIO) nodist_k_order_perturbation_SOURCES = k_order_perturbation.cc diff --git a/mex/build/k_order_welfare.am b/mex/build/k_order_welfare.am index f92702035..26f24226a 100644 --- a/mex/build/k_order_welfare.am +++ b/mex/build/k_order_welfare.am @@ -1,11 +1,12 @@ mex_PROGRAMS = k_order_welfare TOPDIR = $(top_srcdir)/../../sources/k_order_welfare +LIBKORDER_DIR = $(top_srcdir)/../../sources/libkorder -k_order_welfare_CPPFLAGS = $(AM_CPPFLAGS) -I$(TOPDIR) -I$(TOPDIR)/../k_order_perturbation -I$(top_srcdir)/../../../dynare++/tl/cc -I$(top_srcdir)/../../../dynare++/kord -I$(top_srcdir)/../../../dynare++/src -I$(top_srcdir)/../../../dynare++/sylv/cc -I$(top_srcdir)/../../../dynare++/utils/cc $(CPPFLAGS_MATIO) +k_order_welfare_CPPFLAGS = $(AM_CPPFLAGS) -I$(TOPDIR) -I$(LIBKORDER_DIR) -I$(LIBKORDER_DIR)/tl -I$(LIBKORDER_DIR)/kord -I$(LIBKORDER_DIR)/sylv -I$(LIBKORDER_DIR)/utils $(CPPFLAGS_MATIO) k_order_welfare_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_MATIO) -k_order_welfare_LDADD = ../libdynare++/libdynare++.a ../libkorder/libkorder.a $(LIBADD_DLOPEN) $(LIBADD_MATIO) +k_order_welfare_LDADD = ../libkorder/libkorder.a $(LIBADD_DLOPEN) $(LIBADD_MATIO) nodist_k_order_welfare_SOURCES = \ k_order_welfare.cc \ diff --git a/mex/build/libdynare++.am b/mex/build/libdynare++.am deleted file mode 100644 index bb062275b..000000000 --- a/mex/build/libdynare++.am +++ /dev/null @@ -1,101 +0,0 @@ -noinst_LIBRARIES = libdynare++.a - -TOPDIR = $(top_srcdir)/../../../dynare++ - -libdynare___a_CPPFLAGS = $(AM_CPPFLAGS) -I$(TOPDIR)/src -I$(TOPDIR)/kord -I$(TOPDIR)/tl/cc -I$(TOPDIR)/utils/cc -I$(TOPDIR)/sylv/cc -I$(TOPDIR)/integ/cc $(CPPFLAGS_MATIO) - -# TODO: fix the codebase so that the following line is no longer needed -libdynare___a_CXXFLAGS = $(AM_CXXFLAGS) -Wno-unused-parameter - -KORD_SRCS = \ - approximation.cc \ - decision_rule.cc \ - dynamic_model.cc \ - faa_di_bruno.cc \ - first_order.cc \ - global_check.cc \ - korder.cc \ - korder_stoch.cc \ - journal.cc \ - normal_conjugate.cc \ - seed_generator.cc - -SYLV_SRCS = \ - BlockDiagonal.cc \ - GeneralMatrix.cc \ - GeneralSylvester.cc \ - IterativeSylvester.cc \ - KronUtils.cc \ - KronVector.cc \ - QuasiTriangular.cc \ - QuasiTriangularZero.cc \ - SchurDecomp.cc \ - SchurDecompEig.cc \ - SimilarityDecomp.cc \ - SylvException.cc \ - SylvMatrix.cc \ - SylvParams.cc \ - SymSchurDecomp.cc \ - TriangularSylvester.cc \ - Vector.cc - -TL_SRCS = \ - equivalence.cc \ - fine_container.cc \ - fs_tensor.cc \ - gs_tensor.cc \ - int_sequence.cc \ - kron_prod.cc \ - normal_moments.cc \ - permutation.cc \ - ps_tensor.cc \ - pyramid_prod.cc \ - pyramid_prod2.cc \ - rfs_tensor.cc \ - sparse_tensor.cc \ - stack_container.cc \ - symmetry.cc \ - t_container.cc \ - t_polynomial.cc \ - tensor.cc \ - tl_static.cc \ - twod_matrix.cc - -INTEG_SRCS = \ - quadrature.cc \ - quasi_mcarlo.cc \ - product.cc \ - smolyak.cc \ - vector_function.cc - -UTILS_SRCS = \ - pascal_triangle.cc \ - int_power.cc \ - sthread.cc - -OTHER_SRCS = \ - nlsolve.cc - -nodist_libdynare___a_SOURCES = \ - $(KORD_SRCS) \ - $(TL_SRCS) \ - $(SYLV_SRCS) \ - $(INTEG_SRCS) \ - $(UTILS_SRCS) \ - $(OTHER_SRCS) - -BUILT_SOURCES = $(nodist_libdynare___a_SOURCES) -CLEANFILES = $(nodist_libdynare___a_SOURCES) - -$(KORD_SRCS): %.cc: $(TOPDIR)/kord/%.cc - $(LN_S) -f $< $@ -$(TL_SRCS): %.cc: $(TOPDIR)/tl/cc/%.cc - $(LN_S) -f $< $@ -$(SYLV_SRCS): %.cc: $(TOPDIR)/sylv/cc/%.cc - $(LN_S) -f $< $@ -$(INTEG_SRCS): %.cc: $(TOPDIR)/integ/cc/%.cc - $(LN_S) -f $< $@ -$(UTILS_SRCS): %.cc: $(TOPDIR)/utils/cc/%.cc - $(LN_S) -f $< $@ -$(OTHER_SRCS): %.cc: $(TOPDIR)/src/%.cc - $(LN_S) -f $< $@ diff --git a/mex/build/libkorder.am b/mex/build/libkorder.am index 093b68819..954ce0226 100644 --- a/mex/build/libkorder.am +++ b/mex/build/libkorder.am @@ -1,16 +1,104 @@ noinst_LIBRARIES = libkorder.a -TOPDIR = $(top_srcdir)/../../sources/k_order_perturbation +TOPDIR = $(top_srcdir)/../../sources/libkorder -libkorder_a_CPPFLAGS = $(AM_CPPFLAGS) -I$(TOPDIR) -I$(top_srcdir)/../../../dynare++/tl/cc -I$(top_srcdir)/../../../dynare++/sylv/cc -I$(top_srcdir)/../../../dynare++/src -I$(top_srcdir)/../../../dynare++/kord -I$(top_srcdir)/../../../dynare++/utils/cc $(CPPFLAGS_MATIO) +libkorder_a_CPPFLAGS = $(AM_CPPFLAGS) -I$(TOPDIR) -I$(TOPDIR)/tl -I$(TOPDIR)/sylv -I$(TOPDIR)/integ -I$(TOPDIR)/kord -I$(TOPDIR)/utils $(CPPFLAGS_MATIO) -nodist_libkorder_a_SOURCES = \ +# TODO: fix the codebase so that the following line is no longer needed +libkorder_a_CXXFLAGS = $(AM_CXXFLAGS) -Wno-unused-parameter + +KORD_SRCS = \ + approximation.cc \ + decision_rule.cc \ + dynamic_model.cc \ + faa_di_bruno.cc \ + first_order.cc \ + global_check.cc \ + korder.cc \ + korder_stoch.cc \ + journal.cc \ + normal_conjugate.cc \ + seed_generator.cc + +SYLV_SRCS = \ + BlockDiagonal.cc \ + GeneralMatrix.cc \ + GeneralSylvester.cc \ + IterativeSylvester.cc \ + KronUtils.cc \ + KronVector.cc \ + QuasiTriangular.cc \ + QuasiTriangularZero.cc \ + SchurDecomp.cc \ + SchurDecompEig.cc \ + SimilarityDecomp.cc \ + SylvException.cc \ + SylvMatrix.cc \ + SylvParams.cc \ + SymSchurDecomp.cc \ + TriangularSylvester.cc \ + Vector.cc + +TL_SRCS = \ + equivalence.cc \ + fine_container.cc \ + fs_tensor.cc \ + gs_tensor.cc \ + int_sequence.cc \ + kron_prod.cc \ + normal_moments.cc \ + permutation.cc \ + ps_tensor.cc \ + pyramid_prod.cc \ + pyramid_prod2.cc \ + rfs_tensor.cc \ + sparse_tensor.cc \ + stack_container.cc \ + symmetry.cc \ + t_container.cc \ + t_polynomial.cc \ + tensor.cc \ + tl_static.cc \ + twod_matrix.cc + +INTEG_SRCS = \ + quadrature.cc \ + quasi_mcarlo.cc \ + product.cc \ + smolyak.cc \ + vector_function.cc + +UTILS_SRCS = \ + pascal_triangle.cc \ + int_power.cc \ + sthread.cc \ + nlsolve.cc + +TOPDIR_SRCS = \ k_ord_dynare.cc \ dynamic_dll.cc \ dynamic_m.cc +nodist_libkorder_a_SOURCES = \ + $(KORD_SRCS) \ + $(TL_SRCS) \ + $(SYLV_SRCS) \ + $(INTEG_SRCS) \ + $(UTILS_SRCS) \ + $(TOPDIR_SRCS) + BUILT_SOURCES = $(nodist_libkorder_a_SOURCES) CLEANFILES = $(nodist_libkorder_a_SOURCES) -%.cc: $(TOPDIR)/%.cc +$(TOPDIR_SRCS): %.cc: $(TOPDIR)/%.cc + $(LN_S) -f $< $@ +$(KORD_SRCS): %.cc: $(TOPDIR)/kord/%.cc + $(LN_S) -f $< $@ +$(TL_SRCS): %.cc: $(TOPDIR)/tl/%.cc + $(LN_S) -f $< $@ +$(SYLV_SRCS): %.cc: $(TOPDIR)/sylv/%.cc + $(LN_S) -f $< $@ +$(INTEG_SRCS): %.cc: $(TOPDIR)/integ/%.cc + $(LN_S) -f $< $@ +$(UTILS_SRCS): %.cc: $(TOPDIR)/utils/%.cc $(LN_S) -f $< $@ diff --git a/mex/build/matlab/Makefile.am b/mex/build/matlab/Makefile.am index 54a7dc1f6..d822bc07b 100644 --- a/mex/build/matlab/Makefile.am +++ b/mex/build/matlab/Makefile.am @@ -2,9 +2,9 @@ ACLOCAL_AMFLAGS = -I ../../../m4 SUBDIRS = mjdgges kronecker bytecode sobol perfect_foresight_problem num_procs block_trust_region disclyap_fast libkordersim local_state_space_iterations folded_to_unfolded_dr k_order_simul k_order_mean cycle_reduction logarithmic_reduction riccati_update -# libdynare++ must come before gensylv and k_order_perturbation -if ENABLE_MEX_DYNAREPLUSPLUS -SUBDIRS += libdynare++ gensylv libkorder k_order_perturbation k_order_welfare +# libkorder must come first +if ENABLE_MEX_GENSYLV_KORDER +SUBDIRS += libkorder gensylv k_order_perturbation k_order_welfare endif if ENABLE_MEX_MS_SBVAR diff --git a/mex/build/matlab/configure.ac b/mex/build/matlab/configure.ac index 67fa9913e..db678163c 100644 --- a/mex/build/matlab/configure.ac +++ b/mex/build/matlab/configure.ac @@ -64,8 +64,8 @@ AC_SUBST([LIBADD_DLOPEN]) AC_ARG_ENABLE([mex-ms-sbvar], AS_HELP_STRING([--disable-mex-ms-sbvar], [disable compilation of the MS-SBVAR MEX]), [], [enable_mex_ms_sbvar=yes]) AM_CONDITIONAL([ENABLE_MEX_MS_SBVAR], [test "$enable_mex_ms_sbvar" = yes]) -AC_ARG_ENABLE([mex-dynare++], AS_HELP_STRING([--disable-mex-dynare++], [disable compilation of MEX based on Dynare++]), [], [enable_mex_dynareplusplus=yes]) -AM_CONDITIONAL([ENABLE_MEX_DYNAREPLUSPLUS], [test "$enable_mex_dynareplusplus" = yes]) +AC_ARG_ENABLE([mex-gensylv-korder], AS_HELP_STRING([--disable-mex-gensylv-korder], [disable compilation of gensylv and k-order MEX]), [], [enable_mex_gensylv_korder=yes]) +AM_CONDITIONAL([ENABLE_MEX_GENSYLV_KORDER], [test "$enable_mex_gensylv_korder" = yes]) AC_ARG_ENABLE([mex-kalman-steady-state], AS_HELP_STRING([--disable-mex-kalman-steady-state], [disable compilation of the kalman_steady_state MEX]), [], [enable_mex_kalman_steady_state=yes]) AM_CONDITIONAL([ENABLE_MEX_KALMAN_STEADY_STATE], [test "$enable_mex_kalman_steady_state" = yes]) @@ -77,9 +77,9 @@ if test "$enable_mex_ms_sbvar" = yes; then fi # Check for libmatio, needed by MEX files using Dynare++ code -if test "$enable_mex_dynareplusplus" = yes; then +if test "$enable_mex_gensylv_korder" = yes; then AX_MATIO - test "$has_matio" != yes && AC_MSG_ERROR([libmatio cannot be found. If you want to skip the compilation of MEX files based Dynare++, pass the --disable-mex-dynare++ flag.]) + test "$has_matio" != yes && AC_MSG_ERROR([libmatio cannot be found. If you want to skip the compilation of gensylv and k-order MEX, pass the --disable-mex-gensylv-korder flag.]) fi # Check for libslicot, needed by kalman_steady_state @@ -115,10 +115,10 @@ AC_SUBST([M2HTML]) AM_CONDITIONAL([HAVE_M2HTML], [test "x$M2HTML" != "x"]) # Construct final output message -if test "$enable_mex_dynareplusplus" = yes; then - BUILD_GENSYLV_KORDER_DYNSIMUL_MEX_MATLAB="yes" +if test "$enable_mex_gensylv_korder" = yes; then + BUILD_GENSYLV_KORDER_MEX_MATLAB="yes" else - BUILD_GENSYLV_KORDER_DYNSIMUL_MEX_MATLAB="no" + BUILD_GENSYLV_KORDER_MEX_MATLAB="no" fi if test "$enable_mex_kalman_steady_state" = yes; then @@ -139,7 +139,7 @@ Dynare is now configured for building the following components... Binaries (with "make"): MEX files for MATLAB (except those listed below): yes - Gensylv, k-order and dynare_simul MEX files for MATLAB: $BUILD_GENSYLV_KORDER_DYNSIMUL_MEX_MATLAB + Gensylv and k-order MEX files for MATLAB: $BUILD_GENSYLV_KORDER_MEX_MATLAB MS-SBVAR MEX files for MATLAB: $BUILD_MS_SBVAR_MEX_MATLAB Kalman Steady State MEX file for MATLAB: $BUILD_KALMAN_STEADY_STATE_MATLAB M2HTML documentation: $BUILD_M2HTML @@ -150,7 +150,6 @@ AC_CONFIG_FILES([Makefile mjdgges/Makefile kronecker/Makefile bytecode/Makefile - libdynare++/Makefile gensylv/Makefile libkorder/Makefile k_order_perturbation/Makefile diff --git a/mex/build/matlab/libdynare++/Makefile.am b/mex/build/matlab/libdynare++/Makefile.am deleted file mode 100644 index c1283b13c..000000000 --- a/mex/build/matlab/libdynare++/Makefile.am +++ /dev/null @@ -1,2 +0,0 @@ -include ../mex.am -include ../../libdynare++.am diff --git a/mex/build/octave/Makefile.am b/mex/build/octave/Makefile.am index c89c9de0b..7c47da953 100644 --- a/mex/build/octave/Makefile.am +++ b/mex/build/octave/Makefile.am @@ -2,9 +2,9 @@ ACLOCAL_AMFLAGS = -I ../../../m4 SUBDIRS = mjdgges kronecker bytecode sobol perfect_foresight_problem num_procs block_trust_region disclyap_fast libkordersim local_state_space_iterations folded_to_unfolded_dr k_order_simul k_order_mean cycle_reduction logarithmic_reduction riccati_update -# libdynare++ must come before gensylv and k_order_perturbation -if ENABLE_MEX_DYNAREPLUSPLUS -SUBDIRS += libdynare++ gensylv libkorder k_order_perturbation k_order_welfare +# libkorder must come first +if ENABLE_MEX_GENSYLV_KORDER +SUBDIRS += libkorder gensylv k_order_perturbation k_order_welfare endif if ENABLE_MEX_MS_SBVAR diff --git a/mex/build/octave/configure.ac b/mex/build/octave/configure.ac index 001f6facd..2b0f46f48 100644 --- a/mex/build/octave/configure.ac +++ b/mex/build/octave/configure.ac @@ -66,8 +66,8 @@ AC_SUBST([LIBADD_DLOPEN]) AC_ARG_ENABLE([mex-ms-sbvar], AS_HELP_STRING([--disable-mex-ms-sbvar], [disable compilation of the MS-SBVAR MEX]), [], [enable_mex_ms_sbvar=yes]) AM_CONDITIONAL([ENABLE_MEX_MS_SBVAR], [test "$enable_mex_ms_sbvar" = yes]) -AC_ARG_ENABLE([mex-dynare++], AS_HELP_STRING([--disable-mex-dynare++], [disable compilation of MEX based on Dynare++]), [], [enable_mex_dynareplusplus=yes]) -AM_CONDITIONAL([ENABLE_MEX_DYNAREPLUSPLUS], [test "$enable_mex_dynareplusplus" = yes]) +AC_ARG_ENABLE([mex-gensylv-korder], AS_HELP_STRING([--disable-mex-gensylv-korder], [disable compilation of gensylv and k-order MEX]), [], [enable_mex_gensylv_korder=yes]) +AM_CONDITIONAL([ENABLE_MEX_GENSYLV_KORDER], [test "$enable_mex_gensylv_korder" = yes]) AC_ARG_ENABLE([mex-kalman-steady-state], AS_HELP_STRING([--disable-mex-kalman-steady-state], [disable compilation of the kalman_steady_state MEX]), [], [enable_mex_kalman_steady_state=yes]) AM_CONDITIONAL([ENABLE_MEX_KALMAN_STEADY_STATE], [test "$enable_mex_kalman_steady_state" = yes]) @@ -79,9 +79,9 @@ if test "$enable_mex_ms_sbvar" = yes; then fi # Check for libmatio, needed by MEX files using Dynare++ code, and by ms-sbvar (the latter only under Octave, as an alternative to MATLAB's libmat) -if test "$enable_mex_dynareplusplus" = yes -o "$enable_mex_ms_sbvar" = yes; then +if test "$enable_mex_gensylv_korder" = yes -o "$enable_mex_ms_sbvar" = yes; then AX_MATIO - test "$has_matio" != yes && AC_MSG_ERROR([libmatio cannot be found. If you want to skip the compilation of MS-SBVAR MEX and MEX files based Dynare++, pass the --disable-mex-dynare++ and --disable-mex-ms-sbvar flags.]) + test "$has_matio" != yes && AC_MSG_ERROR([libmatio cannot be found. If you want to skip the compilation of MS-SBVAR, gensylv and k-order MEX, pass the --disable-mex-gensylv-korder and --disable-mex-ms-sbvar flags.]) fi # Check for libslicot, needed by kalman_steady_state @@ -127,10 +127,10 @@ esac AM_CONDITIONAL([LINK_OCTAVE_LIBS], [test ${link_octave_libs} = yes]) # Construct final output message -if test "$enable_mex_dynareplusplus" = yes; then - BUILD_GENSYLV_KORDER_DYNSIMUL_MEX_OCTAVE="yes" +if test "$enable_mex_gensylv_korder" = yes; then + BUILD_GENSYLV_KORDER_MEX_OCTAVE="yes" else - BUILD_GENSYLV_KORDER_DYNSIMUL_MEX_OCTAVE="no" + BUILD_GENSYLV_KORDER_MEX_OCTAVE="no" fi if test "$enable_mex_kalman_steady_state" = yes; then @@ -151,7 +151,7 @@ Dynare is now configured for building the following components... Binaries (with "make"): MEX files for Octave (except those listed below): yes - Gensylv, k-order and dynare_simul MEX for Octave: $BUILD_GENSYLV_KORDER_DYNSIMUL_MEX_OCTAVE + Gensylv and k-order MEX for Octave: $BUILD_GENSYLV_KORDER_MEX_OCTAVE MS-SBVAR MEX files for Octave: $BUILD_MS_SBVAR_MEX_OCTAVE Kalman Steady State MEX file for Octave: $BUILD_KALMAN_STEADY_STATE_OCTAVE @@ -161,7 +161,6 @@ AC_CONFIG_FILES([Makefile mjdgges/Makefile kronecker/Makefile bytecode/Makefile - libdynare++/Makefile gensylv/Makefile libkorder/Makefile k_order_perturbation/Makefile diff --git a/mex/build/octave/libdynare++/Makefile.am b/mex/build/octave/libdynare++/Makefile.am deleted file mode 100644 index 6ab9e430a..000000000 --- a/mex/build/octave/libdynare++/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -EXEEXT = .mex -include ../mex.am -include ../../libdynare++.am diff --git a/mex/sources/k_order_perturbation/dynamic_abstract_class.hh b/mex/sources/libkorder/dynamic_abstract_class.hh similarity index 100% rename from mex/sources/k_order_perturbation/dynamic_abstract_class.hh rename to mex/sources/libkorder/dynamic_abstract_class.hh diff --git a/mex/sources/k_order_perturbation/dynamic_dll.cc b/mex/sources/libkorder/dynamic_dll.cc similarity index 100% rename from mex/sources/k_order_perturbation/dynamic_dll.cc rename to mex/sources/libkorder/dynamic_dll.cc diff --git a/mex/sources/k_order_perturbation/dynamic_dll.hh b/mex/sources/libkorder/dynamic_dll.hh similarity index 100% rename from mex/sources/k_order_perturbation/dynamic_dll.hh rename to mex/sources/libkorder/dynamic_dll.hh diff --git a/mex/sources/k_order_perturbation/dynamic_m.cc b/mex/sources/libkorder/dynamic_m.cc similarity index 100% rename from mex/sources/k_order_perturbation/dynamic_m.cc rename to mex/sources/libkorder/dynamic_m.cc diff --git a/mex/sources/k_order_perturbation/dynamic_m.hh b/mex/sources/libkorder/dynamic_m.hh similarity index 100% rename from mex/sources/k_order_perturbation/dynamic_m.hh rename to mex/sources/libkorder/dynamic_m.hh diff --git a/dynare++/integ/cc/precalc_quadrature.hh b/mex/sources/libkorder/integ/precalc_quadrature.hh similarity index 100% rename from dynare++/integ/cc/precalc_quadrature.hh rename to mex/sources/libkorder/integ/precalc_quadrature.hh diff --git a/dynare++/integ/cc/product.cc b/mex/sources/libkorder/integ/product.cc similarity index 100% rename from dynare++/integ/cc/product.cc rename to mex/sources/libkorder/integ/product.cc diff --git a/dynare++/integ/cc/product.hh b/mex/sources/libkorder/integ/product.hh similarity index 100% rename from dynare++/integ/cc/product.hh rename to mex/sources/libkorder/integ/product.hh diff --git a/dynare++/integ/cc/quadrature.cc b/mex/sources/libkorder/integ/quadrature.cc similarity index 100% rename from dynare++/integ/cc/quadrature.cc rename to mex/sources/libkorder/integ/quadrature.cc diff --git a/dynare++/integ/cc/quadrature.hh b/mex/sources/libkorder/integ/quadrature.hh similarity index 100% rename from dynare++/integ/cc/quadrature.hh rename to mex/sources/libkorder/integ/quadrature.hh diff --git a/dynare++/integ/cc/quasi_mcarlo.cc b/mex/sources/libkorder/integ/quasi_mcarlo.cc similarity index 100% rename from dynare++/integ/cc/quasi_mcarlo.cc rename to mex/sources/libkorder/integ/quasi_mcarlo.cc diff --git a/dynare++/integ/cc/quasi_mcarlo.hh b/mex/sources/libkorder/integ/quasi_mcarlo.hh similarity index 100% rename from dynare++/integ/cc/quasi_mcarlo.hh rename to mex/sources/libkorder/integ/quasi_mcarlo.hh diff --git a/dynare++/integ/cc/smolyak.cc b/mex/sources/libkorder/integ/smolyak.cc similarity index 100% rename from dynare++/integ/cc/smolyak.cc rename to mex/sources/libkorder/integ/smolyak.cc diff --git a/dynare++/integ/cc/smolyak.hh b/mex/sources/libkorder/integ/smolyak.hh similarity index 100% rename from dynare++/integ/cc/smolyak.hh rename to mex/sources/libkorder/integ/smolyak.hh diff --git a/dynare++/integ/testing/Makefile.am b/mex/sources/libkorder/integ/tests/Makefile.am similarity index 100% rename from dynare++/integ/testing/Makefile.am rename to mex/sources/libkorder/integ/tests/Makefile.am diff --git a/dynare++/integ/testing/tests.cc b/mex/sources/libkorder/integ/tests/tests.cc similarity index 100% rename from dynare++/integ/testing/tests.cc rename to mex/sources/libkorder/integ/tests/tests.cc diff --git a/dynare++/integ/cc/vector_function.cc b/mex/sources/libkorder/integ/vector_function.cc similarity index 100% rename from dynare++/integ/cc/vector_function.cc rename to mex/sources/libkorder/integ/vector_function.cc diff --git a/dynare++/integ/cc/vector_function.hh b/mex/sources/libkorder/integ/vector_function.hh similarity index 100% rename from dynare++/integ/cc/vector_function.hh rename to mex/sources/libkorder/integ/vector_function.hh diff --git a/mex/sources/k_order_perturbation/k_ord_dynare.cc b/mex/sources/libkorder/k_ord_dynare.cc similarity index 100% rename from mex/sources/k_order_perturbation/k_ord_dynare.cc rename to mex/sources/libkorder/k_ord_dynare.cc diff --git a/mex/sources/k_order_perturbation/k_ord_dynare.hh b/mex/sources/libkorder/k_ord_dynare.hh similarity index 100% rename from mex/sources/k_order_perturbation/k_ord_dynare.hh rename to mex/sources/libkorder/k_ord_dynare.hh diff --git a/dynare++/kord/approximation.cc b/mex/sources/libkorder/kord/approximation.cc similarity index 100% rename from dynare++/kord/approximation.cc rename to mex/sources/libkorder/kord/approximation.cc diff --git a/dynare++/kord/approximation.hh b/mex/sources/libkorder/kord/approximation.hh similarity index 100% rename from dynare++/kord/approximation.hh rename to mex/sources/libkorder/kord/approximation.hh diff --git a/dynare++/kord/decision_rule.cc b/mex/sources/libkorder/kord/decision_rule.cc similarity index 100% rename from dynare++/kord/decision_rule.cc rename to mex/sources/libkorder/kord/decision_rule.cc diff --git a/dynare++/kord/decision_rule.hh b/mex/sources/libkorder/kord/decision_rule.hh similarity index 100% rename from dynare++/kord/decision_rule.hh rename to mex/sources/libkorder/kord/decision_rule.hh diff --git a/dynare++/kord/dynamic_model.cc b/mex/sources/libkorder/kord/dynamic_model.cc similarity index 100% rename from dynare++/kord/dynamic_model.cc rename to mex/sources/libkorder/kord/dynamic_model.cc diff --git a/dynare++/kord/dynamic_model.hh b/mex/sources/libkorder/kord/dynamic_model.hh similarity index 100% rename from dynare++/kord/dynamic_model.hh rename to mex/sources/libkorder/kord/dynamic_model.hh diff --git a/dynare++/kord/faa_di_bruno.cc b/mex/sources/libkorder/kord/faa_di_bruno.cc similarity index 100% rename from dynare++/kord/faa_di_bruno.cc rename to mex/sources/libkorder/kord/faa_di_bruno.cc diff --git a/dynare++/kord/faa_di_bruno.hh b/mex/sources/libkorder/kord/faa_di_bruno.hh similarity index 100% rename from dynare++/kord/faa_di_bruno.hh rename to mex/sources/libkorder/kord/faa_di_bruno.hh diff --git a/dynare++/kord/first_order.cc b/mex/sources/libkorder/kord/first_order.cc similarity index 100% rename from dynare++/kord/first_order.cc rename to mex/sources/libkorder/kord/first_order.cc diff --git a/dynare++/kord/first_order.hh b/mex/sources/libkorder/kord/first_order.hh similarity index 100% rename from dynare++/kord/first_order.hh rename to mex/sources/libkorder/kord/first_order.hh diff --git a/dynare++/kord/global_check.cc b/mex/sources/libkorder/kord/global_check.cc similarity index 100% rename from dynare++/kord/global_check.cc rename to mex/sources/libkorder/kord/global_check.cc diff --git a/dynare++/kord/global_check.hh b/mex/sources/libkorder/kord/global_check.hh similarity index 100% rename from dynare++/kord/global_check.hh rename to mex/sources/libkorder/kord/global_check.hh diff --git a/dynare++/kord/journal.cc b/mex/sources/libkorder/kord/journal.cc similarity index 100% rename from dynare++/kord/journal.cc rename to mex/sources/libkorder/kord/journal.cc diff --git a/dynare++/kord/journal.hh b/mex/sources/libkorder/kord/journal.hh similarity index 100% rename from dynare++/kord/journal.hh rename to mex/sources/libkorder/kord/journal.hh diff --git a/dynare++/kord/kord_exception.hh b/mex/sources/libkorder/kord/kord_exception.hh similarity index 100% rename from dynare++/kord/kord_exception.hh rename to mex/sources/libkorder/kord/kord_exception.hh diff --git a/dynare++/kord/korder.cc b/mex/sources/libkorder/kord/korder.cc similarity index 100% rename from dynare++/kord/korder.cc rename to mex/sources/libkorder/kord/korder.cc diff --git a/dynare++/kord/korder.hh b/mex/sources/libkorder/kord/korder.hh similarity index 100% rename from dynare++/kord/korder.hh rename to mex/sources/libkorder/kord/korder.hh diff --git a/dynare++/kord/korder_stoch.cc b/mex/sources/libkorder/kord/korder_stoch.cc similarity index 100% rename from dynare++/kord/korder_stoch.cc rename to mex/sources/libkorder/kord/korder_stoch.cc diff --git a/dynare++/kord/korder_stoch.hh b/mex/sources/libkorder/kord/korder_stoch.hh similarity index 100% rename from dynare++/kord/korder_stoch.hh rename to mex/sources/libkorder/kord/korder_stoch.hh diff --git a/dynare++/kord/normal_conjugate.cc b/mex/sources/libkorder/kord/normal_conjugate.cc similarity index 100% rename from dynare++/kord/normal_conjugate.cc rename to mex/sources/libkorder/kord/normal_conjugate.cc diff --git a/dynare++/kord/normal_conjugate.hh b/mex/sources/libkorder/kord/normal_conjugate.hh similarity index 100% rename from dynare++/kord/normal_conjugate.hh rename to mex/sources/libkorder/kord/normal_conjugate.hh diff --git a/dynare++/kord/seed_generator.cc b/mex/sources/libkorder/kord/seed_generator.cc similarity index 100% rename from dynare++/kord/seed_generator.cc rename to mex/sources/libkorder/kord/seed_generator.cc diff --git a/dynare++/kord/seed_generator.hh b/mex/sources/libkorder/kord/seed_generator.hh similarity index 100% rename from dynare++/kord/seed_generator.hh rename to mex/sources/libkorder/kord/seed_generator.hh diff --git a/mex/sources/libkorder/kord/tests/Makefile.am b/mex/sources/libkorder/kord/tests/Makefile.am new file mode 100644 index 000000000..14d402228 --- /dev/null +++ b/mex/sources/libkorder/kord/tests/Makefile.am @@ -0,0 +1,11 @@ +check_PROGRAMS = tests + +tests_SOURCES = tests.cc +tests_CPPFLAGS = -I../sylv/cc -I../tl/cc -I../integ/cc -I../utils/cc -I$(top_srcdir)/mex/sources +tests_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_MATIO) +tests_LDADD = libkord.a ../tl/cc/libtl.a ../sylv/cc/libsylv.a ../utils/cc/libutils.a $(LAPACK_LIBS) $(BLAS_LIBS) $(LIBS) $(FLIBS) $(LIBADD_MATIO) + +check-local: + ./tests + +CLEANFILES = out.txt diff --git a/dynare++/kord/tests.cc b/mex/sources/libkorder/kord/tests/tests.cc similarity index 100% rename from dynare++/kord/tests.cc rename to mex/sources/libkorder/kord/tests/tests.cc diff --git a/dynare++/sylv/cc/BlockDiagonal.cc b/mex/sources/libkorder/sylv/BlockDiagonal.cc similarity index 100% rename from dynare++/sylv/cc/BlockDiagonal.cc rename to mex/sources/libkorder/sylv/BlockDiagonal.cc diff --git a/dynare++/sylv/cc/BlockDiagonal.hh b/mex/sources/libkorder/sylv/BlockDiagonal.hh similarity index 100% rename from dynare++/sylv/cc/BlockDiagonal.hh rename to mex/sources/libkorder/sylv/BlockDiagonal.hh diff --git a/dynare++/sylv/cc/GeneralMatrix.cc b/mex/sources/libkorder/sylv/GeneralMatrix.cc similarity index 100% rename from dynare++/sylv/cc/GeneralMatrix.cc rename to mex/sources/libkorder/sylv/GeneralMatrix.cc diff --git a/dynare++/sylv/cc/GeneralMatrix.hh b/mex/sources/libkorder/sylv/GeneralMatrix.hh similarity index 100% rename from dynare++/sylv/cc/GeneralMatrix.hh rename to mex/sources/libkorder/sylv/GeneralMatrix.hh diff --git a/dynare++/sylv/cc/GeneralSylvester.cc b/mex/sources/libkorder/sylv/GeneralSylvester.cc similarity index 100% rename from dynare++/sylv/cc/GeneralSylvester.cc rename to mex/sources/libkorder/sylv/GeneralSylvester.cc diff --git a/dynare++/sylv/cc/GeneralSylvester.hh b/mex/sources/libkorder/sylv/GeneralSylvester.hh similarity index 100% rename from dynare++/sylv/cc/GeneralSylvester.hh rename to mex/sources/libkorder/sylv/GeneralSylvester.hh diff --git a/dynare++/sylv/cc/IterativeSylvester.cc b/mex/sources/libkorder/sylv/IterativeSylvester.cc similarity index 100% rename from dynare++/sylv/cc/IterativeSylvester.cc rename to mex/sources/libkorder/sylv/IterativeSylvester.cc diff --git a/dynare++/sylv/cc/IterativeSylvester.hh b/mex/sources/libkorder/sylv/IterativeSylvester.hh similarity index 100% rename from dynare++/sylv/cc/IterativeSylvester.hh rename to mex/sources/libkorder/sylv/IterativeSylvester.hh diff --git a/dynare++/sylv/cc/KronUtils.cc b/mex/sources/libkorder/sylv/KronUtils.cc similarity index 100% rename from dynare++/sylv/cc/KronUtils.cc rename to mex/sources/libkorder/sylv/KronUtils.cc diff --git a/dynare++/sylv/cc/KronUtils.hh b/mex/sources/libkorder/sylv/KronUtils.hh similarity index 100% rename from dynare++/sylv/cc/KronUtils.hh rename to mex/sources/libkorder/sylv/KronUtils.hh diff --git a/dynare++/sylv/cc/KronVector.cc b/mex/sources/libkorder/sylv/KronVector.cc similarity index 100% rename from dynare++/sylv/cc/KronVector.cc rename to mex/sources/libkorder/sylv/KronVector.cc diff --git a/dynare++/sylv/cc/KronVector.hh b/mex/sources/libkorder/sylv/KronVector.hh similarity index 100% rename from dynare++/sylv/cc/KronVector.hh rename to mex/sources/libkorder/sylv/KronVector.hh diff --git a/dynare++/sylv/cc/QuasiTriangular.cc b/mex/sources/libkorder/sylv/QuasiTriangular.cc similarity index 100% rename from dynare++/sylv/cc/QuasiTriangular.cc rename to mex/sources/libkorder/sylv/QuasiTriangular.cc diff --git a/dynare++/sylv/cc/QuasiTriangular.hh b/mex/sources/libkorder/sylv/QuasiTriangular.hh similarity index 100% rename from dynare++/sylv/cc/QuasiTriangular.hh rename to mex/sources/libkorder/sylv/QuasiTriangular.hh diff --git a/dynare++/sylv/cc/QuasiTriangularZero.cc b/mex/sources/libkorder/sylv/QuasiTriangularZero.cc similarity index 100% rename from dynare++/sylv/cc/QuasiTriangularZero.cc rename to mex/sources/libkorder/sylv/QuasiTriangularZero.cc diff --git a/dynare++/sylv/cc/QuasiTriangularZero.hh b/mex/sources/libkorder/sylv/QuasiTriangularZero.hh similarity index 100% rename from dynare++/sylv/cc/QuasiTriangularZero.hh rename to mex/sources/libkorder/sylv/QuasiTriangularZero.hh diff --git a/dynare++/sylv/cc/SchurDecomp.cc b/mex/sources/libkorder/sylv/SchurDecomp.cc similarity index 100% rename from dynare++/sylv/cc/SchurDecomp.cc rename to mex/sources/libkorder/sylv/SchurDecomp.cc diff --git a/dynare++/sylv/cc/SchurDecomp.hh b/mex/sources/libkorder/sylv/SchurDecomp.hh similarity index 100% rename from dynare++/sylv/cc/SchurDecomp.hh rename to mex/sources/libkorder/sylv/SchurDecomp.hh diff --git a/dynare++/sylv/cc/SchurDecompEig.cc b/mex/sources/libkorder/sylv/SchurDecompEig.cc similarity index 100% rename from dynare++/sylv/cc/SchurDecompEig.cc rename to mex/sources/libkorder/sylv/SchurDecompEig.cc diff --git a/dynare++/sylv/cc/SchurDecompEig.hh b/mex/sources/libkorder/sylv/SchurDecompEig.hh similarity index 100% rename from dynare++/sylv/cc/SchurDecompEig.hh rename to mex/sources/libkorder/sylv/SchurDecompEig.hh diff --git a/dynare++/sylv/cc/SimilarityDecomp.cc b/mex/sources/libkorder/sylv/SimilarityDecomp.cc similarity index 100% rename from dynare++/sylv/cc/SimilarityDecomp.cc rename to mex/sources/libkorder/sylv/SimilarityDecomp.cc diff --git a/dynare++/sylv/cc/SimilarityDecomp.hh b/mex/sources/libkorder/sylv/SimilarityDecomp.hh similarity index 100% rename from dynare++/sylv/cc/SimilarityDecomp.hh rename to mex/sources/libkorder/sylv/SimilarityDecomp.hh diff --git a/dynare++/sylv/cc/SylvException.cc b/mex/sources/libkorder/sylv/SylvException.cc similarity index 100% rename from dynare++/sylv/cc/SylvException.cc rename to mex/sources/libkorder/sylv/SylvException.cc diff --git a/dynare++/sylv/cc/SylvException.hh b/mex/sources/libkorder/sylv/SylvException.hh similarity index 100% rename from dynare++/sylv/cc/SylvException.hh rename to mex/sources/libkorder/sylv/SylvException.hh diff --git a/dynare++/sylv/cc/SylvMatrix.cc b/mex/sources/libkorder/sylv/SylvMatrix.cc similarity index 100% rename from dynare++/sylv/cc/SylvMatrix.cc rename to mex/sources/libkorder/sylv/SylvMatrix.cc diff --git a/dynare++/sylv/cc/SylvMatrix.hh b/mex/sources/libkorder/sylv/SylvMatrix.hh similarity index 100% rename from dynare++/sylv/cc/SylvMatrix.hh rename to mex/sources/libkorder/sylv/SylvMatrix.hh diff --git a/dynare++/sylv/cc/SylvParams.cc b/mex/sources/libkorder/sylv/SylvParams.cc similarity index 100% rename from dynare++/sylv/cc/SylvParams.cc rename to mex/sources/libkorder/sylv/SylvParams.cc diff --git a/dynare++/sylv/cc/SylvParams.hh b/mex/sources/libkorder/sylv/SylvParams.hh similarity index 100% rename from dynare++/sylv/cc/SylvParams.hh rename to mex/sources/libkorder/sylv/SylvParams.hh diff --git a/dynare++/sylv/cc/SylvesterSolver.hh b/mex/sources/libkorder/sylv/SylvesterSolver.hh similarity index 100% rename from dynare++/sylv/cc/SylvesterSolver.hh rename to mex/sources/libkorder/sylv/SylvesterSolver.hh diff --git a/dynare++/sylv/cc/SymSchurDecomp.cc b/mex/sources/libkorder/sylv/SymSchurDecomp.cc similarity index 100% rename from dynare++/sylv/cc/SymSchurDecomp.cc rename to mex/sources/libkorder/sylv/SymSchurDecomp.cc diff --git a/dynare++/sylv/cc/SymSchurDecomp.hh b/mex/sources/libkorder/sylv/SymSchurDecomp.hh similarity index 100% rename from dynare++/sylv/cc/SymSchurDecomp.hh rename to mex/sources/libkorder/sylv/SymSchurDecomp.hh diff --git a/dynare++/sylv/cc/TriangularSylvester.cc b/mex/sources/libkorder/sylv/TriangularSylvester.cc similarity index 100% rename from dynare++/sylv/cc/TriangularSylvester.cc rename to mex/sources/libkorder/sylv/TriangularSylvester.cc diff --git a/dynare++/sylv/cc/TriangularSylvester.hh b/mex/sources/libkorder/sylv/TriangularSylvester.hh similarity index 100% rename from dynare++/sylv/cc/TriangularSylvester.hh rename to mex/sources/libkorder/sylv/TriangularSylvester.hh diff --git a/dynare++/sylv/cc/Vector.cc b/mex/sources/libkorder/sylv/Vector.cc similarity index 100% rename from dynare++/sylv/cc/Vector.cc rename to mex/sources/libkorder/sylv/Vector.cc diff --git a/dynare++/sylv/cc/Vector.hh b/mex/sources/libkorder/sylv/Vector.hh similarity index 100% rename from dynare++/sylv/cc/Vector.hh rename to mex/sources/libkorder/sylv/Vector.hh diff --git a/dynare++/sylv/testing/MMMatrix.cc b/mex/sources/libkorder/sylv/tests/MMMatrix.cc similarity index 100% rename from dynare++/sylv/testing/MMMatrix.cc rename to mex/sources/libkorder/sylv/tests/MMMatrix.cc diff --git a/dynare++/sylv/testing/MMMatrix.hh b/mex/sources/libkorder/sylv/tests/MMMatrix.hh similarity index 100% rename from dynare++/sylv/testing/MMMatrix.hh rename to mex/sources/libkorder/sylv/tests/MMMatrix.hh diff --git a/dynare++/sylv/testing/Makefile.am b/mex/sources/libkorder/sylv/tests/Makefile.am similarity index 100% rename from dynare++/sylv/testing/Makefile.am rename to mex/sources/libkorder/sylv/tests/Makefile.am diff --git a/dynare++/sylv/testing/a20x20.mm b/mex/sources/libkorder/sylv/tests/a20x20.mm similarity index 100% rename from dynare++/sylv/testing/a20x20.mm rename to mex/sources/libkorder/sylv/tests/a20x20.mm diff --git a/dynare++/sylv/testing/a2x2.mm b/mex/sources/libkorder/sylv/tests/a2x2.mm similarity index 100% rename from dynare++/sylv/testing/a2x2.mm rename to mex/sources/libkorder/sylv/tests/a2x2.mm diff --git a/dynare++/sylv/testing/a30x30.mm b/mex/sources/libkorder/sylv/tests/a30x30.mm similarity index 100% rename from dynare++/sylv/testing/a30x30.mm rename to mex/sources/libkorder/sylv/tests/a30x30.mm diff --git a/dynare++/sylv/testing/b20x15.mm b/mex/sources/libkorder/sylv/tests/b20x15.mm similarity index 100% rename from dynare++/sylv/testing/b20x15.mm rename to mex/sources/libkorder/sylv/tests/b20x15.mm diff --git a/dynare++/sylv/testing/b20x4.mm b/mex/sources/libkorder/sylv/tests/b20x4.mm similarity index 100% rename from dynare++/sylv/testing/b20x4.mm rename to mex/sources/libkorder/sylv/tests/b20x4.mm diff --git a/dynare++/sylv/testing/b2x1.mm b/mex/sources/libkorder/sylv/tests/b2x1.mm similarity index 100% rename from dynare++/sylv/testing/b2x1.mm rename to mex/sources/libkorder/sylv/tests/b2x1.mm diff --git a/dynare++/sylv/testing/b30x25.mm b/mex/sources/libkorder/sylv/tests/b30x25.mm similarity index 100% rename from dynare++/sylv/testing/b30x25.mm rename to mex/sources/libkorder/sylv/tests/b30x25.mm diff --git a/dynare++/sylv/testing/c20x20.mm b/mex/sources/libkorder/sylv/tests/c20x20.mm similarity index 100% rename from dynare++/sylv/testing/c20x20.mm rename to mex/sources/libkorder/sylv/tests/c20x20.mm diff --git a/dynare++/sylv/testing/c3x3.mm b/mex/sources/libkorder/sylv/tests/c3x3.mm similarity index 100% rename from dynare++/sylv/testing/c3x3.mm rename to mex/sources/libkorder/sylv/tests/c3x3.mm diff --git a/dynare++/sylv/testing/c50x50.mm b/mex/sources/libkorder/sylv/tests/c50x50.mm similarity index 100% rename from dynare++/sylv/testing/c50x50.mm rename to mex/sources/libkorder/sylv/tests/c50x50.mm diff --git a/dynare++/sylv/testing/c50x50sing.mm b/mex/sources/libkorder/sylv/tests/c50x50sing.mm similarity index 100% rename from dynare++/sylv/testing/c50x50sing.mm rename to mex/sources/libkorder/sylv/tests/c50x50sing.mm diff --git a/dynare++/sylv/testing/d20x125000.mm b/mex/sources/libkorder/sylv/tests/d20x125000.mm similarity index 100% rename from dynare++/sylv/testing/d20x125000.mm rename to mex/sources/libkorder/sylv/tests/d20x125000.mm diff --git a/dynare++/sylv/testing/d2x9.mm b/mex/sources/libkorder/sylv/tests/d2x9.mm similarity index 100% rename from dynare++/sylv/testing/d2x9.mm rename to mex/sources/libkorder/sylv/tests/d2x9.mm diff --git a/dynare++/sylv/testing/d30x400.mm b/mex/sources/libkorder/sylv/tests/d30x400.mm similarity index 100% rename from dynare++/sylv/testing/d30x400.mm rename to mex/sources/libkorder/sylv/tests/d30x400.mm diff --git a/dynare++/sylv/testing/ill_cond15x15.mm b/mex/sources/libkorder/sylv/tests/ill_cond15x15.mm similarity index 100% rename from dynare++/sylv/testing/ill_cond15x15.mm rename to mex/sources/libkorder/sylv/tests/ill_cond15x15.mm diff --git a/dynare++/sylv/testing/qt250x250.mm b/mex/sources/libkorder/sylv/tests/qt250x250.mm similarity index 100% rename from dynare++/sylv/testing/qt250x250.mm rename to mex/sources/libkorder/sylv/tests/qt250x250.mm diff --git a/dynare++/sylv/testing/qt2x2.mm b/mex/sources/libkorder/sylv/tests/qt2x2.mm similarity index 100% rename from dynare++/sylv/testing/qt2x2.mm rename to mex/sources/libkorder/sylv/tests/qt2x2.mm diff --git a/dynare++/sylv/testing/qt30x30.mm b/mex/sources/libkorder/sylv/tests/qt30x30.mm similarity index 100% rename from dynare++/sylv/testing/qt30x30.mm rename to mex/sources/libkorder/sylv/tests/qt30x30.mm diff --git a/dynare++/sylv/testing/qt30x30eig011-095.mm b/mex/sources/libkorder/sylv/tests/qt30x30eig011-095.mm similarity index 100% rename from dynare++/sylv/testing/qt30x30eig011-095.mm rename to mex/sources/libkorder/sylv/tests/qt30x30eig011-095.mm diff --git a/dynare++/sylv/testing/qt3x3.mm b/mex/sources/libkorder/sylv/tests/qt3x3.mm similarity index 100% rename from dynare++/sylv/testing/qt3x3.mm rename to mex/sources/libkorder/sylv/tests/qt3x3.mm diff --git a/dynare++/sylv/testing/qt40x40.mm b/mex/sources/libkorder/sylv/tests/qt40x40.mm similarity index 100% rename from dynare++/sylv/testing/qt40x40.mm rename to mex/sources/libkorder/sylv/tests/qt40x40.mm diff --git a/dynare++/sylv/testing/qt5x5.mm b/mex/sources/libkorder/sylv/tests/qt5x5.mm similarity index 100% rename from dynare++/sylv/testing/qt5x5.mm rename to mex/sources/libkorder/sylv/tests/qt5x5.mm diff --git a/dynare++/sylv/testing/qt7x7.mm b/mex/sources/libkorder/sylv/tests/qt7x7.mm similarity index 100% rename from dynare++/sylv/testing/qt7x7.mm rename to mex/sources/libkorder/sylv/tests/qt7x7.mm diff --git a/dynare++/sylv/testing/qt7x7eig06-09.mm b/mex/sources/libkorder/sylv/tests/qt7x7eig06-09.mm similarity index 100% rename from dynare++/sylv/testing/qt7x7eig06-09.mm rename to mex/sources/libkorder/sylv/tests/qt7x7eig06-09.mm diff --git a/dynare++/sylv/testing/qt_eps3x3.mm b/mex/sources/libkorder/sylv/tests/qt_eps3x3.mm similarity index 100% rename from dynare++/sylv/testing/qt_eps3x3.mm rename to mex/sources/libkorder/sylv/tests/qt_eps3x3.mm diff --git a/dynare++/sylv/testing/qt_frank12x12.mm b/mex/sources/libkorder/sylv/tests/qt_frank12x12.mm similarity index 100% rename from dynare++/sylv/testing/qt_frank12x12.mm rename to mex/sources/libkorder/sylv/tests/qt_frank12x12.mm diff --git a/dynare++/sylv/testing/tests.cc b/mex/sources/libkorder/sylv/tests/tests.cc similarity index 100% rename from dynare++/sylv/testing/tests.cc rename to mex/sources/libkorder/sylv/tests/tests.cc diff --git a/dynare++/sylv/testing/tr2x2.mm b/mex/sources/libkorder/sylv/tests/tr2x2.mm similarity index 100% rename from dynare++/sylv/testing/tr2x2.mm rename to mex/sources/libkorder/sylv/tests/tr2x2.mm diff --git a/dynare++/sylv/testing/tr300x300.mm b/mex/sources/libkorder/sylv/tests/tr300x300.mm similarity index 100% rename from dynare++/sylv/testing/tr300x300.mm rename to mex/sources/libkorder/sylv/tests/tr300x300.mm diff --git a/dynare++/sylv/testing/tr5x5.mm b/mex/sources/libkorder/sylv/tests/tr5x5.mm similarity index 100% rename from dynare++/sylv/testing/tr5x5.mm rename to mex/sources/libkorder/sylv/tests/tr5x5.mm diff --git a/dynare++/sylv/testing/v12r.mm b/mex/sources/libkorder/sylv/tests/v12r.mm similarity index 100% rename from dynare++/sylv/testing/v12r.mm rename to mex/sources/libkorder/sylv/tests/v12r.mm diff --git a/dynare++/sylv/testing/v1715.mm b/mex/sources/libkorder/sylv/tests/v1715.mm similarity index 100% rename from dynare++/sylv/testing/v1715.mm rename to mex/sources/libkorder/sylv/tests/v1715.mm diff --git a/dynare++/sylv/testing/v1920000.mm b/mex/sources/libkorder/sylv/tests/v1920000.mm similarity index 100% rename from dynare++/sylv/testing/v1920000.mm rename to mex/sources/libkorder/sylv/tests/v1920000.mm diff --git a/dynare++/sylv/testing/v2.mm b/mex/sources/libkorder/sylv/tests/v2.mm similarity index 100% rename from dynare++/sylv/testing/v2.mm rename to mex/sources/libkorder/sylv/tests/v2.mm diff --git a/dynare++/sylv/testing/v24.mm b/mex/sources/libkorder/sylv/tests/v24.mm similarity index 100% rename from dynare++/sylv/testing/v24.mm rename to mex/sources/libkorder/sylv/tests/v24.mm diff --git a/dynare++/sylv/testing/v245.mm b/mex/sources/libkorder/sylv/tests/v245.mm similarity index 100% rename from dynare++/sylv/testing/v245.mm rename to mex/sources/libkorder/sylv/tests/v245.mm diff --git a/dynare++/sylv/testing/v245r.mm b/mex/sources/libkorder/sylv/tests/v245r.mm similarity index 100% rename from dynare++/sylv/testing/v245r.mm rename to mex/sources/libkorder/sylv/tests/v245r.mm diff --git a/dynare++/sylv/testing/v250.mm b/mex/sources/libkorder/sylv/tests/v250.mm similarity index 100% rename from dynare++/sylv/testing/v250.mm rename to mex/sources/libkorder/sylv/tests/v250.mm diff --git a/dynare++/sylv/testing/v300.mm b/mex/sources/libkorder/sylv/tests/v300.mm similarity index 100% rename from dynare++/sylv/testing/v300.mm rename to mex/sources/libkorder/sylv/tests/v300.mm diff --git a/dynare++/sylv/testing/v48000.mm b/mex/sources/libkorder/sylv/tests/v48000.mm similarity index 100% rename from dynare++/sylv/testing/v48000.mm rename to mex/sources/libkorder/sylv/tests/v48000.mm diff --git a/dynare++/sylv/testing/v490.mm b/mex/sources/libkorder/sylv/tests/v490.mm similarity index 100% rename from dynare++/sylv/testing/v490.mm rename to mex/sources/libkorder/sylv/tests/v490.mm diff --git a/dynare++/sylv/testing/v5.mm b/mex/sources/libkorder/sylv/tests/v5.mm similarity index 100% rename from dynare++/sylv/testing/v5.mm rename to mex/sources/libkorder/sylv/tests/v5.mm diff --git a/dynare++/sylv/testing/v7.mm b/mex/sources/libkorder/sylv/tests/v7.mm similarity index 100% rename from dynare++/sylv/testing/v7.mm rename to mex/sources/libkorder/sylv/tests/v7.mm diff --git a/dynare++/sylv/testing/vcheck1715.mm b/mex/sources/libkorder/sylv/tests/vcheck1715.mm similarity index 100% rename from dynare++/sylv/testing/vcheck1715.mm rename to mex/sources/libkorder/sylv/tests/vcheck1715.mm diff --git a/dynare++/sylv/testing/vcheck1715a.mm b/mex/sources/libkorder/sylv/tests/vcheck1715a.mm similarity index 100% rename from dynare++/sylv/testing/vcheck1715a.mm rename to mex/sources/libkorder/sylv/tests/vcheck1715a.mm diff --git a/dynare++/sylv/testing/vcheck1715b.mm b/mex/sources/libkorder/sylv/tests/vcheck1715b.mm similarity index 100% rename from dynare++/sylv/testing/vcheck1715b.mm rename to mex/sources/libkorder/sylv/tests/vcheck1715b.mm diff --git a/dynare++/sylv/testing/vcheck1715c.mm b/mex/sources/libkorder/sylv/tests/vcheck1715c.mm similarity index 100% rename from dynare++/sylv/testing/vcheck1715c.mm rename to mex/sources/libkorder/sylv/tests/vcheck1715c.mm diff --git a/dynare++/sylv/testing/vcheck1715d.mm b/mex/sources/libkorder/sylv/tests/vcheck1715d.mm similarity index 100% rename from dynare++/sylv/testing/vcheck1715d.mm rename to mex/sources/libkorder/sylv/tests/vcheck1715d.mm diff --git a/dynare++/sylv/testing/vcheck2.mm b/mex/sources/libkorder/sylv/tests/vcheck2.mm similarity index 100% rename from dynare++/sylv/testing/vcheck2.mm rename to mex/sources/libkorder/sylv/tests/vcheck2.mm diff --git a/dynare++/sylv/testing/vcheck24.mm b/mex/sources/libkorder/sylv/tests/vcheck24.mm similarity index 100% rename from dynare++/sylv/testing/vcheck24.mm rename to mex/sources/libkorder/sylv/tests/vcheck24.mm diff --git a/dynare++/sylv/testing/vcheck245.mm b/mex/sources/libkorder/sylv/tests/vcheck245.mm similarity index 100% rename from dynare++/sylv/testing/vcheck245.mm rename to mex/sources/libkorder/sylv/tests/vcheck245.mm diff --git a/dynare++/sylv/testing/vcheck245a.mm b/mex/sources/libkorder/sylv/tests/vcheck245a.mm similarity index 100% rename from dynare++/sylv/testing/vcheck245a.mm rename to mex/sources/libkorder/sylv/tests/vcheck245a.mm diff --git a/dynare++/sylv/testing/vcheck24q.mm b/mex/sources/libkorder/sylv/tests/vcheck24q.mm similarity index 100% rename from dynare++/sylv/testing/vcheck24q.mm rename to mex/sources/libkorder/sylv/tests/vcheck24q.mm diff --git a/dynare++/sylv/testing/vcheck2a.mm b/mex/sources/libkorder/sylv/tests/vcheck2a.mm similarity index 100% rename from dynare++/sylv/testing/vcheck2a.mm rename to mex/sources/libkorder/sylv/tests/vcheck2a.mm diff --git a/dynare++/sylv/testing/vcheck490.mm b/mex/sources/libkorder/sylv/tests/vcheck490.mm similarity index 100% rename from dynare++/sylv/testing/vcheck490.mm rename to mex/sources/libkorder/sylv/tests/vcheck490.mm diff --git a/dynare++/sylv/testing/vcheck490q.mm b/mex/sources/libkorder/sylv/tests/vcheck490q.mm similarity index 100% rename from dynare++/sylv/testing/vcheck490q.mm rename to mex/sources/libkorder/sylv/tests/vcheck490q.mm diff --git a/dynare++/tl/cc/equivalence.cc b/mex/sources/libkorder/tl/equivalence.cc similarity index 100% rename from dynare++/tl/cc/equivalence.cc rename to mex/sources/libkorder/tl/equivalence.cc diff --git a/dynare++/tl/cc/equivalence.hh b/mex/sources/libkorder/tl/equivalence.hh similarity index 100% rename from dynare++/tl/cc/equivalence.hh rename to mex/sources/libkorder/tl/equivalence.hh diff --git a/dynare++/tl/cc/fine_container.cc b/mex/sources/libkorder/tl/fine_container.cc similarity index 100% rename from dynare++/tl/cc/fine_container.cc rename to mex/sources/libkorder/tl/fine_container.cc diff --git a/dynare++/tl/cc/fine_container.hh b/mex/sources/libkorder/tl/fine_container.hh similarity index 100% rename from dynare++/tl/cc/fine_container.hh rename to mex/sources/libkorder/tl/fine_container.hh diff --git a/dynare++/tl/cc/fs_tensor.cc b/mex/sources/libkorder/tl/fs_tensor.cc similarity index 100% rename from dynare++/tl/cc/fs_tensor.cc rename to mex/sources/libkorder/tl/fs_tensor.cc diff --git a/dynare++/tl/cc/fs_tensor.hh b/mex/sources/libkorder/tl/fs_tensor.hh similarity index 100% rename from dynare++/tl/cc/fs_tensor.hh rename to mex/sources/libkorder/tl/fs_tensor.hh diff --git a/dynare++/tl/cc/gs_tensor.cc b/mex/sources/libkorder/tl/gs_tensor.cc similarity index 100% rename from dynare++/tl/cc/gs_tensor.cc rename to mex/sources/libkorder/tl/gs_tensor.cc diff --git a/dynare++/tl/cc/gs_tensor.hh b/mex/sources/libkorder/tl/gs_tensor.hh similarity index 100% rename from dynare++/tl/cc/gs_tensor.hh rename to mex/sources/libkorder/tl/gs_tensor.hh diff --git a/dynare++/tl/cc/int_sequence.cc b/mex/sources/libkorder/tl/int_sequence.cc similarity index 100% rename from dynare++/tl/cc/int_sequence.cc rename to mex/sources/libkorder/tl/int_sequence.cc diff --git a/dynare++/tl/cc/int_sequence.hh b/mex/sources/libkorder/tl/int_sequence.hh similarity index 100% rename from dynare++/tl/cc/int_sequence.hh rename to mex/sources/libkorder/tl/int_sequence.hh diff --git a/dynare++/tl/cc/kron_prod.cc b/mex/sources/libkorder/tl/kron_prod.cc similarity index 100% rename from dynare++/tl/cc/kron_prod.cc rename to mex/sources/libkorder/tl/kron_prod.cc diff --git a/dynare++/tl/cc/kron_prod.hh b/mex/sources/libkorder/tl/kron_prod.hh similarity index 100% rename from dynare++/tl/cc/kron_prod.hh rename to mex/sources/libkorder/tl/kron_prod.hh diff --git a/dynare++/tl/cc/normal_moments.cc b/mex/sources/libkorder/tl/normal_moments.cc similarity index 100% rename from dynare++/tl/cc/normal_moments.cc rename to mex/sources/libkorder/tl/normal_moments.cc diff --git a/dynare++/tl/cc/normal_moments.hh b/mex/sources/libkorder/tl/normal_moments.hh similarity index 100% rename from dynare++/tl/cc/normal_moments.hh rename to mex/sources/libkorder/tl/normal_moments.hh diff --git a/dynare++/tl/cc/permutation.cc b/mex/sources/libkorder/tl/permutation.cc similarity index 100% rename from dynare++/tl/cc/permutation.cc rename to mex/sources/libkorder/tl/permutation.cc diff --git a/dynare++/tl/cc/permutation.hh b/mex/sources/libkorder/tl/permutation.hh similarity index 100% rename from dynare++/tl/cc/permutation.hh rename to mex/sources/libkorder/tl/permutation.hh diff --git a/dynare++/tl/cc/ps_tensor.cc b/mex/sources/libkorder/tl/ps_tensor.cc similarity index 100% rename from dynare++/tl/cc/ps_tensor.cc rename to mex/sources/libkorder/tl/ps_tensor.cc diff --git a/dynare++/tl/cc/ps_tensor.hh b/mex/sources/libkorder/tl/ps_tensor.hh similarity index 100% rename from dynare++/tl/cc/ps_tensor.hh rename to mex/sources/libkorder/tl/ps_tensor.hh diff --git a/dynare++/tl/cc/pyramid_prod.cc b/mex/sources/libkorder/tl/pyramid_prod.cc similarity index 100% rename from dynare++/tl/cc/pyramid_prod.cc rename to mex/sources/libkorder/tl/pyramid_prod.cc diff --git a/dynare++/tl/cc/pyramid_prod.hh b/mex/sources/libkorder/tl/pyramid_prod.hh similarity index 100% rename from dynare++/tl/cc/pyramid_prod.hh rename to mex/sources/libkorder/tl/pyramid_prod.hh diff --git a/dynare++/tl/cc/pyramid_prod2.cc b/mex/sources/libkorder/tl/pyramid_prod2.cc similarity index 100% rename from dynare++/tl/cc/pyramid_prod2.cc rename to mex/sources/libkorder/tl/pyramid_prod2.cc diff --git a/dynare++/tl/cc/pyramid_prod2.hh b/mex/sources/libkorder/tl/pyramid_prod2.hh similarity index 100% rename from dynare++/tl/cc/pyramid_prod2.hh rename to mex/sources/libkorder/tl/pyramid_prod2.hh diff --git a/dynare++/tl/cc/rfs_tensor.cc b/mex/sources/libkorder/tl/rfs_tensor.cc similarity index 100% rename from dynare++/tl/cc/rfs_tensor.cc rename to mex/sources/libkorder/tl/rfs_tensor.cc diff --git a/dynare++/tl/cc/rfs_tensor.hh b/mex/sources/libkorder/tl/rfs_tensor.hh similarity index 100% rename from dynare++/tl/cc/rfs_tensor.hh rename to mex/sources/libkorder/tl/rfs_tensor.hh diff --git a/dynare++/tl/cc/sparse_tensor.cc b/mex/sources/libkorder/tl/sparse_tensor.cc similarity index 100% rename from dynare++/tl/cc/sparse_tensor.cc rename to mex/sources/libkorder/tl/sparse_tensor.cc diff --git a/dynare++/tl/cc/sparse_tensor.hh b/mex/sources/libkorder/tl/sparse_tensor.hh similarity index 100% rename from dynare++/tl/cc/sparse_tensor.hh rename to mex/sources/libkorder/tl/sparse_tensor.hh diff --git a/dynare++/tl/cc/stack_container.cc b/mex/sources/libkorder/tl/stack_container.cc similarity index 100% rename from dynare++/tl/cc/stack_container.cc rename to mex/sources/libkorder/tl/stack_container.cc diff --git a/dynare++/tl/cc/stack_container.hh b/mex/sources/libkorder/tl/stack_container.hh similarity index 100% rename from dynare++/tl/cc/stack_container.hh rename to mex/sources/libkorder/tl/stack_container.hh diff --git a/dynare++/tl/cc/symmetry.cc b/mex/sources/libkorder/tl/symmetry.cc similarity index 100% rename from dynare++/tl/cc/symmetry.cc rename to mex/sources/libkorder/tl/symmetry.cc diff --git a/dynare++/tl/cc/symmetry.hh b/mex/sources/libkorder/tl/symmetry.hh similarity index 100% rename from dynare++/tl/cc/symmetry.hh rename to mex/sources/libkorder/tl/symmetry.hh diff --git a/dynare++/tl/cc/t_container.cc b/mex/sources/libkorder/tl/t_container.cc similarity index 100% rename from dynare++/tl/cc/t_container.cc rename to mex/sources/libkorder/tl/t_container.cc diff --git a/dynare++/tl/cc/t_container.hh b/mex/sources/libkorder/tl/t_container.hh similarity index 100% rename from dynare++/tl/cc/t_container.hh rename to mex/sources/libkorder/tl/t_container.hh diff --git a/dynare++/tl/cc/t_polynomial.cc b/mex/sources/libkorder/tl/t_polynomial.cc similarity index 100% rename from dynare++/tl/cc/t_polynomial.cc rename to mex/sources/libkorder/tl/t_polynomial.cc diff --git a/dynare++/tl/cc/t_polynomial.hh b/mex/sources/libkorder/tl/t_polynomial.hh similarity index 100% rename from dynare++/tl/cc/t_polynomial.hh rename to mex/sources/libkorder/tl/t_polynomial.hh diff --git a/dynare++/tl/cc/tensor.cc b/mex/sources/libkorder/tl/tensor.cc similarity index 100% rename from dynare++/tl/cc/tensor.cc rename to mex/sources/libkorder/tl/tensor.cc diff --git a/dynare++/tl/cc/tensor.hh b/mex/sources/libkorder/tl/tensor.hh similarity index 100% rename from dynare++/tl/cc/tensor.hh rename to mex/sources/libkorder/tl/tensor.hh diff --git a/dynare++/tl/testing/Makefile.am b/mex/sources/libkorder/tl/tests/Makefile.am similarity index 100% rename from dynare++/tl/testing/Makefile.am rename to mex/sources/libkorder/tl/tests/Makefile.am diff --git a/dynare++/tl/testing/factory.cc b/mex/sources/libkorder/tl/tests/factory.cc similarity index 100% rename from dynare++/tl/testing/factory.cc rename to mex/sources/libkorder/tl/tests/factory.cc diff --git a/dynare++/tl/testing/factory.hh b/mex/sources/libkorder/tl/tests/factory.hh similarity index 100% rename from dynare++/tl/testing/factory.hh rename to mex/sources/libkorder/tl/tests/factory.hh diff --git a/dynare++/tl/testing/monoms.cc b/mex/sources/libkorder/tl/tests/monoms.cc similarity index 100% rename from dynare++/tl/testing/monoms.cc rename to mex/sources/libkorder/tl/tests/monoms.cc diff --git a/dynare++/tl/testing/monoms.hh b/mex/sources/libkorder/tl/tests/monoms.hh similarity index 100% rename from dynare++/tl/testing/monoms.hh rename to mex/sources/libkorder/tl/tests/monoms.hh diff --git a/dynare++/tl/testing/tests.cc b/mex/sources/libkorder/tl/tests/tests.cc similarity index 100% rename from dynare++/tl/testing/tests.cc rename to mex/sources/libkorder/tl/tests/tests.cc diff --git a/dynare++/tl/cc/tl_exception.hh b/mex/sources/libkorder/tl/tl_exception.hh similarity index 100% rename from dynare++/tl/cc/tl_exception.hh rename to mex/sources/libkorder/tl/tl_exception.hh diff --git a/dynare++/tl/cc/tl_static.cc b/mex/sources/libkorder/tl/tl_static.cc similarity index 100% rename from dynare++/tl/cc/tl_static.cc rename to mex/sources/libkorder/tl/tl_static.cc diff --git a/dynare++/tl/cc/tl_static.hh b/mex/sources/libkorder/tl/tl_static.hh similarity index 100% rename from dynare++/tl/cc/tl_static.hh rename to mex/sources/libkorder/tl/tl_static.hh diff --git a/dynare++/tl/cc/twod_matrix.cc b/mex/sources/libkorder/tl/twod_matrix.cc similarity index 100% rename from dynare++/tl/cc/twod_matrix.cc rename to mex/sources/libkorder/tl/twod_matrix.cc diff --git a/dynare++/tl/cc/twod_matrix.hh b/mex/sources/libkorder/tl/twod_matrix.hh similarity index 100% rename from dynare++/tl/cc/twod_matrix.hh rename to mex/sources/libkorder/tl/twod_matrix.hh diff --git a/dynare++/src/dynare_exception.hh b/mex/sources/libkorder/utils/dynare_exception.hh similarity index 100% rename from dynare++/src/dynare_exception.hh rename to mex/sources/libkorder/utils/dynare_exception.hh diff --git a/dynare++/utils/cc/exception.hh b/mex/sources/libkorder/utils/exception.hh similarity index 100% rename from dynare++/utils/cc/exception.hh rename to mex/sources/libkorder/utils/exception.hh diff --git a/dynare++/utils/cc/int_power.cc b/mex/sources/libkorder/utils/int_power.cc similarity index 100% rename from dynare++/utils/cc/int_power.cc rename to mex/sources/libkorder/utils/int_power.cc diff --git a/dynare++/utils/cc/int_power.hh b/mex/sources/libkorder/utils/int_power.hh similarity index 100% rename from dynare++/utils/cc/int_power.hh rename to mex/sources/libkorder/utils/int_power.hh diff --git a/dynare++/src/nlsolve.cc b/mex/sources/libkorder/utils/nlsolve.cc similarity index 100% rename from dynare++/src/nlsolve.cc rename to mex/sources/libkorder/utils/nlsolve.cc diff --git a/dynare++/src/nlsolve.hh b/mex/sources/libkorder/utils/nlsolve.hh similarity index 100% rename from dynare++/src/nlsolve.hh rename to mex/sources/libkorder/utils/nlsolve.hh diff --git a/dynare++/utils/cc/pascal_triangle.cc b/mex/sources/libkorder/utils/pascal_triangle.cc similarity index 100% rename from dynare++/utils/cc/pascal_triangle.cc rename to mex/sources/libkorder/utils/pascal_triangle.cc diff --git a/dynare++/utils/cc/pascal_triangle.hh b/mex/sources/libkorder/utils/pascal_triangle.hh similarity index 100% rename from dynare++/utils/cc/pascal_triangle.hh rename to mex/sources/libkorder/utils/pascal_triangle.hh diff --git a/dynare++/utils/cc/sthread.cc b/mex/sources/libkorder/utils/sthread.cc similarity index 100% rename from dynare++/utils/cc/sthread.cc rename to mex/sources/libkorder/utils/sthread.cc diff --git a/dynare++/utils/cc/sthread.hh b/mex/sources/libkorder/utils/sthread.hh similarity index 100% rename from dynare++/utils/cc/sthread.hh rename to mex/sources/libkorder/utils/sthread.hh diff --git a/windows/dynare.nsi b/windows/dynare.nsi index bf297bd26..a9f8d9b0b 100644 --- a/windows/dynare.nsi +++ b/windows/dynare.nsi @@ -112,7 +112,7 @@ SectionEnd Section "Documentation and examples" SetOutPath $INSTDIR\doc - File ..\doc\manual\build\latex\dynare-manual.pdf ..\doc\guide.pdf ..\doc\bvar-a-la-sims.pdf ..\doc\dr.pdf ..\preprocessor\doc\macroprocessor\macroprocessor.pdf ..\preprocessor\doc\preprocessor\preprocessor.pdf ..\doc\parallel\parallel.pdf ..\doc\gsa\gsa.pdf ..\doc\dseries-and-reporting\dseriesReporting.pdf + File ..\doc\manual\build\latex\dynare-manual.pdf ..\doc\guide.pdf ..\doc\bvar-a-la-sims.pdf ..\doc\dr.pdf ..\doc\sylvester.pdf ..\doc\tl.pdf ..\preprocessor\doc\macroprocessor\macroprocessor.pdf ..\preprocessor\doc\preprocessor\preprocessor.pdf ..\doc\parallel\parallel.pdf ..\doc\gsa\gsa.pdf ..\doc\dseries-and-reporting\dseriesReporting.pdf SetOutPath $INSTDIR\doc\dynare-manual.html File /r ..\doc\manual\build\html\*