From 2449a4365c71411b61284264c7baf86705e15290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Tue, 9 Mar 2010 18:22:33 +0100 Subject: [PATCH] K-order DLL, DynareNameList class: removed memory leaks --- .../k_order_perturbation/k_ord_dynare.cc | 48 +++---------------- .../k_order_perturbation/k_ord_dynare.hh | 43 ++++------------- .../k_order_perturbation.cc | 46 ++++++------------ 3 files changed, 30 insertions(+), 107 deletions(-) diff --git a/mex/sources/k_order_perturbation/k_ord_dynare.cc b/mex/sources/k_order_perturbation/k_ord_dynare.cc index f02ba300d..f649a2891 100644 --- a/mex/sources/k_order_perturbation/k_ord_dynare.cc +++ b/mex/sources/k_order_perturbation/k_ord_dynare.cc @@ -33,8 +33,8 @@ /* Dynare DynamicModel class */ /**************************************************************************************/ -KordpDynare::KordpDynare(const char **endo, int num_endo, - const char **exo, int nexog, int npar, +KordpDynare::KordpDynare(const vector &endo, int num_endo, + const vector &exo, int nexog, int npar, Vector &ysteady, TwoDMatrix &vcov, Vector &inParams, int nstat, int npred, int nforw, int nboth, const int jcols, const Vector &nnzd, const int nsteps, int norder, @@ -312,52 +312,16 @@ KordpDynare::ReorderDynareJacobianIndices() throw (TLException) /**************************************************************************************/ /* DynareNameList class */ /**************************************************************************************/ -vector -DynareNameList::selectIndices(const vector &ns) const throw (DynareException) -{ - vector res; - for (unsigned int i = 0; i < ns.size(); i++) - { - int j = 0; - while (j < getNum() && strcmp(getName(j), ns[i]) != 0) - j++; - if (j == getNum()) - throw DynareException(__FILE__, __LINE__, - string("Couldn't find name for ") + ns[i] - +" in DynareNameList::selectIndices"); - res.push_back(j); - } - return res; -} -DynareNameList::DynareNameList(const KordpDynare &dynare) +DynareNameList::DynareNameList(const KordpDynare &dynare, const vector &names_arg) : names(names_arg) { - for (int i = 0; i < dynare.ny(); i++) - names.push_back(dynare.dnl.getName(i)); -} -DynareNameList::DynareNameList(const KordpDynare &dynare, const char **namesp) -{ - for (int i = 0; i < dynare.ny(); i++) - names.push_back(namesp[i]); -} - -DynareExogNameList::DynareExogNameList(const KordpDynare &dynare) -{ - for (int i = 0; i < dynare.nexog(); i++) - names.push_back(dynare.denl.getName(i)); -} - -DynareExogNameList::DynareExogNameList(const KordpDynare &dynare, const char **namesp) -{ - for (int i = 0; i < dynare.nexog(); i++) - names.push_back(namesp[i]); } DynareStateNameList::DynareStateNameList(const KordpDynare &dynare, const DynareNameList &dnl, - const DynareExogNameList &denl) + const DynareNameList &denl) { for (int i = 0; i < dynare.nys(); i++) - names.push_back(dnl.getName(i+dynare.nstat())); + names.push_back(string(dnl.getName(i+dynare.nstat()))); for (int i = 0; i < dynare.nexog(); i++) - names.push_back(denl.getName(i)); + names.push_back(string(denl.getName(i))); } diff --git a/mex/sources/k_order_perturbation/k_ord_dynare.hh b/mex/sources/k_order_perturbation/k_ord_dynare.hh index 10ad4f261..f7998a610 100644 --- a/mex/sources/k_order_perturbation/k_ord_dynare.hh +++ b/mex/sources/k_order_perturbation/k_ord_dynare.hh @@ -45,10 +45,9 @@ class KordpDynare; /*////////////////////////////////////////////*/ class DynareNameList : public NameList { - vector names; + vector names; public: - DynareNameList(const KordpDynare &dynare); - DynareNameList(const KordpDynare &dynare, const char **names); + DynareNameList(const KordpDynare &dynare, const vector &names_arg); int getNum() const { @@ -57,38 +56,16 @@ public: const char * getName(int i) const { - 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. */ - vector selectIndices(const vector &ns) const throw (DynareException); -}; - -class DynareExogNameList : public NameList -{ - vector names; -public: - DynareExogNameList(const KordpDynare &dynare); - DynareExogNameList(const KordpDynare &dynare, const char **names); - int - getNum() const - { - return (int) names.size(); - } - const char * - getName(int i) const - { - return names[i]; + return names[i].c_str(); } }; class DynareStateNameList : public NameList { - vector names; + vector names; public: DynareStateNameList(const KordpDynare &dynare, const DynareNameList &dnl, - const DynareExogNameList &denl); + const DynareNameList &denl); int getNum() const { @@ -97,7 +74,7 @@ public: const char * getName(int i) const { - return names[i]; + return names[i].c_str(); } }; /*********************************************/ @@ -108,7 +85,6 @@ class DynamicModelDLL; class KordpDynare : public DynamicModel { friend class DynareNameList; - friend class DynareExogNameList; friend class DynareStateNameList; friend class DynamicModelDLL; @@ -131,8 +107,7 @@ class KordpDynare : public DynamicModel Vector ¶ms; TwoDMatrix &vCov; TensorContainer md; // ModelDerivatives - DynareNameList dnl; - DynareExogNameList denl; + DynareNameList dnl, denl; DynareStateNameList dsnl; const double ss_tol; const vector &varOrder; @@ -140,8 +115,8 @@ class KordpDynare : public DynamicModel double qz_criterium; vector JacobianIndices; public: - KordpDynare(const char **endo, int num_endo, - const char **exo, int num_exo, int num_par, + KordpDynare(const vector &endo, int num_endo, + const vector &exo, int num_exo, int num_par, Vector &ySteady, TwoDMatrix &vCov, Vector ¶ms, int nstat, int nPred, int nforw, int nboth, const int nJcols, const Vector &NNZD, const int nSteps, const int ord, diff --git a/mex/sources/k_order_perturbation/k_order_perturbation.cc b/mex/sources/k_order_perturbation/k_order_perturbation.cc index 93a8e31e0..a430773de 100644 --- a/mex/sources/k_order_perturbation/k_order_perturbation.cc +++ b/mex/sources/k_order_perturbation/k_order_perturbation.cc @@ -48,41 +48,23 @@ #if defined(MATLAB_MEX_FILE) || defined(OCTAVE_MEX_FILE) // exclude mexFunction for other applications -const char ** -DynareMxArrayToString(const char *cNamesCharStr, const int len, const int width) -{ - char **cNamesMX; - cNamesMX = (char **) calloc(len, sizeof(char *)); - for (int i = 0; i < len; i++) - cNamesMX[i] = (char *) calloc(width+1, sizeof(char)); - - 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'; - } - } - return (const char **) cNamesMX; -} - ////////////////////////////////////////////////////// -// Convert Matlab Dynare endo and exo names array to C type array of string pointers +// Convert MATLAB Dynare endo and exo names array to a vector 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) +void +DynareMxArrayToString(const mxArray *mxFldp, const int len, const int width, vector &out) { char *cNamesCharStr = mxArrayToString(mxFldp); - const char **ret = DynareMxArrayToString(cNamesCharStr, len, width); - return ret; + out.resize(len); + + 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] == '_')) + out[j] += cNamesCharStr[j+i*len]; } extern "C" { @@ -196,12 +178,14 @@ extern "C" { mxFldp = mxGetField(M_, 0, "var_order_endo_names"); const int nendo = (int) mxGetM(mxFldp); const int widthEndo = (int) mxGetN(mxFldp); - const char **endoNamesMX = DynareMxArrayToString(mxFldp, nendo, widthEndo); + vector endoNames; + DynareMxArrayToString(mxFldp, nendo, widthEndo, endoNames); mxFldp = mxGetField(M_, 0, "exo_names"); const int nexo = (int) mxGetM(mxFldp); const int widthExog = (int) mxGetN(mxFldp); - const char **exoNamesMX = DynareMxArrayToString(mxFldp, nexo, widthExog); + vector exoNames; + DynareMxArrayToString(mxFldp, nexo, widthExog, exoNames); if ((nEndo != nendo) || (nExog != nexo)) mexErrMsgTxt("Incorrect number of input parameters."); @@ -225,7 +209,7 @@ extern "C" { tls.init(kOrder, nStat+2*nPred+3*nBoth+2*nForw+nExog); // make KordpDynare object - KordpDynare dynare(endoNamesMX, nEndo, exoNamesMX, nExog, nPar, // paramNames, + KordpDynare dynare(endoNames, nEndo, exoNames, nExog, nPar, ySteady, vCov, modParams, nStat, nPred, nForw, nBoth, jcols, NNZD, nSteps, kOrder, journal, dynamicDLL, sstol, var_order_vp, llincidence, qz_criterium);