diff --git a/matlab/dsge_likelihood.m b/matlab/dsge_likelihood.m index 694c1655e934c2262c6beedcff9eee3841dfba85..b7b8d38cfb8fca37a9755d09309aacfa07632d19 100644 --- a/matlab/dsge_likelihood.m +++ b/matlab/dsge_likelihood.m @@ -146,6 +146,7 @@ if DynareOptions.estimation_dll [fval,exit_flag,ys,trend_coeff,info,params,H,Q] ... = logposterior(xparam1,DynareDataset, DynareOptions,Model, ... EstimatedParameters,BayesInfo,DynareResults); + mexErrCheck('logposterior', exit_flag); Model.params = params; if ~isequal(Model.H,0) Model.H = H; diff --git a/mex/sources/estimation/SteadyStateSolver.cc b/mex/sources/estimation/SteadyStateSolver.cc index 8f9fbf12cf64a3146e4dbb4c3ca8cf98e332a3ab..a9eaf6221708562fb3d99df4ba06541f65e0584c 100644 --- a/mex/sources/estimation/SteadyStateSolver.cc +++ b/mex/sources/estimation/SteadyStateSolver.cc @@ -19,8 +19,8 @@ #include "SteadyStateSolver.hh" -SteadyStateSolver::SteadyStateSolver(const std::string &basename, size_t n_endo) - : static_dll(basename), residual(n_endo), g1(n_endo) +SteadyStateSolver::SteadyStateSolver(const std::string &basename, size_t n_endo_arg) + : static_dll(basename), n_endo(n_endo_arg), residual(n_endo), g1(n_endo) { } diff --git a/mex/sources/estimation/SteadyStateSolver.hh b/mex/sources/estimation/SteadyStateSolver.hh index c3127aa3aa6a75d5f821b3a970470e4794ead1d2..826f5d0e0eb2626e935a01f66aae6783dc039729 100644 --- a/mex/sources/estimation/SteadyStateSolver.hh +++ b/mex/sources/estimation/SteadyStateSolver.hh @@ -17,6 +17,8 @@ * along with Dynare. If not, see <http://www.gnu.org/licenses/>. */ +#include <string> + #include "Vector.hh" #include "static_dll.hh" @@ -27,6 +29,7 @@ class SteadyStateSolver { private: StaticModelDLL static_dll; + size_t n_endo; Vector residual; // Will be discarded, only used by df() Matrix g1; // Temporary buffer for computing transpose @@ -45,32 +48,39 @@ private: static int static_df(const gsl_vector *yy, void *p, gsl_matrix *J); static int static_fdf(const gsl_vector *yy, void *p, gsl_vector *F, gsl_matrix *J); - const static double tolerance = 1e-5; + const static double tolerance = 1e-7; const static size_t max_iterations = 1000; public: class SteadyStateException { + public: + std::string message; + SteadyStateException(const std::string &message_arg) : message(message_arg) + { + } }; - SteadyStateSolver(const std::string &basename, size_t n_endo); + SteadyStateSolver(const std::string &basename, size_t n_endo_arg); template <class Vec1, class Mat, class Vec2> - void compute(Vec1 &steadyState, const Mat Mx, const Vec2 &deepParams) throw (SteadyStateException) + void compute(Vec1 &steadyState, const Mat &Mx, const Vec2 &deepParams) throw (SteadyStateException) { assert(steadyState.getStride() == 1); assert(deepParams.getStride() == 1); - const size_t n = steadyState.getSize(); + assert(steadyState.getSize() == n_endo); + + std::cout << "In: " << steadyState << std::endl; - gsl_vector_view ss = gsl_vector_view_array(steadyState.getData(), n); + gsl_vector_view ss = gsl_vector_view_array(steadyState.getData(), n_endo); params p = { &static_dll, deepParams.getData(), deepParams.getSize(), Mx.getData(), Mx.getCols(), &residual, &g1 }; gsl_multiroot_function_fdf f = {&static_f, &static_df, &static_fdf, - n, &p}; + n_endo, &p}; - const gsl_multiroot_fdfsolver_type *T = gsl_multiroot_fdfsolver_gnewton; - gsl_multiroot_fdfsolver *s = gsl_multiroot_fdfsolver_alloc(T, n); + const gsl_multiroot_fdfsolver_type *T = gsl_multiroot_fdfsolver_hybridsj; + gsl_multiroot_fdfsolver *s = gsl_multiroot_fdfsolver_alloc(T, n_endo); gsl_multiroot_fdfsolver_set(s, &f, &ss.vector); @@ -91,11 +101,13 @@ public: while(status == GSL_CONTINUE && iter < max_iterations); if (status != GSL_SUCCESS) - throw SteadyStateException(); + throw SteadyStateException(std::string(gsl_strerror(status))); gsl_vector_memcpy(&ss.vector, gsl_multiroot_fdfsolver_root(s)); gsl_multiroot_fdfsolver_free(s); + + std::cout << "Out: " << steadyState << std::endl; } }; diff --git a/mex/sources/estimation/logposterior.cc b/mex/sources/estimation/logposterior.cc index 04cff9ae65e5a240a5fcacef5d58f697e1fa4b34..f6f87973698ee6fafa97ecf987b6f33e6d6ff305 100644 --- a/mex/sources/estimation/logposterior.cc +++ b/mex/sources/estimation/logposterior.cc @@ -280,4 +280,8 @@ mexFunction(int nlhs, mxArray *plhs[], { DYN_MEX_FUNC_ERR_MSG_TXT(e.getErrMsg()); } + catch (SteadyStateSolver::SteadyStateException e) + { + DYN_MEX_FUNC_ERR_MSG_TXT(e.message.c_str()); + } }