diff --git a/mex/sources/korderpert/src/dynamic_dll.cpp b/mex/sources/korderpert/src/dynamic_dll.cpp new file mode 100644 index 000000000..9eec4b53d --- /dev/null +++ b/mex/sources/korderpert/src/dynamic_dll.cpp @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2008-2009 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 "k_ord_dynare.h" +#include "dynamic_dll.h" +#include "math.h" +#include + +////////////////////////////////////////////////////// +// Convert Matlab Dynare endo and exo names array to C type array of string pointers +// Poblem is that Matlab mx function returns a long string concatenated by columns rather than rows +// hence a rather low level approach is needed +/////////////////////////////////////////////////////// +const char ** +DynareMxArrayToString(const mxArray *mxFldp, const int len, const int width) +{ + char *cNamesCharStr = mxArrayToString(mxFldp); + const char **ret = DynareMxArrayToString(cNamesCharStr, len, width); + return ret; +} + +const char ** +DynareMxArrayToString(const char *cNamesCharStr, const int len, const int width) +{ + char cNamesMX[len][width+1]; // +#ifdef DEBUG + mexPrintf("loop DynareMxArrayToString cNamesCharStr = %s \n", cNamesCharStr); +#endif + for (int i = 0; i < width; i++) + { + for (int j = 0; j < len; j++) + { + // Allow alphanumeric and underscores "_" only: + if (isalnum(cNamesCharStr[j+i*len]) || ('_' == cNamesCharStr[j+i*len])) + { + cNamesMX[j][i] = cNamesCharStr[j+i*len]; + } + else cNamesMX[j][i] = '\0'; + } + } + const char **ret = (const char **) mxCalloc(len, sizeof(char *)); + for (int j = 0; j < len; j++) + { + cNamesMX[j][width] = '\0'; +#ifdef DEBUG + // mexPrintf("String [%d]= %s \n", j, cNamesMX[j]); +#endif + char *token = (char *) mxCalloc(strlen(cNamesMX[j])+1, sizeof(char)); + strcpy(token, cNamesMX[j]); + ret[j] = token; +#ifdef DEBUG + mexPrintf("ret [%d]= %s \n", j, ret[j]); +#endif + } + return ret; +} + +/*********************************** + * Members of DynamicModelDLL for handling loading and calling + * _dynamic () function + **************************************/ +DynamicModelDLL::DynamicModelDLL(const char *modName, const int y_length, const int j_cols, + const int n_max_lag, const int n_exog, const char *sExt) + : length(y_length), jcols(j_cols), nMax_lag(n_max_lag), nExog(n_exog) +{ + char fName[MAX_MODEL_NAME]; + strcpy(fName, modName); + using namespace std; + strcat(fName, "_dynamic"); +#ifdef DEBUG + mexPrintf("MexPrintf: Call Load run DLL %s .\n", fName); +#endif + + try + { +#ifdef WINDOWS + if (sExt == NULL) sExt = (".dll"); + HINSTANCE dynamicHinstance; + // dynamicHinstance=::LoadLibraryEx(strcat(fNname,"_.dll"),NULL,DONT_RESOLVE_DLL_REFERENCES);//sExt); //"_.dll"); + dynamicHinstance = ::LoadLibrary(strcat(fName, sExt)); //.dll); //"_.dll"); + if (dynamicHinstance == NULL) + throw 1; //alt: return; + // (DynamicFn*) typedef void * (__stdcall *DynamicFn)(); +# ifdef DEBUG + mexPrintf("MexPrintf: Call GetProcAddress %s .\n", fName); +# endif + Dynamic = (DynamicFn *) ::GetProcAddress(dynamicHinstance, "Dynamic"); + +#else // __linux__ + if (sExt == NULL) sExt = (".so"); + dynamicHinstance = dlopen(strcat(fName, sExt), RTLD_NOW); + if ((dynamicHinstance == NULL) || dlerror()) + { + cerr << dlerror() << endl; + mexPrintf("MexPrintf:Error loading DLL: %s", dlerror); + throw 1; + } + Dynamic = (DynamicFn) dlsym(dynamicHinstance, "Dynamic"); + if ((Dynamic == NULL) || dlerror()) + { + cerr << dlerror() << endl; + mexPrintf("MexPrintf:Error finding DLL function: %s", dlerror); + throw 2; + } +#endif + + } + catch (int i) + { + mexPrintf("MexPrintf: error in Load and run DLL %s , %d.\n", fName, i); + mexErrMsgTxt("Err: An error in Load and run DLL .\n"); + return; + + } + catch (...) + { + mexPrintf("MexPrintf: Unknown error in Call MATLAB function %s.\n", fName); + mexErrMsgTxt("Err: Unknown error in Load and run DLL .\n"); + return; + } +} + +// close DLL: If the referenced object was successfully closed, +// close() returns 0, non 0 otherwise +int +DynamicModelDLL::close() +{ +#ifdef WINDOWS + // MS FreeLibrary returns non 0 if OK, 0 if fails. + bool rb = FreeLibrary(dynamicHinstance); + if (rb) + return 0; + else + return 1; +#else // linux + //If OK, dlclose() returns 0, non 0 otherwise + return dlclose(dynamicHinstance); +#endif +}; + +void +DynamicModelDLL::eval(const Vector &y, const TwoDMatrix &x, const Vector *modParams, + int it_, Vector &residual, TwoDMatrix *g1, TwoDMatrix *g2) +{ + + double *dresidual, *dg1 = NULL, *dg2 = NULL; + //int length=y.length(); // not! + if ((jcols-nExog) != y.length()) + { + // throw DLL Error + mexPrintf(" DLL Error: (jcols-nExog)!=ys.length() \n"); + return; + } + if (residual.length() < length) // dummy or insufficient + { + Vector *tempv = new Vector(length); + residual = *tempv; + delete tempv; + residual.zeros(); + } + if (g1 != NULL) + { + if (g1->nrows() != length) // dummy + { + delete g1; + g1 = new TwoDMatrix(length, jcols); // and get a new one + g1->zeros(); + } + dg1 = const_cast(g1->base()); + } + if (g2 != NULL) + { + dg2 = const_cast(g2->base()); + } + dresidual = const_cast(residual.base()); + double *dy = const_cast(y.base()); + double *dx = const_cast(x.base()); + double *dbParams = const_cast(modParams->base()); +#ifdef DEBUG + mexPrintf(" try eval Dynamic with ne g1: cols=%d , rows=%d\n", + g1->ncols(), g1->nrows()); + for (int i = 0; i < modParams->length(); i++) + { + mexPrintf("k_ord_perturbation: Params[%d]= %g.\n", i, (*modParams)[i]); + } + for (int i = 0; i < jcols-nExog; i++) + { + mexPrintf("k_ord_perturbation: Ys[%d]= %g.\n", i, dy[i]); + } + mexPrintf("k_order_perturbation: call Dynamic dParams= %g , , dy = %g dx = %f .\n", + dbParams[0], dy[0], dx[0]); + +#endif + try + { + Dynamic(dy, dx, nExog, dbParams, it_, dresidual, dg1, dg2); + } + catch (...) + { + mexPrintf("MexPrintf: error in run Dynamic DLL \n"); + } +}; + +void +DynamicModelDLL::eval(const Vector &y, const TwoDMatrix &x, const Vector *modParams, + Vector &residual, TwoDMatrix *g1, TwoDMatrix *g2) +{ + + eval(y, x, modParams, nMax_lag, residual, g1, g2); +}; + +void +DynamicModelDLL::eval(const Vector &y, const Vector &x, const Vector *modParams, + Vector &residual, TwoDMatrix *g1, TwoDMatrix *g2) +{ + + /** ignore given exogens and create new 2D x matrix since + * when calling _dynamic(z,x,params,it_) x must be equal to + * zeros(M_.maximum_lag+1,M_.exo_nbr) + **/ + TwoDMatrix &mx = *(new TwoDMatrix(nMax_lag+1, nExog)); + mx.zeros(); // initialise shocks to 0s + + eval(y, mx, modParams, nMax_lag, residual, g1, g2); +}; + + diff --git a/mex/sources/korderpert/src/k_order_perturbation.h b/mex/sources/korderpert/src/dynamic_dll.h similarity index 100% rename from mex/sources/korderpert/src/k_order_perturbation.h rename to mex/sources/korderpert/src/dynamic_dll.h diff --git a/mex/sources/korderpert/src/k_ord_dynare.cpp b/mex/sources/korderpert/src/k_ord_dynare.cpp index b0a7a5bf1..120630527 100644 --- a/mex/sources/korderpert/src/k_ord_dynare.cpp +++ b/mex/sources/korderpert/src/k_ord_dynare.cpp @@ -22,6 +22,7 @@ #include #include "first_order.h" #include "k_ord_dynare.h" +#include "dynamic_dll.h" #include "mex.h" @@ -40,12 +41,12 @@ class KordpJacobian; KordpDynare::KordpDynare(const char **endo, int num_endo, const char **exo, int nexog, int npar, //const char** par, Vector *ysteady, TwoDMatrix *vcov, Vector *inParams, int nstat, - int npred, int nforw, int nboth, const int jcols, const Vector *nnzd, + int npred, int nforw, int nboth, const int jcols, const Vector *nnzd, const int nsteps, int norder, //const char* modName, Journal &jr, DynamicModelDLL &dynamicDLL, double sstol, const vector *var_order, const TwoDMatrix *llincidence, double criterium) : nStat(nstat), nBoth(nboth), nPred(npred), nForw(nforw), nExog(nexog), nPar(npar), - nYs(npred + nboth), nYss(nboth + nforw), nY(num_endo), nJcols(jcols), NNZD(nnzd), nSteps(nsteps), + nYs(npred + nboth), nYss(nboth + nforw), nY(num_endo), nJcols(jcols), NNZD(nnzd), nSteps(nsteps), nOrder(norder), journal(jr), dynamicDLL(dynamicDLL), ySteady(ysteady), vCov(vcov), params(inParams), md(1), dnl(NULL), denl(NULL), dsnl(NULL), ss_tol(sstol), varOrder(var_order), ll_Incidence(llincidence), qz_criterium(criterium) @@ -94,8 +95,8 @@ KordpDynare::KordpDynare(const char **endo, int num_endo, KordpDynare::KordpDynare(const KordpDynare &dynare) : nStat(dynare.nStat), nBoth(dynare.nBoth), nPred(dynare.nPred), nForw(dynare.nForw), nExog(dynare.nExog), nPar(dynare.nPar), - nYs(dynare.nYs), nYss(dynare.nYss), nY(dynare.nY), nJcols(dynare.nJcols), - NNZD(dynare.NNZD), nSteps(dynare.nSteps), nOrder(dynare.nOrder), + nYs(dynare.nYs), nYss(dynare.nYss), nY(dynare.nY), nJcols(dynare.nJcols), + NNZD(dynare.NNZD), nSteps(dynare.nSteps), nOrder(dynare.nOrder), journal(dynare.journal), dynamicDLL(dynare.dynamicDLL), //modName(dynare.modName), ySteady(NULL), params(NULL), vCov(NULL), md(dynare.md), dnl(NULL), denl(NULL), dsnl(NULL), ss_tol(dynare.ss_tol), @@ -203,13 +204,13 @@ KordpDynare::calcDerivatives(const Vector &yy, const Vector &xx) // Hessian TwoDMatrix *g2; if (nOrder > 1) { - //g2 = new TwoDMatrix(nY, nJcols*nJcols); // generate g2 for Hessian - // generate g2 space for sparse Hessian 3x NNZH = 3x NNZD[1] + //g2 = new TwoDMatrix(nY, nJcols*nJcols); // generate g2 for Hessian + // generate g2 space for sparse Hessian 3x NNZH = 3x NNZD[1] g2 = new TwoDMatrix((int) (*NNZD)[1],3); - g2->zeros(); -#ifdef DEBUG - mexPrintf(" g2 cols %d rows %d \n", g2->numCols(), g2->numRows()); - //g2->print(); + g2->zeros(); +#ifdef DEBUG + mexPrintf(" g2 cols %d rows %d \n", g2->numCols(), g2->numRows()); + //g2->print(); #endif } Vector &out = *(new Vector(nY)); @@ -249,12 +250,12 @@ KordpDynare::calcDerivatives(const Vector &yy, const Vector &xx) populateDerivativesContainer(g1, 1, JacobianIndices); if (nOrder > 1) { - // ReorderBlocks(g2,JacobianIndices); -#ifdef DEBUG - mexPrintf(" post dll g2 cols %d rows %d \n", g2->numCols(), g2->numRows()); - for (int ii=0;iinumRows(); ii++) - mexPrintf(" g2[%d]: %d %d %f \n", ii, (int)g2->get(ii,0),(int)g2->get(ii,1),g2->get(ii,2)); - //g2->print(); + // ReorderBlocks(g2,JacobianIndices); +#ifdef DEBUG + mexPrintf(" post dll g2 cols %d rows %d \n", g2->numCols(), g2->numRows()); + for (int ii=0;iinumRows(); ii++) + mexPrintf(" g2[%d]: %d %d %f \n", ii, (int)g2->get(ii,0),(int)g2->get(ii,1),g2->get(ii,2)); + //g2->print(); #endif populateDerivativesContainer(g2, 2, JacobianIndices); } @@ -336,7 +337,7 @@ KordpDynare::populateDerivativesContainer(TwoDMatrix *g, int ord, const vector revOrder(nJcols1); for (int i = 0; i < nJcols1; i++) revOrder[(*vOrder)[i]] = i; @@ -344,7 +345,7 @@ KordpDynare::populateDerivativesContainer(TwoDMatrix *g, int ord, const vectorget(i,0)-1; // hessian indices start with 1 int i1 = (int)g->get(i,1) -1; - int s0 = (int)floor(i1/nJcols); + int s0 = (int)floor(i1/nJcols); int s1 = i1- (nJcols*s0); if (s0 < nJcols1) s[0] = revOrder[s0]; @@ -355,20 +356,20 @@ KordpDynare::populateDerivativesContainer(TwoDMatrix *g, int ord, const vector= s[0]) - { + { double x = g->get(i,2); mdTi->insert(s, j, x); -#ifdef DEBUG - mexPrintf(" s[0]=%d s[1]=%d j=%d x=%f \n", s[0],s[1],j,x); - s.print(); - std::cout << s[0] << " " << s[1] << "\n"; -#endif +#ifdef DEBUG + mexPrintf(" s[0]=%d s[1]=%d j=%d x=%f \n", s[0],s[1],j,x); + s.print(); + std::cout << s[0] << " " << s[1] << "\n"; +#endif } } - } + } #ifdef DEBUG - mexPrintf("k_ord_dynare.cpp: END populate FSSparseTensor in calcDerivatives: ord=%d \n",ord); - mdTi->print(); + mexPrintf("k_ord_dynare.cpp: END populate FSSparseTensor in calcDerivatives: ord=%d \n",ord); + mdTi->print(); #endif // md container //md.clear();// this is to be used only for 1st order!! diff --git a/mex/sources/korderpert/src/k_ord_dynare.h b/mex/sources/korderpert/src/k_ord_dynare.h index 2bf505c38..f57d0668f 100644 --- a/mex/sources/korderpert/src/k_ord_dynare.h +++ b/mex/sources/korderpert/src/k_ord_dynare.h @@ -37,7 +37,6 @@ #include "kord_exception.h" #include "nlsolve.h" #include "approximation.h" -#include "k_order_perturbation.h" class KordpDynare; @@ -123,8 +122,8 @@ class KordpDynare : public DynamicModel const int nYs; // ={npred + nboth ; } const int nYss; // nyss ={ nboth + nforw ; } const int nY; // = num_endo={ nstat + npred + nboth + nforw ; } - const int nJcols; // no of jacobian columns= nExog+nEndo+nsPred+nsForw - const Vector *NNZD; //the total number of non-zero derivative elements + const int nJcols; // no of jacobian columns= nExog+nEndo+nsPred+nsForw + const Vector *NNZD; //the total number of non-zero derivative elements // where hessian is 2nd : NZZD(order=2) const int nSteps; const int nOrder; @@ -147,10 +146,10 @@ public: KordpDynare(const char **endo, int num_endo, const char **exo, int num_exo, int num_par, //const char** par, Vector *ySteady, TwoDMatrix *vCov, Vector *params, int nstat, int nPred, - int nforw, int nboth, const int nJcols, const Vector *NNZD, + int nforw, int nboth, const int nJcols, const Vector *NNZD, const int nSteps, const int ord, //const char* modName, Journal &jr, DynamicModelDLL &dynamicDLL, double sstol, - const vector *varOrder, const TwoDMatrix *ll_Incidence, + const vector *varOrder, const TwoDMatrix *ll_Incidence, double qz_criterium); /** Makes a deep copy of the object. */ diff --git a/mex/sources/korderpert/src/k_order_perturbation.cpp b/mex/sources/korderpert/src/k_order_perturbation.cpp index 12794bbac..d9f67d72c 100644 --- a/mex/sources/korderpert/src/k_order_perturbation.cpp +++ b/mex/sources/korderpert/src/k_order_perturbation.cpp @@ -39,6 +39,7 @@ **********************************************************/ #include "k_ord_dynare.h" +#include "dynamic_dll.h" #include "math.h" #include @@ -82,6 +83,7 @@ CK_order_perturbation::CK_order_perturbation() #endif // _MSC_VER && WINDOWS +#ifdef MATLAB_MEX_FILE // exclude mexFunction for other applications extern "C" { // mexFunction: Matlab Inerface point and the main application driver @@ -176,8 +178,8 @@ extern "C" { const int nPar = (int) mxGetScalar(mxFldp); // it_ should be set to M_.maximum_lag mxFldp = mxGetField(M_, 0, "maximum_lag"); - const int nMax_lag = (int) mxGetScalar(mxFldp); - + const int nMax_lag = (int) mxGetScalar(mxFldp); + nPred -= nBoth; // correct nPred for nBoth. mxFldp = mxGetField(dr, 0, "order_var"); @@ -221,15 +223,15 @@ extern "C" { } } #endif - - //get NNZH =NNZD(2) = the total number of non-zero Hessian elements - mxFldp = mxGetField(M_, 0, "NNZDerivatives"); - dparams = (double *) mxGetData(mxFldp); - Vector *NNZD = new Vector (dparams, (int) mxGetM(mxFldp)); -#ifdef DEBUG - mexPrintf("NNZH=%d, \n", (int) (*NNZD)[1]); -#endif - + + //get NNZH =NNZD(2) = the total number of non-zero Hessian elements + mxFldp = mxGetField(M_, 0, "NNZDerivatives"); + dparams = (double *) mxGetData(mxFldp); + Vector *NNZD = new Vector (dparams, (int) mxGetM(mxFldp)); +#ifdef DEBUG + mexPrintf("NNZH=%d, \n", (int) (*NNZD)[1]); +#endif + const int jcols = nExog+nEndo+nsPred+nsForw; // Num of Jacobian columns mexPrintf("k_order_perturbation: jcols= %d .\n", jcols); @@ -308,7 +310,7 @@ extern "C" { // make KordpDynare object KordpDynare dynare(endoNamesMX, nEndo, exoNamesMX, nExog, nPar, // paramNames, ySteady, vCov, modParams, nStat, nPred, nForw, nBoth, - jcols, NNZD, nSteps, kOrder, journal, dynamicDLL, + jcols, NNZD, nSteps, kOrder, journal, dynamicDLL, sstol, var_order_vp, llincidence, qz_criterium); // construct main K-order approximation class @@ -469,222 +471,10 @@ extern "C" { } //catch }; // end of mexFunction() }; // end of extern C +#endif // ifdef MATLAB_MEX_FILE to exclude mexFunction for other applications -////////////////////////////////////////////////////// -// Convert Matlab Dynare endo and exo names array to C type array of string pointers -// Poblem is that Matlab mx function returns a long string concatenated by columns rather than rows -// hence a rather low level approach is needed -/////////////////////////////////////////////////////// -const char ** -DynareMxArrayToString(const mxArray *mxFldp, const int len, const int width) -{ - char *cNamesCharStr = mxArrayToString(mxFldp); - const char **ret = DynareMxArrayToString(cNamesCharStr, len, width); - return ret; -} -const char ** -DynareMxArrayToString(const char *cNamesCharStr, const int len, const int width) -{ - char cNamesMX[len][width+1]; // -#ifdef DEBUG - mexPrintf("loop DynareMxArrayToString cNamesCharStr = %s \n", cNamesCharStr); -#endif - for (int i = 0; i < width; i++) - { - for (int j = 0; j < len; j++) - { - // Allow alphanumeric and underscores "_" only: - if (isalnum(cNamesCharStr[j+i*len]) || ('_' == cNamesCharStr[j+i*len])) - { - cNamesMX[j][i] = cNamesCharStr[j+i*len]; - } - else cNamesMX[j][i] = '\0'; - } - } - const char **ret = (const char **) mxCalloc(len, sizeof(char *)); - for (int j = 0; j < len; j++) - { - cNamesMX[j][width] = '\0'; -#ifdef DEBUG - // mexPrintf("String [%d]= %s \n", j, cNamesMX[j]); -#endif - char *token = (char *) mxCalloc(strlen(cNamesMX[j])+1, sizeof(char)); - strcpy(token, cNamesMX[j]); - ret[j] = token; -#ifdef DEBUG - mexPrintf("ret [%d]= %s \n", j, ret[j]); -#endif - } - return ret; -} -/*********************************** - * Members of DynamicModelDLL for handling loading and calling - * _dynamic () function - **************************************/ -DynamicModelDLL::DynamicModelDLL(const char *modName, const int y_length, const int j_cols, - const int n_max_lag, const int n_exog, const char *sExt) - : length(y_length), jcols(j_cols), nMax_lag(n_max_lag), nExog(n_exog) -{ - char fName[MAX_MODEL_NAME]; - strcpy(fName, modName); - using namespace std; - strcat(fName, "_dynamic"); -#ifdef DEBUG - mexPrintf("MexPrintf: Call Load run DLL %s .\n", fName); -#endif - try - { -#ifdef WINDOWS - if (sExt == NULL) sExt = (".dll"); - HINSTANCE dynamicHinstance; - // dynamicHinstance=::LoadLibraryEx(strcat(fNname,"_.dll"),NULL,DONT_RESOLVE_DLL_REFERENCES);//sExt); //"_.dll"); - dynamicHinstance = ::LoadLibrary(strcat(fName, sExt)); //.dll); //"_.dll"); - if (dynamicHinstance == NULL) - throw 1; //alt: return; - // (DynamicFn*) typedef void * (__stdcall *DynamicFn)(); -# ifdef DEBUG - mexPrintf("MexPrintf: Call GetProcAddress %s .\n", fName); -# endif - Dynamic = (DynamicFn *) ::GetProcAddress(dynamicHinstance, "Dynamic"); -#else // __linux__ - if (sExt == NULL) sExt = (".so"); - dynamicHinstance = dlopen(strcat(fName, sExt), RTLD_NOW); - if ((dynamicHinstance == NULL) || dlerror()) - { - cerr << dlerror() << endl; - mexPrintf("MexPrintf:Error loading DLL: %s", dlerror); - throw 1; - } - Dynamic = (DynamicFn) dlsym(dynamicHinstance, "Dynamic"); - if ((Dynamic == NULL) || dlerror()) - { - cerr << dlerror() << endl; - mexPrintf("MexPrintf:Error finding DLL function: %s", dlerror); - throw 2; - } -#endif - - } - catch (int i) - { - mexPrintf("MexPrintf: error in Load and run DLL %s , %d.\n", fName, i); - mexErrMsgTxt("Err: An error in Load and run DLL .\n"); - return; - - } - catch (...) - { - mexPrintf("MexPrintf: Unknown error in Call MATLAB function %s.\n", fName); - mexErrMsgTxt("Err: Unknown error in Load and run DLL .\n"); - return; - } -} - -// close DLL: If the referenced object was successfully closed, -// close() returns 0, non 0 otherwise -int -DynamicModelDLL::close() -{ -#ifdef WINDOWS - // MS FreeLibrary returns non 0 if OK, 0 if fails. - bool rb = FreeLibrary(dynamicHinstance); - if (rb) - return 0; - else - return 1; -#else // linux - //If OK, dlclose() returns 0, non 0 otherwise - return dlclose(dynamicHinstance); -#endif -}; - -void -DynamicModelDLL::eval(const Vector &y, const TwoDMatrix &x, const Vector *modParams, - int it_, Vector &residual, TwoDMatrix *g1, TwoDMatrix *g2) -{ - - double *dresidual, *dg1 = NULL, *dg2 = NULL; - //int length=y.length(); // not! - if ((jcols-nExog) != y.length()) - { - // throw DLL Error - mexPrintf(" DLL Error: (jcols-nExog)!=ys.length() \n"); - return; - } - if (residual.length() < length) // dummy or insufficient - { - Vector *tempv = new Vector(length); - residual = *tempv; - delete tempv; - residual.zeros(); - } - if (g1 != NULL) - { - if (g1->nrows() != length) // dummy - { - delete g1; - g1 = new TwoDMatrix(length, jcols); // and get a new one - g1->zeros(); - } - dg1 = const_cast(g1->base()); - } - if (g2 != NULL) - { - dg2 = const_cast(g2->base()); - } - dresidual = const_cast(residual.base()); - double *dy = const_cast(y.base()); - double *dx = const_cast(x.base()); - double *dbParams = const_cast(modParams->base()); -#ifdef DEBUG - mexPrintf(" try eval Dynamic with ne g1: cols=%d , rows=%d\n", - g1->ncols(), g1->nrows()); - for (int i = 0; i < modParams->length(); i++) - { - mexPrintf("k_ord_perturbation: Params[%d]= %g.\n", i, (*modParams)[i]); - } - for (int i = 0; i < jcols-nExog; i++) - { - mexPrintf("k_ord_perturbation: Ys[%d]= %g.\n", i, dy[i]); - } - mexPrintf("k_order_perturbation: call Dynamic dParams= %g , , dy = %g dx = %f .\n", - dbParams[0], dy[0], dx[0]); - -#endif - try - { - Dynamic(dy, dx, nExog, dbParams, it_, dresidual, dg1, dg2); - } - catch (...) - { - mexPrintf("MexPrintf: error in run Dynamic DLL \n"); - } -}; - -void -DynamicModelDLL::eval(const Vector &y, const TwoDMatrix &x, const Vector *modParams, - Vector &residual, TwoDMatrix *g1, TwoDMatrix *g2) -{ - - eval(y, x, modParams, nMax_lag, residual, g1, g2); -}; - -void -DynamicModelDLL::eval(const Vector &y, const Vector &x, const Vector *modParams, - Vector &residual, TwoDMatrix *g1, TwoDMatrix *g2) -{ - - /** ignore given exogens and create new 2D x matrix since - * when calling _dynamic(z,x,params,it_) x must be equal to - * zeros(M_.maximum_lag+1,M_.exo_nbr) - **/ - TwoDMatrix &mx = *(new TwoDMatrix(nMax_lag+1, nExog)); - mx.zeros(); // initialise shocks to 0s - - eval(y, mx, modParams, nMax_lag, residual, g1, g2); -}; diff --git a/mex/sources/korderpert/src/k_order_test_main.cpp b/mex/sources/korderpert/src/k_order_test_main.cpp index 57d4fce5d..de438b2ac 100644 --- a/mex/sources/korderpert/src/k_order_test_main.cpp +++ b/mex/sources/korderpert/src/k_order_test_main.cpp @@ -26,6 +26,7 @@ //#include "stdafx.h" #include "k_ord_dynare.h" +#include "dynamic_dll.h" int main(int argc, char *argv[]) @@ -79,9 +80,9 @@ main(int argc, char *argv[]) }; const int nSteady = 16; //27 //31;//29, 16 (int)mxGetM(mxFldp); Vector *ySteady = new Vector(dYSparams, nSteady); - - double nnzd[3]={ 77,217,0}; - const Vector *NNZD = new Vector(nnzd, 3); + + double nnzd[3]={ 77,217,0}; + const Vector *NNZD = new Vector(nnzd, 3); //mxFldp = mxGetField(dr, 0,"nstatic" ); const int nStat = 7; //(int)mxGetScalar(mxFldp); diff --git a/mex/sources/korderpert/src/linkDLL.bat b/mex/sources/korderpert/src/linkDLL.bat index 7b5286118..b3ded88ed 100644 --- a/mex/sources/korderpert/src/linkDLL.bat +++ b/mex/sources/korderpert/src/linkDLL.bat @@ -1 +1 @@ -gcc -DMATLAB_MEX_FILE -mthreads -shared -DWINDOWS -DPOSIX_THREADS -I"c:/Program Files"/MATLAB_SV71/extern/include -I Dynare_pp/src -I Dynare_pp/kord -I Dynare_pp/tl/cc -I Dynare_pp/utils/cc/ -I Dynare_pp/sylv/cc/ -I"f:/Pthreads/Pre-built.2/include" -I"f:/mingw/include" -o k_order_perturbation.dll k_ord_dynare.o k_order_perturbation.o nlsolve.o "dynare_pp/extern/matlab"/dynarelib.a -Wl,-L"c:/Program Files"/MATLAB_SV71/extern/lib/win32/microsoft/ -Wl,-llibmex -Wl,-llibmx -Wl,-llibmwlapack -Wl,-llibdflapack -lg2c -lmingw32 -lstdc++ -L"f:/Pthreads/Pre-built.2/lib" -lpthreadGC2 +gcc -DMATLAB_MEX_FILE -mthreads -shared -DWINDOWS -DPOSIX_THREADS -I"c:/Program Files"/MATLAB_SV71/extern/include -I Dynare_pp/src -I Dynare_pp/kord -I Dynare_pp/tl/cc -I Dynare_pp/utils/cc/ -I Dynare_pp/sylv/cc/ -I"f:/Pthreads/Pre-built.2/include" -I"f:/mingw/include" -o k_order_perturbation.dll k_ord_dynare.o k_order_perturbation.o dynamic_dll.o nlsolve.o "dynare_pp/extern/matlab"/dynarelib.a -Wl,-L"c:/Program Files"/MATLAB_SV71/extern/lib/win32/microsoft/ -Wl,-llibmex -Wl,-llibmx -Wl,-llibmwlapack -Wl,-llibdflapack -lg2c -lmingw32 -lstdc++ -L"f:/Pthreads/Pre-built.2/lib" -lpthreadGC2 diff --git a/mex/sources/korderpert/src/linkdbgexe.bat b/mex/sources/korderpert/src/linkdbgexe.bat index ef625380f..e6ea506fd 100644 --- a/mex/sources/korderpert/src/linkdbgexe.bat +++ b/mex/sources/korderpert/src/linkdbgexe.bat @@ -1 +1 @@ -gcc -DMATLAB_MEX_FILE -mthreads -g -DWINDOWS -DPOSIX_THREADS -I"c:/Program Files"/MATLAB_SV71/extern/include -I Dynare_pp/src -I Dynare_pp/kord -I Dynare_pp/tl/cc -I Dynare_pp/utils/cc/ -I Dynare_pp/sylv/cc/ -I"f:/Pthreads/Pre-built.2/include" -I"f:/mingw/include" -o k_orddbgtest.exe k_order_test_main.o k_ord_dynare.o k_order_perturbation.o nlsolve.o "dynare_pp/extern/matlab"/dynarelib.a -Wl,-L"c:/Program Files"/MATLAB_SV71/extern/lib/win32/microsoft/ -Wl,-llibmex -Wl,-llibmx -Wl,-llibmwlapack -Wl,-llibdflapack -lg2c -lmingw32 -lstdc++ -L"f:/Pthreads/Pre-built.2/lib" -lpthreadGC2 +gcc -DMATLAB_MEX_FILE -mthreads -g -DWINDOWS -DPOSIX_THREADS -I"c:/Program Files"/MATLAB_SV71/extern/include -I Dynare_pp/src -I Dynare_pp/kord -I Dynare_pp/tl/cc -I Dynare_pp/utils/cc/ -I Dynare_pp/sylv/cc/ -I"f:/Pthreads/Pre-built.2/include" -I"f:/mingw/include" -o k_orddbgtest.exe k_order_test_main.o k_ord_dynare.o k_order_perturbation.o nlsolve.o dynamic_dll.o "dynare_pp/extern/matlab"/dynarelib.a -Wl,-L"c:/Program Files"/MATLAB_SV71/extern/lib/win32/microsoft/ -Wl,-llibmex -Wl,-llibmx -Wl,-llibmwlapack -Wl,-llibdflapack -lg2c -lmingw32 -lstdc++ -L"f:/Pthreads/Pre-built.2/lib" -lpthreadGC2