diff --git a/dynare++/extern/matlab/dynare_simul.cpp b/dynare++/extern/matlab/dynare_simul.cpp index 671982c89..82e1c4cf4 100644 --- a/dynare++/extern/matlab/dynare_simul.cpp +++ b/dynare++/extern/matlab/dynare_simul.cpp @@ -21,6 +21,7 @@ // output: // res simulated results +#include "dynmex.h" #include "mex.h" #include "decision_rule.h" @@ -28,19 +29,15 @@ #include "SylvException.h" extern "C" { - void mexFunction(int nhls, mxArray* plhs[], + void mexFunction(int nlhs, mxArray* plhs[], int nhrs, const mxArray* prhs[]) { - if (nhrs < 12) - mexErrMsgTxt("Must have at least 12 input parameters.\n"); - if (nhls != 1) - mexErrMsgTxt("Must have exactly 1 output parameter.\n"); + if (nhrs < 12 || nlhs != 2) + DYN_MEX_FUNC_ERR_MSG_TXT("dynare_simul_ must have at least 12 input parameters and exactly 2 output arguments.\n"); int order = (int)mxGetScalar(prhs[0]); - if (nhrs != 12 + order) { - mexErrMsgTxt("Must have exactly 11+order input parameters.\n"); - return; - } + if (nhrs != 12 + order) + DYN_MEX_FUNC_ERR_MSG_TXT("dynare_simul_ must have exactly 11+order input parameters.\n"); int nstat = (int)mxGetScalar(prhs[1]); int npred = (int)mxGetScalar(prhs[2]); @@ -60,20 +57,20 @@ extern "C" { int ny = nstat + npred + nboth + nforw; if (ny != ystart_dim[0]) - mexErrMsgTxt("ystart has wrong number of rows.\n"); + DYN_MEX_FUNC_ERR_MSG_TXT("ystart has wrong number of rows.\n"); if (1 != ystart_dim[1]) - mexErrMsgTxt("ystart has wrong number of cols.\n"); + DYN_MEX_FUNC_ERR_MSG_TXT("ystart has wrong number of cols.\n"); int nper = shocks_dim[1]; if (nexog != shocks_dim[0]) - mexErrMsgTxt("shocks has a wrong number of rows.\n"); + DYN_MEX_FUNC_ERR_MSG_TXT("shocks has a wrong number of rows.\n"); if (nexog != vcov_dim[0]) - mexErrMsgTxt("vcov has a wrong number of rows.\n"); + DYN_MEX_FUNC_ERR_MSG_TXT("vcov has a wrong number of rows.\n"); if (nexog != vcov_dim[1]) - mexErrMsgTxt("vcov has a wrong number of cols.\n"); + DYN_MEX_FUNC_ERR_MSG_TXT("vcov has a wrong number of cols.\n"); if (ny != ysteady_dim[0]) - mexErrMsgTxt("ysteady has wrong number of rows.\n"); + DYN_MEX_FUNC_ERR_MSG_TXT("ysteady has wrong number of rows.\n"); if (1 != ysteady_dim[1]) - mexErrMsgTxt("ysteady has wrong number of cols.\n"); + DYN_MEX_FUNC_ERR_MSG_TXT("ysteady has wrong number of cols.\n"); mxArray* res = mxCreateDoubleMatrix(ny, nper, mxREAL); @@ -91,13 +88,13 @@ extern "C" { char buf[1000]; sprintf(buf, "Wrong number of columns for folded tensor: got %d but I want %d\n", gk_dim[1], ft.ncols()); - mexErrMsgTxt(buf); + DYN_MEX_FUNC_ERR_MSG_TXT(buf); } if (ft.nrows() != gk_dim[0]) { char buf[1000]; sprintf(buf, "Wrong number of rows for folded tensor: got %d but I want %d\n", gk_dim[0], ft.nrows()); - mexErrMsgTxt(buf); + DYN_MEX_FUNC_ERR_MSG_TXT(buf); } ft.zeros(); ConstTwoDMatrix gk_mat(ft.nrows(), ft.ncols(), mxGetPr(gk)); @@ -121,13 +118,14 @@ extern "C" { TwoDMatrix res_tmp_mat(ny, nper, mxGetPr(res)); res_tmp_mat = (const TwoDMatrix&)(*res_mat); delete res_mat; - plhs[0] = res; + plhs[1] = res; } catch (const KordException& e) { - mexErrMsgTxt("Caugth Kord exception."); + DYN_MEX_FUNC_ERR_MSG_TXT("Caugth Kord exception."); } catch (const TLException& e) { - mexErrMsgTxt("Caugth TL exception."); + DYN_MEX_FUNC_ERR_MSG_TXT("Caugth TL exception."); } catch (SylvException& e) { - mexErrMsgTxt("Caught Sylv exception."); + DYN_MEX_FUNC_ERR_MSG_TXT("Caught Sylv exception."); } + plhs[0] = mxCreateDoubleScalar(0); } }; diff --git a/dynare++/extern/matlab/dynare_simul.m b/dynare++/extern/matlab/dynare_simul.m index d70b90c83..0ce4dae0b 100644 --- a/dynare++/extern/matlab/dynare_simul.m +++ b/dynare++/extern/matlab/dynare_simul.m @@ -1,10 +1,10 @@ % % 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) +% [err, r] = dynare_simul(name, shocks) +% [err, r] = dynare_simul(name, prefix, shocks) +% [err, r] = dynare_simul(name, shocks, start) +% [err, r] = dynare_simul(name, prefix, shocks, start) % % name name of MAT-file produced by dynare++ % prefix prefix of variables in the MAT-file @@ -43,26 +43,30 @@ % % 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); +% [err, 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); +% [err, 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); +% [err, r] = dynare_simul('your_model.mat',shocks,ystart); % % % SEE ALSO % % "DSGE Models with Dynare++. A Tutorial.", Ondra Kamenik, 2005 -function r = dynare_simul(varargin) +function [err, r] = dynare_simul(varargin) + +if nargout ~= 2 || nargin < 12 + error('dynare_simul_ must have at least 12 input parameters and exactly 2 output arguments.'); +end % get the file name and load data fname = varargin{1}; @@ -158,3 +162,4 @@ seed = ceil(10000*rand(1,1)); command = ['r=dynare_simul_(' num2str(order-1) ',nstat,npred,nboth,nforw,' ... 'nexog,ystart,shocks,vcov_exo,seed,ss' derstr ');']; eval(command); +err = 0; diff --git a/matlab/simult_.m b/matlab/simult_.m index 505cca5ef..d89d54c2e 100644 --- a/matlab/simult_.m +++ b/matlab/simult_.m @@ -45,20 +45,21 @@ if options_.k_order_solver% Call dynare++ routines. ex_ = [zeros(1,M_.exo_nbr); ex_]; switch options_.order case 1 - y_ = dynare_simul_(1,dr.nstatic,dr.npred-dr.nboth,dr.nboth,dr.nfwrd,M_.exo_nbr, ... + [err, y_] = dynare_simul_(1,dr.nstatic,dr.npred-dr.nboth,dr.nboth,dr.nfwrd,M_.exo_nbr, ... y_(dr.order_var,1),ex_',M_.Sigma_e,options_.seed,dr.ys(dr.order_var),... zeros(M_.endo_nbr,1),dr.g_1); case 2 - y_ = dynare_simul_(2,dr.nstatic,dr.npred-dr.nboth,dr.nboth,dr.nfwrd,M_.exo_nbr, ... + [err, y_] = dynare_simul_(2,dr.nstatic,dr.npred-dr.nboth,dr.nboth,dr.nfwrd,M_.exo_nbr, ... y_(dr.order_var,1),ex_',M_.Sigma_e,options_.seed,dr.ys(dr.order_var),dr.g_0, ... dr.g_1,dr.g_2); case 3 - y_ = dynare_simul_(3,dr.nstatic,dr.npred-dr.nboth,dr.nboth,dr.nfwrd,M_.exo_nbr, ... + [err, y_] = dynare_simul_(3,dr.nstatic,dr.npred-dr.nboth,dr.nboth,dr.nfwrd,M_.exo_nbr, ... y_(dr.order_var,1),ex_',M_.Sigma_e,options_.seed,dr.ys(dr.order_var),dr.g_0, ... dr.g_1,dr.g_2,dr.g_3); otherwise error(['order = ' int2str(order) ' isn''t supported']) end + mexErrCheck('dynare_simul_', err); y_(dr.order_var,:) = y_; else k2 = dr.kstate(find(dr.kstate(:,2) <= M_.maximum_lag+1),[1 2]);