diff --git a/mex/sources/estimation/KalmanFilter.cc b/mex/sources/estimation/KalmanFilter.cc index af7389aa840becfe6816a782c3867cec4b6f86d1..fe2a2d29367883fa0551533d46853028af0dd827 100644 --- a/mex/sources/estimation/KalmanFilter.cc +++ b/mex/sources/estimation/KalmanFilter.cc @@ -80,15 +80,24 @@ KalmanFilter::compute(const MatrixConstView &dataView, VectorView &steadyState, VectorView &vll, MatrixView &detrendedDataView, size_t start, size_t period, double &penalty, int &info) { - if(period==0) // initialise all KF matrices - initKalmanFilter.initialize(steadyState, deepParams, R, Q, RQRt, T, Pstar, Pinf, - penalty, dataView, detrendedDataView, info); - else // initialise parameter dependent KF matrices only but not Ps - initKalmanFilter.initialize(steadyState, deepParams, R, Q, RQRt, T, - penalty, dataView, detrendedDataView, info); - - double lik= filter(detrendedDataView, H, vll, start, info); - + double lik=INFINITY; + try + { + if(period==0) // initialise all KF matrices + initKalmanFilter.initialize(steadyState, deepParams, R, Q, RQRt, T, Pstar, Pinf, + penalty, dataView, detrendedDataView, info); + else // initialise parameter dependent KF matrices only but not Ps + initKalmanFilter.initialize(steadyState, deepParams, R, Q, RQRt, T, + penalty, dataView, detrendedDataView, info); + + lik= filter(detrendedDataView, H, vll, start, info); + } + catch (const DecisionRules::BlanchardKahnException &bke) + { + info =22; + return penalty; + } + if (info != 0) return penalty; else @@ -97,7 +106,7 @@ KalmanFilter::compute(const MatrixConstView &dataView, VectorView &steadyState, }; /** - * 30:* + * Multi-variate standard Kalman Filter */ double KalmanFilter::filter(const MatrixView &detrendedDataView, const Matrix &H, VectorView &vll, size_t start, int &info) @@ -110,6 +119,7 @@ KalmanFilter::filter(const MatrixView &detrendedDataView, const Matrix &H, Vect if (nonstationary) { // K=PZ' + //blas::gemm("N", "T", 1.0, Pstar, Z, 0.0, K); blas::symm("L", "U", 1.0, Pstar, Zt, 0.0, K); //F=ZPZ' +H = ZK+H @@ -141,6 +151,7 @@ KalmanFilter::filter(const MatrixView &detrendedDataView, const Matrix &H, Vect Pstar(i,j)*=0.5; // K=PZ' + //blas::gemm("N", "T", 1.0, Pstar, Z, 0.0, K); blas::symm("L", "U", 1.0, Pstar, Zt, 0.0, K); //F=ZPZ' +H = ZK+H @@ -167,7 +178,8 @@ KalmanFilter::filter(const MatrixView &detrendedDataView, const Matrix &H, Vect Fdet = 1; for (size_t d = 1; d <= p; ++d) Fdet *= FUTP(d + (d-1)*d/2 -1); - Fdet *=Fdet; + Fdet *=Fdet;//*pow(-1.0,p); + logFdet=log(fabs(Fdet)); Ptmp = Pstar; @@ -181,10 +193,6 @@ KalmanFilter::filter(const MatrixView &detrendedDataView, const Matrix &H, Vect // 3) Pt+1= Ptmp*T' +RQR' Pstar = RQRt; blas::gemm("N", "T", 1.0, Ptmp, T, 1.0, Pstar); - //enforce Pstar symmetry with P=(P+P')/2=0.5P+0.5P' - //blas::gemm("N", "T", 0.5, Ptmp, T, 0.5, Pstar); - //mat::transpose(Ptmp, Pstar); - //mat::add(Pstar,Ptmp); if (t>0) nonstationary = mat::isDiff(KFinv, oldKFinv, riccati_tol); diff --git a/mex/sources/estimation/LogLikelihoodSubSample.cc b/mex/sources/estimation/LogLikelihoodSubSample.cc index f860cbe4f780eedcbf4740b393e3aa87e0408840..a2e230b67d1295fb9ef7f199b2f83a0f2a192c6f 100644 --- a/mex/sources/estimation/LogLikelihoodSubSample.cc +++ b/mex/sources/estimation/LogLikelihoodSubSample.cc @@ -36,7 +36,7 @@ LogLikelihoodSubSample::LogLikelihoodSubSample(const std::string &dynamicDllFile const std::vector<size_t> &zeta_fwrd_arg, const std::vector<size_t> &zeta_back_arg, const std::vector<size_t> &zeta_mixed_arg, const std::vector<size_t> &zeta_static_arg, const double qz_criterium, const std::vector<size_t> &varobs, double riccati_tol, double lyapunov_tol, int &INinfo) : - estiParDesc(INestiParDesc), + startPenalty(-1e8),estiParDesc(INestiParDesc), kalmanFilter(dynamicDllFile, n_endo, n_exo, zeta_fwrd_arg, zeta_back_arg, zeta_mixed_arg, zeta_static_arg, qz_criterium, varobs, riccati_tol, lyapunov_tol, INinfo), eigQ(n_exo), eigH(varobs.size()), info(INinfo) { @@ -46,6 +46,8 @@ double LogLikelihoodSubSample::compute(VectorView &steadyState, const MatrixConstView &dataView, const Vector &estParams, Vector &deepParams, Matrix &Q, Matrix &H, VectorView &vll, MatrixView &detrendedDataView, int &info, size_t start, size_t period) { + penalty=startPenalty; + logLikelihood=startPenalty; updateParams(estParams, deepParams, Q, H, period); if (info == 0) @@ -84,17 +86,11 @@ LogLikelihoodSubSample::updateParams(const Vector &estParams, Vector &deepParams break; case EstimatedParameter::measureErr_SD: -#ifdef DEBUG - mexPrintf("Setting of H var_endo\n"); -#endif k = estiParDesc.estParams[i].ID1; H(k, k) = estParams(i)*estParams(i); break; case EstimatedParameter::shock_Corr: -#ifdef DEBUG - mexPrintf("Setting of Q corrx\n"); -#endif k1 = estiParDesc.estParams[i].ID1; k2 = estiParDesc.estParams[i].ID2; Q(k1, k2) = estParams(i)*sqrt(Q(k1, k1)*Q(k2, k2)); @@ -128,9 +124,6 @@ LogLikelihoodSubSample::updateParams(const Vector &estParams, Vector &deepParams break; case EstimatedParameter::measureErr_Corr: -#ifdef DEBUG - mexPrintf("Setting of H corrn\n"); -#endif k1 = estiParDesc.estParams[i].ID1; k2 = estiParDesc.estParams[i].ID2; // H(k1,k2) = xparam1(i)*sqrt(H(k1,k1)*H(k2,k2)); diff --git a/mex/sources/estimation/LogLikelihoodSubSample.hh b/mex/sources/estimation/LogLikelihoodSubSample.hh index ec339b2ca8e9266b6427d74019d22885d884000f..eeeca471667767491b5ee63b69664ac841d91206 100644 --- a/mex/sources/estimation/LogLikelihoodSubSample.hh +++ b/mex/sources/estimation/LogLikelihoodSubSample.hh @@ -43,13 +43,14 @@ public: virtual ~LogLikelihoodSubSample(); private: - double penalty; + double startPenalty, penalty; double logLikelihood; EstimatedParametersDescription &estiParDesc; KalmanFilter kalmanFilter; VDVEigDecomposition eigQ; VDVEigDecomposition eigH; int &info; + // methods void updateParams(const Vector &estParams, Vector &deepParams, Matrix &Q, Matrix &H, size_t period); diff --git a/mex/sources/estimation/RandomWalkMetropolisHastings.cc b/mex/sources/estimation/RandomWalkMetropolisHastings.cc index d22f5f4c56872d510ecd46a3e44ea7b0815a6f84..87fdb88118c13370499f76125f9405f122f493ec 100644 --- a/mex/sources/estimation/RandomWalkMetropolisHastings.cc +++ b/mex/sources/estimation/RandomWalkMetropolisHastings.cc @@ -19,17 +19,27 @@ #include "RandomWalkMetropolisHastings.hh" +#include <iostream> +#include <fstream> + double RandomWalkMetropolisHastings::compute(VectorView &mhLogPostDens, MatrixView &mhParams, Matrix &steadyState, Vector &estParams, Vector &deepParams, const MatrixConstView &data, Matrix &Q, Matrix &H, const size_t presampleStart, int &info, const size_t startDraw, size_t nMHruns, const Matrix &Dscale, LogPosteriorDensity &lpd, Prior &drawDistribution, EstimatedParametersDescription &epd) { + //streambuf *likbuf, *drawbuf *backup; + std::ofstream urandfilestr, drawfilestr; + urandfilestr.open ("urand.csv"); + drawfilestr.open ("paramdraws.csv"); + bool overbound; - double newLogpost, logpost; + double newLogpost, logpost, urand; size_t count, accepted = 0; parDraw = estParams; + logpost = - lpd.compute(steadyState, estParams, deepParams, data, Q, H, presampleStart, info); + for (size_t run = startDraw - 1; run < nMHruns; ++run) { overbound=false; @@ -49,25 +59,36 @@ RandomWalkMetropolisHastings::compute(VectorView &mhLogPostDens, MatrixView &mhP { newLogpost = - lpd.compute(steadyState, newParDraw, deepParams, data, Q, H, presampleStart, info); } - catch(...) + catch(const std::exception &e) + { + throw; // for now handle the system and other errors higher-up + } + catch (...) { newLogpost = -INFINITY; } } - if ((newLogpost > -INFINITY) && log(uniform.drand()) < newLogpost-logpost) + urand=uniform.drand(); + if ((newLogpost > -INFINITY) && log(urand) < newLogpost-logpost) { - mat::get_row(mhParams, run) = newParDraw; parDraw = newParDraw; - mhLogPostDens(run) = newLogpost; logpost = newLogpost; accepted++; } - else - { - mat::get_row(mhParams, run) = parDraw; - mhLogPostDens(run) = logpost; - } + mat::get_row(mhParams, run) = parDraw; + mhLogPostDens(run) = logpost; + + //urandfilestr.write(urand); + urandfilestr << urand << "\n"; //"," + for (size_t c=0;c<newParDraw.getSize()-1;++c) + drawfilestr << newParDraw(c) << ","; +// drawfilestr.write(newParDraw(i)); + drawfilestr << newParDraw(newParDraw.getSize()-1) << "\n"; } + + urandfilestr.close(); + drawfilestr.close(); + return (double) accepted/(nMHruns-startDraw+1); } diff --git a/mex/sources/estimation/logMHMCMCposterior.cc b/mex/sources/estimation/logMHMCMCposterior.cc index 6fd8020470bbade68ecf2bc70a3162a80d50c504..6a5ea05ac22a8e2f4f3a2f6de7855135525bb287 100644 --- a/mex/sources/estimation/logMHMCMCposterior.cc +++ b/mex/sources/estimation/logMHMCMCposterior.cc @@ -28,8 +28,10 @@ #include "RandomWalkMetropolisHastings.hh" #include "mex.h" -#ifdef MATLAB_MEX_FILE +#if defined MATLAB_MEX_FILE # include "mat.h" +#else // OCTAVE_MEX_FILE e.t.c. +#include "matio.h" #endif #if defined(_WIN32) || defined(__CYGWIN32__) || defined(WINDOWS) @@ -100,53 +102,84 @@ fillEstParamsInfo(const mxArray *estim_params_info, EstimatedParameter::pType ty } } -size_t +int sampleMHMC(LogPosteriorDensity &lpd, RandomWalkMetropolisHastings &rwmh, Matrix &steadyState, Vector &estParams, Vector &deepParams, const MatrixConstView &data, Matrix &Q, Matrix &H, - const size_t presampleStart, int &info, const VectorConstView &nruns, const size_t fblock, const size_t nBlocks, + size_t presampleStart, int &info, const VectorConstView &nruns, size_t fblock, size_t nBlocks, const Matrix &Jscale, Prior &drawDistribution, EstimatedParametersDescription &epd, const std::string &resultsFileStem, size_t console_mode, size_t load_mh_file) { enum {iMin, iMax}; + int iret=0; // return value std::vector<size_t> OpenOldFile(nBlocks, 0); size_t jloop = 0, irun, j; // counters double dsum, dmax, dmin, sux = 0, jsux = 0; std::string mhFName; std::stringstream ssFName; -#ifdef MATLAB_MEX_FILE +#if defined MATLAB_MEX_FILE MATFile *drawmat; // MCMC draws output file pointer int matfStatus; +#else // OCTAVE_MEX_FILE e.t.c. + int dims[2]; + mat_t *drawmat; + matvar_t *matvar; + int matfStatus; #endif FILE *fidlog; // log file size_t npar = estParams.getSize(); Matrix MinMax(npar, 2); - const mxArray *myinputs = mexGetVariablePtr("caller", "myinputs"); - const mxArray *InitSizeArrayPtr = mxGetField(myinputs, 0, "InitSizeArray"); + + const mxArray *InitSizeArrayPtr = mexGetVariablePtr("caller", "InitSizeArray"); + if (InitSizeArrayPtr==NULL || InitSizeArrayPtr==0 || (long)InitSizeArrayPtr==-1) + { + mexPrintf("Metropolis-Hastings myinputs field InitSizeArrayPtr Initialisation failed!\n"); + return(-1); + } const VectorConstView InitSizeArrayVw(mxGetPr(InitSizeArrayPtr), nBlocks, 1); Vector InitSizeArray(InitSizeArrayVw.getSize()); InitSizeArray = InitSizeArrayVw; - const mxArray *flinePtr = mxGetField(myinputs, 0, "fline"); + //const mxArray *flinePtr = mxGetField(myinputs, 0, "fline"); + const mxArray *flinePtr = mexGetVariable("caller", "fline"); + if (flinePtr==NULL || flinePtr==0 || (long)flinePtr==-1) + { + mexPrintf("Metropolis-Hastings myinputs field fline Initialisation failed!\n"); + return(-1); + } VectorView fline(mxGetPr(flinePtr), nBlocks, 1); - mxArray *NewFileArrayPtr = mxGetField(myinputs, 0, "NewFile"); + mxArray *NewFileArrayPtr = mexGetVariable("caller", "NewFile"); + if (NewFileArrayPtr==NULL || NewFileArrayPtr==0 || (long)NewFileArrayPtr==-1) + { + mexPrintf("Metropolis-Hastings myinputs fields NewFileArrayPtr Initialisation failed!\n"); + return(-1); + } VectorView NewFileVw(mxGetPr(NewFileArrayPtr), nBlocks, 1); - Vector NewFile(NewFileVw.getSize()); - NewFile = NewFileVw; + //Vector NewFile(NewFileVw.getSize()); + //NewFile = NewFileVw; - const mxArray *MAX_nrunsPtr = mxGetField(myinputs, 0, "MAX_nruns"); + const mxArray *MAX_nrunsPtr = mexGetVariablePtr("caller", "MAX_nruns"); const size_t MAX_nruns = (size_t) mxGetScalar(MAX_nrunsPtr); - //ix2=myinputs.ix2; - const mxArray *blockStartParamsPtr = mxGetField(myinputs, 0, "ix2"); + const mxArray *blockStartParamsPtr = mexGetVariable("caller", "ix2"); MatrixView blockStartParamsMxVw(mxGetPr(blockStartParamsPtr), nBlocks, npar, nBlocks); Vector startParams(npar); - //ilogpo2=myinputs.ilogpo2; - mxArray *mxFirstLogLikPtr = mxGetField(myinputs, 0, "ilogpo2"); + const mxArray *mxFirstLogLikPtr = mexGetVariable("caller", "ilogpo2"); VectorView FirstLogLiK(mxGetPr(mxFirstLogLikPtr), nBlocks, 1); - const mxArray *record = mxGetField(myinputs, 0, "record"); + const mxArray *record = mexGetVariable("caller", "record"); + //const mxArray *record = mxGetField(myinputs, 0, "record"); + if (record==NULL || record==0 || (long)record==-1) + { + mexPrintf("Metropolis-Hastings record Initialisation failed!\n"); + return(-1); + } mxArray *AcceptationRatesPtr = mxGetField(record, 0, "AcceptationRates"); + if (AcceptationRatesPtr==NULL || AcceptationRatesPtr==0 || (long)AcceptationRatesPtr==-1) + { + mexPrintf("Metropolis-Hastings record AcceptationRatesPtr Initialisation failed!\n"); + return(-1); + } VectorView AcceptationRates(mxGetPr(AcceptationRatesPtr), nBlocks, 1); mxArray *mxLastParametersPtr = mxGetField(record, 0, "LastParameters"); @@ -160,6 +193,7 @@ sampleMHMC(LogPosteriorDensity &lpd, RandomWalkMetropolisHastings &rwmh, mxArray *mxMhParamDrawsPtr = 0; size_t currInitSizeArray = 0; +#if defined MATLAB_MEX_FILE // Waitbar mxArray *waitBarRhs[3], *waitBarLhs[1]; waitBarRhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); @@ -178,21 +212,22 @@ sampleMHMC(LogPosteriorDensity &lpd, RandomWalkMetropolisHastings &rwmh, mxDestroyArray(waitBarRhs[1]); waitBarRhs[1] = waitBarLhs[0]; } +#endif for (size_t b = fblock; b <= nBlocks; ++b) { jloop = jloop+1; -#ifdef MATLAB_MEX_FILE +#if defined MATLAB_MEX_FILE if ((load_mh_file != 0) && (fline(b) > 1) && OpenOldFile[b]) { // load(['./' MhDirectoryName '/' ModelName '_mh' int2str(NewFile(b)) '_blck' int2str(b) '.mat']) ssFName.clear(); ssFName.str(""); - ssFName << resultsFileStem << DIRECTORY_SEPARATOR << "metropolis" << DIRECTORY_SEPARATOR << resultsFileStem << "_mh" << (size_t) NewFile(b-1) << "_blck" << b << ".mat"; + ssFName << resultsFileStem << DIRECTORY_SEPARATOR << "metropolis" << DIRECTORY_SEPARATOR << resultsFileStem << "_mh" << (size_t) NewFileVw(b-1) << "_blck" << b << ".mat"; mhFName = ssFName.str(); drawmat = matOpen(mhFName.c_str(), "r"); - mexPrintf("MH: Open mhFName.c_str %s \n", mhFName.c_str()); + mexPrintf("MHMCMC: Using interim partial draws file %s \n", mhFName.c_str()); if (drawmat == 0) { fline(b) = 1; @@ -208,16 +243,109 @@ sampleMHMC(LogPosteriorDensity &lpd, RandomWalkMetropolisHastings &rwmh, OpenOldFile[b] = 1; } } // end if + if (console_mode==0) + { + ssbarTitle.clear(); + ssbarTitle.str(""); + ssbarTitle << "Please wait... Metropolis-Hastings " << b << "/" << nBlocks << " ..."; + barTitle = ssbarTitle.str(); + waitBarRhs[2] = mxCreateString(barTitle.c_str()); + //strcpy( *mxGetPr(waitBarRhs[1]), mhFName.c_str()); + *mxGetPr(waitBarRhs[0]) = (double) 0.0; + mexCallMATLAB(0, NULL, 3, waitBarRhs, "waitbar"); + mxDestroyArray(waitBarRhs[2]); + } +#else //if defined OCTAVE_MEX_FILE + if ((load_mh_file != 0) && (fline(b) > 1) && OpenOldFile[b]) + { + // load(['./' MhDirectoryName '/' ModelName '_mh' int2str(NewFile(b)) '_blck' int2str(b) '.mat']) + if ((currInitSizeArray != (size_t) InitSizeArray(b-1)) && OpenOldFile[b] != 1) + { + // new or different size result arrays/matrices + currInitSizeArray = (size_t) InitSizeArray(b-1); + if (mxMhLogPostDensPtr) + mxDestroyArray(mxMhLogPostDensPtr); // log post density array + mxMhLogPostDensPtr = mxCreateDoubleMatrix(currInitSizeArray, 1, mxREAL); + if( mxMhLogPostDensPtr == NULL) + { + mexPrintf("Metropolis-Hastings mxMhLogPostDensPtr Initialisation failed!\n"); + return(-1); + } + if (mxMhParamDrawsPtr) + mxDestroyArray(mxMhParamDrawsPtr); // accepted MCMC MH draws + mxMhParamDrawsPtr = mxCreateDoubleMatrix(currInitSizeArray, npar, mxREAL); + if( mxMhParamDrawsPtr == NULL) + { + mexPrintf("Metropolis-Hastings mxMhParamDrawsPtr Initialisation failed!\n"); + return(-1); + } + } + + ssFName.clear(); + ssFName.str(""); + ssFName << resultsFileStem << DIRECTORY_SEPARATOR << "metropolis" << DIRECTORY_SEPARATOR << resultsFileStem << "_mh" << (size_t) NewFileVw(b-1) << "_blck" << b << ".mat"; + mhFName = ssFName.str(); + drawmat = Mat_Open(mhFName.c_str(), MAT_ACC_RDONLY); + if (drawmat == NULL) + { + fline(b) = 1; + mexPrintf("Error in MH: Can not open old draws Mat file for reading: %s \n \ + Starting a new file instead! \n", mhFName.c_str()); + } + else + { + int start[2]={0,0},edge[2]={2,2},stride[2]={1,1}, err=0; + mexPrintf("MHMCMC: Using interim partial draws file %s \n", mhFName.c_str()); +// matvar = Mat_VarReadInfo(drawmat, "x2"); + matvar = Mat_VarReadInfo(drawmat, (char *)"x2"); + if (matvar == NULL) + { + fline(b) = 1; + mexPrintf("Error in MH: Can not read old draws Mat file for reading: %s \n \ + Starting a new file instead! \n", mhFName.c_str()); + } + else + { + // GetVariable(drawmat, "x2"); + dims[0] = matvar->dims[0]-1; + dims[1] = matvar->dims[1]-1; + err=Mat_VarReadData(drawmat,matvar,mxGetPr(mxMhParamDrawsPtr),start,stride,matvar->dims); + if (err) + { + fline(b) = 1; + mexPrintf("Error in MH: Can not retreive old draws from Mat file: %s \n \ + Starting a new file instead! \n", mhFName.c_str()); + } + Mat_VarFree(matvar); + } + //mxMhLogPostDensPtr = Mat_GetVariable(drawmat, "logpo2"); + matvar = Mat_VarReadInfo(drawmat, (char*)"logpo2"); + if (matvar == NULL) + { + fline(b) = 1; + mexPrintf("Error in MH: Can not read old logPos Mat file for reading: %s \n \ + Starting a new file instead! \n", mhFName.c_str()); + } + else + { + // GetVariable(drawmat, "x2"); + dims[0] = matvar->dims[0]-1; + dims[1] = matvar->dims[1]-1; + err=Mat_VarReadData(drawmat,matvar,mxGetPr(mxMhLogPostDensPtr),start,stride,matvar->dims); + if (err) + { + fline(b) = 1; + mexPrintf("Error in MH: Can not retreive old logPos from Mat file: %s \n \ + Starting a new file instead! \n", mhFName.c_str()); + } + Mat_VarFree(matvar); + } + Mat_Close(drawmat); + OpenOldFile[b] = 1; + } + } // end if + #endif - ssbarTitle.clear(); - ssbarTitle.str(""); - ssbarTitle << "Please wait... Metropolis-Hastings " << b << "/" << nBlocks << " ..."; - barTitle = ssbarTitle.str(); - waitBarRhs[2] = mxCreateString(barTitle.c_str()); - //strcpy( *mxGetPr(waitBarRhs[1]), mhFName.c_str()); - *mxGetPr(waitBarRhs[0]) = (double) 0.0; - mexCallMATLAB(0, NULL, 3, waitBarRhs, "waitbar"); - mxDestroyArray(waitBarRhs[2]); VectorView LastParametersRow = mat::get_row(LastParameters, b-1); @@ -229,26 +357,92 @@ sampleMHMC(LogPosteriorDensity &lpd, RandomWalkMetropolisHastings &rwmh, { if ((currInitSizeArray != (size_t) InitSizeArray(b-1)) && OpenOldFile[b] != 1) { - mexPrintf(" Init 2 Arrays\n"); // new or different size result arrays/matrices currInitSizeArray = (size_t) InitSizeArray(b-1); if (mxMhLogPostDensPtr) mxDestroyArray(mxMhLogPostDensPtr); // log post density array mxMhLogPostDensPtr = mxCreateDoubleMatrix(currInitSizeArray, 1, mxREAL); + if( mxMhLogPostDensPtr == NULL) + { + mexPrintf("Metropolis-Hastings mxMhLogPostDensPtr Initialisation failed!\n"); + return(-1); + } if (mxMhParamDrawsPtr) mxDestroyArray(mxMhParamDrawsPtr); // accepted MCMC MH draws mxMhParamDrawsPtr = mxCreateDoubleMatrix(currInitSizeArray, npar, mxREAL); + if( mxMhParamDrawsPtr == NULL) + { + mexPrintf("Metropolis-Hastings mxMhParamDrawsPtr Initialisation failed!\n"); + return(-1); + } } startParams = LastParametersRow; VectorView mhLogPostDens(mxGetPr(mxMhLogPostDensPtr), currInitSizeArray, (size_t) 1); MatrixView mhParamDraws(mxGetPr(mxMhParamDrawsPtr), currInitSizeArray, npar, currInitSizeArray); - jsux = rwmh.compute(mhLogPostDens, mhParamDraws, steadyState, startParams, deepParams, data, Q, H, + try + { + jsux = rwmh.compute(mhLogPostDens, mhParamDraws, steadyState, startParams, deepParams, data, Q, H, presampleStart, info, irun, currInitSizeArray, Jscale, lpd, drawDistribution, epd); - irun = currInitSizeArray; - sux += jsux*currInitSizeArray; - j += currInitSizeArray; //j=j+1; + irun = currInitSizeArray; + sux += jsux*currInitSizeArray; + j += currInitSizeArray; //j=j+1; + } + catch (const TSException &tse) + { + iret=-100; + mexPrintf(" TSException Exception in RandomWalkMH dynamic_dll: %s \n", (tse.getMessage()).c_str()); + goto cleanup; + } + catch (const DecisionRules::BlanchardKahnException &bke) + { + iret=-90; + mexPrintf(" Too many Blanchard-Kahn Exceptions in RandomWalkMH : n_fwrd_vars %d n_explosive_eigenvals %d \n", bke.n_fwrd_vars, bke.n_explosive_eigenvals); + goto cleanup; + } + catch (const GeneralizedSchurDecomposition::GSDException &gsde) + { + iret=-80; + mexPrintf(" GeneralizedSchurDecomposition Exception in RandomWalkMH: info %d, n %d \n", gsde.info, gsde.n); + goto cleanup; + } + catch (const LUSolver::LUException &lue) + { + iret=-70; + mexPrintf(" LU Exception in RandomWalkMH : info %d \n", lue.info); + goto cleanup; + } + catch (const VDVEigDecomposition::VDVEigException &vdve) + { + iret=-60; + mexPrintf(" VDV Eig Exception in RandomWalkMH : %s , info: %d\n", vdve.message.c_str(), vdve.info); + goto cleanup; + } + catch (const DiscLyapFast::DLPException &dlpe) + { + iret=-50; + mexPrintf(" Lyapunov solver Exception in RandomWalkMH : %s , info: %d\n", dlpe.message.c_str(), dlpe.info); + goto cleanup; + } + catch (const std::runtime_error &re) + { + iret=-3; + mexPrintf(" Runtime Error Exception in RandomWalkMH: %s \n", re.what()); + goto cleanup; + } + catch (const std::exception &e) + { + iret=-2; + mexPrintf(" Standard System Exception in RandomWalkMH: %s \n", e.what()); + goto cleanup; + } + catch (...) + { + iret=-1000; + mexPrintf(" Unknown unhandled Exception in RandomWalkMH! %s \n"); + goto cleanup; + } - // if exist('OCTAVE_VERSION') || +#if defined MATLAB_MEX_FILE if (console_mode) mexPrintf(" MH: Computing Metropolis-Hastings (chain %d/%d): %3.f \b%% done, acceptance rate: %3.f \b%%\r", b, nBlocks, 100 * j/nruns(b-1), 100 * sux / j); else @@ -265,12 +459,11 @@ sampleMHMC(LogPosteriorDensity &lpd, RandomWalkMetropolisHastings &rwmh, } -#ifdef MATLAB_MEX_FILE // % Now I save the simulations // save draw 2 mat file ([MhDirectoryName '/' ModelName '_mh' int2str(NewFile(b)) '_blck' int2str(b) '.mat'],'x2','logpo2'); ssFName.clear(); ssFName.str(""); - ssFName << resultsFileStem << DIRECTORY_SEPARATOR << "metropolis" << DIRECTORY_SEPARATOR << resultsFileStem << "_mh" << (size_t) NewFile(b-1) << "_blck" << b << ".mat"; + ssFName << resultsFileStem << DIRECTORY_SEPARATOR << "metropolis" << DIRECTORY_SEPARATOR << resultsFileStem << "_mh" << (size_t) NewFileVw(b-1) << "_blck" << b << ".mat"; mhFName = ssFName.str(); drawmat = matOpen(mhFName.c_str(), "w"); if (drawmat == 0) @@ -291,6 +484,43 @@ sampleMHMC(LogPosteriorDensity &lpd, RandomWalkMetropolisHastings &rwmh, exit(1); } matClose(drawmat); +#else + + printf(" MH: Computing Metropolis-Hastings (chain %d/%d): %3.f \b%% done, acceptance rate: %3.f \b%%\r", b, nBlocks, 100 * j/nruns(b-1), 100 * sux / j); + // % Now I save the simulations + // save draw 2 mat file ([MhDirectoryName '/' ModelName '_mh' int2str(NewFile(b)) '_blck' int2str(b) '.mat'],'x2','logpo2'); + ssFName.clear(); + ssFName.str(""); + ssFName << resultsFileStem << DIRECTORY_SEPARATOR << "metropolis" << DIRECTORY_SEPARATOR << resultsFileStem << "_mh" << (size_t) NewFileVw(b-1) << "_blck" << b << ".mat"; + mhFName = ssFName.str(); + + drawmat = Mat_Open(mhFName.c_str(), MAT_ACC_RDWR); + if (drawmat == 0) + { + mexPrintf("Error in MH: Can not open draws Mat file for writing: %s \n", mhFName.c_str()); + exit(1); + } + dims[0]= currInitSizeArray; + dims[1]= npar; + matvar = Mat_VarCreate("x2",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,mxGetPr(mxMhParamDrawsPtr),0); + matfStatus=Mat_VarWrite( drawmat, matvar, 0); + Mat_VarFree(matvar); + if (matfStatus) + { + mexPrintf("Error in MH: Can not use draws Mat file for writing: %s \n", mhFName.c_str()); + exit(1); + } + //matfStatus = matPutVariable(drawmat, "logpo2", mxMhLogPostDensPtr); + dims[1]= 1; + matvar = Mat_VarCreate("logpo2",MAT_C_DOUBLE,MAT_T_DOUBLE,2,dims,mxGetPr(mxMhLogPostDensPtr),0); + matfStatus=Mat_VarWrite( drawmat, matvar, 0); + Mat_VarFree(matvar); + if (matfStatus) + { + mexPrintf("Error in MH: Can not usee draws Mat file for writing: %s \n", mhFName.c_str()); + exit(1); + } + Mat_Close(drawmat); #endif // save log to fidlog = fopen([MhDirectoryName '/metropolis.log'],'a'); @@ -299,7 +529,7 @@ sampleMHMC(LogPosteriorDensity &lpd, RandomWalkMetropolisHastings &rwmh, mhFName = ssFName.str(); fidlog = fopen(mhFName.c_str(), "a"); fprintf(fidlog, "\n"); - fprintf(fidlog, "%% Mh%dBlck%d ( %s %s )\n", (int) NewFile(b-1), b, __DATE__, __TIME__); + fprintf(fidlog, "%% Mh%dBlck%d ( %s %s )\n", (int) NewFileVw(b-1), b, __DATE__, __TIME__); fprintf(fidlog, " \n"); fprintf(fidlog, " Number of simulations.: %d \n", currInitSizeArray); // (length(logpo2)) '); fprintf(fidlog, " Acceptation rate......: %f \n", jsux); @@ -326,45 +556,43 @@ sampleMHMC(LogPosteriorDensity &lpd, RandomWalkMetropolisHastings &rwmh, jsux = 0; LastParametersRow = mat::get_row(mhParamDraws, currInitSizeArray-1); //x2(end,:); LastLogLiK(b-1) = mhLogPostDens(currInitSizeArray-1); //logpo2(end); - InitSizeArray(b-1) = std::min((size_t) nruns(b-1)-j, MAX_nruns); + InitSizeArray(b-1) = std::min( (size_t) nruns(b-1)-j, MAX_nruns); // initialization of next file if necessary if (InitSizeArray(b-1)) { - NewFile(b-1) = NewFile(b-1) + 1; - irun = 0; + NewFileVw(b-1)++;// = NewFile(b-1) + 1; + irun = 1; } // end - irun++; + //irun++; } // end while % End of the simulations for one mh-block. //record. AcceptationRates(b-1) = sux/j; OpenOldFile[b] = 0; } // end % End of the loop over the mh-blocks. - mexPrintf(" put Var record.AcceptationRates \n"); - if (mexPutVariable("caller", "record.AcceptationRates", AcceptationRatesPtr)) - mexPrintf("MH Warning: due to error record.AcceptationRates is NOT set !! \n"); - //else mexPrintf(" record.AcceptationRates is now set !! \n"); - if (mexPutVariable("caller", "record.LastParameters", mxLastParametersPtr)) - mexPrintf("MH Warning: due to error record.MhParamDraw is NOT set !! \n"); + if (mexPutVariable("caller", "record_AcceptationRates", AcceptationRatesPtr)) + mexPrintf("MH Warning: due to error record_AcceptationRates is NOT set !! \n"); - if (mexPutVariable("caller", "record.LastLogLiK", mxLastLogLikPtr)) - mexPrintf("MH Warning: due to error record.LastLogLiK is NOT set !! \n"); + if (mexPutVariable("caller", "record_LastParameters", mxLastParametersPtr)) + mexPrintf("MH Warning: due to error record_MhParamDraw is NOT set !! \n"); - if (mexPutVariable("caller", "record.LastLogLiK2", mxLastLogLikPtr)) - mexPrintf("MH Warning: due to error record.LastLogLiK is NOT set !! \n"); - if (mexPutVariable("caller", "LastLogLiK3", mxLastLogLikPtr)) - mexPrintf("MH Warning: due to error record.LastLogLiK is NOT set !! \n"); + if (mexPutVariable("caller", "record_LastLogLiK", mxLastLogLikPtr)) + mexPrintf("MH Warning: due to error record_LastLogLiK is NOT set !! \n"); - NewFileVw = NewFile; + //NewFileVw = NewFile; if (mexPutVariable("caller", "NewFile", NewFileArrayPtr)) mexPrintf("MH Warning: due to error NewFile is NOT set !! \n"); // Cleanup +mexPrintf("MH Cleanup !! \n"); + +cleanup: if (mxMhLogPostDensPtr) mxDestroyArray(mxMhLogPostDensPtr); // delete log post density array if (mxMhParamDrawsPtr) mxDestroyArray(mxMhParamDrawsPtr); // delete accepted MCMC MH draws +#ifdef MATLAB_MEX_FILE // Waitbar if (console_mode==0) { @@ -372,17 +600,20 @@ sampleMHMC(LogPosteriorDensity &lpd, RandomWalkMetropolisHastings &rwmh, // now left commented out and the waitbar neeeds to be closed manually // alternativelly, call with options_.console_mode=1; //mexCallMATLAB(0, NULL, 1, waitBarLhs, "close"); - mxDestroyArray(waitBarLhs[0]); + //mxDestroyArray(waitBarLhs[0]); mxDestroyArray(waitBarRhs[1]); mxDestroyArray(waitBarRhs[0]); } +#endif - // return last line run in the last MH block sub-array - return irun; + // return error code or last line run in the last MH block sub-array + if (iret==0) + iret=(int)irun; + return iret; } -size_t +int logMCMCposterior(const VectorConstView &estParams, const MatrixConstView &data, const std::string &mexext, const size_t fblock, const size_t nBlocks, const VectorConstView &nMHruns, const MatrixConstView &D) { @@ -494,7 +725,7 @@ logMCMCposterior(const VectorConstView &estParams, const MatrixConstView &data, blas::gemm("N", "N", 1.0, D, Jscale, 0.0, Dscale); //sample MHMCMC draws and get get last line run in the last MH block sub-array - size_t lastMHblockArrayLine = sampleMHMC(lpd, rwmh, steadyState, estParams2, deepParams, data, Q, H, presample, info, + int lastMHblockArrayLine = sampleMHMC(lpd, rwmh, steadyState, estParams2, deepParams, data, Q, H, presample, info, nMHruns, fblock, nBlocks, Dscale, drawGaussDist01, epd, resultsFileStem, console_mode, load_mh_file); // Cleanups @@ -541,7 +772,7 @@ mexFunction(int nlhs, mxArray *plhs[], MatrixConstView D(mxGetPr(prhs[6]), mxGetM(prhs[6]), mxGetN(prhs[6]), mxGetM(prhs[6])); //calculate MHMCMC draws and get get last line run in the last MH block sub-array - size_t lastMHblockArrayLine = logMCMCposterior(estParams, data, mexext, fblock, nBlocks, nMHruns, D); + int lastMHblockArrayLine = logMCMCposterior(estParams, data, mexext, fblock, nBlocks, nMHruns, D); *mxGetPr(plhs[0]) = (double) lastMHblockArrayLine; } diff --git a/mex/sources/estimation/tests/random_walk_metropolis_hastings_core.m b/mex/sources/estimation/tests/random_walk_metropolis_hastings_core.m new file mode 100644 index 0000000000000000000000000000000000000000..a899f56eab9d62d8c74b01c4e563b575f18dc96b --- /dev/null +++ b/mex/sources/estimation/tests/random_walk_metropolis_hastings_core.m @@ -0,0 +1,308 @@ +function myoutput = random_walk_metropolis_hastings_core(myinputs,fblck,nblck,whoiam, ThisMatlab) +% PARALLEL CONTEXT +% This function contain the most computationally intensive portion of code in +% random_walk_metropolis_hastings (the 'for xxx = fblck:nblck' loop). The branches in 'for' +% cycle and are completely independent than suitable to be executed in parallel way. +% +% INPUTS +% o myimput [struc] The mandatory variables for local/remote +% parallel computing obtained from random_walk_metropolis_hastings.m +% function. +% o fblck and nblck [integer] The Metropolis-Hastings chains. +% o whoiam [integer] In concurrent programming a modality to refer to the differents thread running in parallel is needed. +% The integer whoaim is the integer that +% allows us to distinguish between them. Then it is the index number of this CPU among all CPUs in the +% cluster. +% o ThisMatlab [integer] Allows us to distinguish between the +% 'main' matlab, the slave matlab worker, local matlab, remote matlab, +% ... Then it is the index number of this slave machine in the cluster. +% OUTPUTS +% o myoutput [struc] +% If executed without parallel is the original output of 'for b = +% fblck:nblck' otherwise a portion of it computed on a specific core or +% remote machine. In this case: +% record; +% irun; +% NewFile; +% OutputFileName +% +% ALGORITHM +% Portion of Metropolis-Hastings. +% +% SPECIAL REQUIREMENTS. +% None. + +% PARALLEL CONTEXT +% The most computationally intensive part of this function may be executed +% in parallel. The code sutable to be executed in parallel on multi core or cluster machine, +% is removed from this function and placed in random_walk_metropolis_hastings_core.m funtion. +% Then the DYNARE parallel package contain a set of pairs matlab functios that can be executed in +% parallel and called name_function.m and name_function_core.m. +% In addition in the parallel package we have second set of functions used +% to manage the parallel computation. +% +% This function was the first function to be parallelized, later other +% functions have been parallelized using the same methodology. +% Then the comments write here can be used for all the other pairs of +% parallel functions and also for management funtions. + + +% Copyright (C) 2006-2008,2010 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 <http://www.gnu.org/licenses/>. + +if nargin<4, + whoiam=0; +end + + +global bayestopt_ estim_params_ options_ M_ oo_ + +% reshape 'myinputs' for local computation. +% In order to avoid confusion in the name space, the instruction struct2local(myinputs) is replaced by: + +TargetFun=myinputs.TargetFun; +ProposalFun=myinputs.ProposalFun; +xparam1=myinputs.xparam1; +vv=myinputs.vv; +mh_bounds=myinputs.mh_bounds; +ix2=myinputs.ix2; +ilogpo2=myinputs.ilogpo2; +ModelName=myinputs.ModelName; +fline=myinputs.fline; +npar=myinputs.npar; +nruns=myinputs.nruns; +NewFile=myinputs.NewFile; +MAX_nruns=myinputs.MAX_nruns; +d=myinputs.d; +InitSizeArray=myinputs.InitSizeArray; +record=myinputs.record; +varargin=myinputs.varargin; + +% Necessary only for remote computing! +if whoiam + Parallel=myinputs.Parallel; + MasterName=myinputs.MasterName; + DyMo=myinputs.DyMo; + % initialize persistent variables in priordens() + priordens(xparam1,bayestopt_.pshape,bayestopt_.p6,bayestopt_.p7, ... + bayestopt_.p3,bayestopt_.p4,1); +end + +% (re)Set the penalty +bayestopt_.penalty = Inf; + +MhDirectoryName = CheckPath('metropolis'); + +options_.lik_algo = 1; +OpenOldFile = ones(nblck,1); +if strcmpi(ProposalFun,'rand_multivariate_normal') + n = npar; +elseif strcmpi(ProposalFun,'rand_multivariate_student') + n = options_.student_degrees_of_freedom; +end +% load([MhDirectoryName '/' ModelName '_mh_history.mat'],'record'); +%%%% +%%%% NOW i run the (nblck-fblck+1) metropolis-hastings chains +%%%% +jscale = diag(bayestopt_.jscale); + +jloop=0; +if options_.use_dll==1 + +%%%TEST%%% +oldoptions_console_mode=options_.console_mode; +%options_.console_mode=1; + + if exist('OCTAVE_VERSION') + oldoptions_console_mode=options_.console_mode; + options_.console_mode=1; + end + for b = fblck:nblck, + record.Seeds(b).Normal = randn('state'); + record.Seeds(b).Unifor = rand('state'); + end + % calculate draws and get last line run in the last MH block sub-array + irun = logMHMCMCposterior( xparam1, varargin{2}, mexext, fblck, nblck, nruns, d) + if irun<0 + error('Error in logMHMCMCposterior'); + end + for b = fblck:nblck, + record.Seeds(b).Normal = randn('state'); + record.Seeds(b).Unifor = rand('state'); + OutputFileName(b,:) = {[MhDirectoryName,filesep], [ModelName '_mh*_blck' int2str(b) '.mat']}; + end + + if exist('OCTAVE_VERSION') + options_.console_mode=oldoptions_console_mode; + options_.console_mode=1; + end + record.AcceptationRates=record_AcceptationRates; + record.LastLogLiK=record_LastLogLiK; + record.LastParameters=record_LastParameters; + options_.console_mode=oldoptions_console_mode; +else + for b = fblck:nblck, + jloop=jloop+1; + randn('state',record.Seeds(b).Normal); + rand('state',record.Seeds(b).Unifor); + if (options_.load_mh_file~=0) & (fline(b)>1) & OpenOldFile(b) + load(['./' MhDirectoryName '/' ModelName '_mh' int2str(NewFile(b)) ... + '_blck' int2str(b) '.mat']) + x2 = [x2;zeros(InitSizeArray(b)-fline(b)+1,npar)]; + logpo2 = [logpo2;zeros(InitSizeArray(b)-fline(b)+1,1)]; + OpenOldFile(b) = 0; + else + x2 = zeros(InitSizeArray(b),npar); + logpo2 = zeros(InitSizeArray(b),1); + end + if exist('OCTAVE_VERSION') || options_.console_mode + diary off + disp(' ') + elseif whoiam + % keyboard; + waitbarString = ['Please wait... Metropolis-Hastings (' int2str(b) '/' int2str(options_.mh_nblck) ')...']; + % waitbarTitle=['Metropolis-Hastings ',options_.parallel(ThisMatlab).PcName]; + if options_.parallel(ThisMatlab).Local, + waitbarTitle=['Local ']; + else + waitbarTitle=[options_.parallel(ThisMatlab).PcName]; + end + fMessageStatus(0,whoiam,waitbarString, waitbarTitle, options_.parallel(ThisMatlab), MasterName, DyMo); + else, + hh = waitbar(0,['Please wait... Metropolis-Hastings (' int2str(b) '/' int2str(options_.mh_nblck) ')...']); + set(hh,'Name','Metropolis-Hastings'); + + end + isux = 0; + jsux = 0; + irun = fline(b); + j = 1; + load urand_1_1.csv + load paramdraws_1_1.csv + while j <= nruns(b) + par = feval(ProposalFun, ix2(b,:), d * jscale, n); + par=paramdraws_1_1(j,:); + if all( par(:) > mh_bounds(:,1) ) & all( par(:) < mh_bounds(:,2) ) + try + logpost = - feval(TargetFun, par(:),varargin{:}); + catch + logpost = -inf; + end + else + logpost = -inf; + end + lurand=log(urand_1_1(j)); +% if (logpost > -inf) && (log(rand) < logpost-ilogpo2(b)) + if (logpost > -inf) && (lurand < logpost-ilogpo2(b)) + x2(irun,:) = par; + ix2(b,:) = par; + logpo2(irun) = logpost; + ilogpo2(b) = logpost; + isux = isux + 1; + jsux = jsux + 1; + else + x2(irun,:) = ix2(b,:); + logpo2(irun) = ilogpo2(b); + end + prtfrc = j/nruns(b); + if exist('OCTAVE_VERSION') || options_.console_mode + if mod(j, 10) == 0 + if exist('OCTAVE_VERSION') + printf('MH: Computing Metropolis-Hastings (chain %d/%d): %3.f%% done, acception rate: %3.f%%\r', b, nblck, 100 * prtfrc, 100 * isux / j); + else + fprintf(' MH: Computing Metropolis-Hastings (chain %d/%d): %3.f \b%% done, acceptance rate: %3.f \b%%\r', b, nblck, 100 * prtfrc, 100 * isux / j); + end + end + if mod(j,50)==0 & whoiam + % keyboard; + waitbarString = [ '(' int2str(b) '/' int2str(options_.mh_nblck) '), ' sprintf('accept. %3.f%%%%', 100 * isux/j)]; + fMessageStatus(prtfrc,whoiam,waitbarString, '', options_.parallel(ThisMatlab), MasterName, DyMo) + end + else + if mod(j, 3)==0 & ~whoiam + waitbar(prtfrc,hh,[ '(' int2str(b) '/' int2str(options_.mh_nblck) ') ' sprintf('%f done, acceptation rate %f',prtfrc,isux/j)]); + elseif mod(j,50)==0 & whoiam, + % keyboard; + waitbarString = [ '(' int2str(b) '/' int2str(options_.mh_nblck) ') ' sprintf('%f done, acceptation rate %f',prtfrc,isux/j)]; + fMessageStatus(prtfrc,whoiam,waitbarString, waitbarTitle, options_.parallel(ThisMatlab), MasterName, DyMo) + end + end + + if (irun == InitSizeArray(b)) | (j == nruns(b)) % Now I save the simulations + save([MhDirectoryName '/' ModelName '_mh' int2str(NewFile(b)) '_blck' int2str(b) '.mat'],'x2','logpo2'); + fidlog = fopen([MhDirectoryName '/metropolis.log'],'a'); + fprintf(fidlog,['\n']); + fprintf(fidlog,['%% Mh' int2str(NewFile(b)) 'Blck' int2str(b) ' (' datestr(now,0) ')\n']); + fprintf(fidlog,' \n'); + fprintf(fidlog,[' Number of simulations.: ' int2str(length(logpo2)) '\n']); + fprintf(fidlog,[' Acceptation rate......: ' num2str(jsux/length(logpo2)) '\n']); + fprintf(fidlog,[' Posterior mean........:\n']); + for i=1:length(x2(1,:)) + fprintf(fidlog,[' params:' int2str(i) ': ' num2str(mean(x2(:,i))) '\n']); + end + fprintf(fidlog,[' log2po:' num2str(mean(logpo2)) '\n']); + fprintf(fidlog,[' Minimum value.........:\n']);; + for i=1:length(x2(1,:)) + fprintf(fidlog,[' params:' int2str(i) ': ' num2str(min(x2(:,i))) '\n']); + end + fprintf(fidlog,[' log2po:' num2str(min(logpo2)) '\n']); + fprintf(fidlog,[' Maximum value.........:\n']); + for i=1:length(x2(1,:)) + fprintf(fidlog,[' params:' int2str(i) ': ' num2str(max(x2(:,i))) '\n']); + end + fprintf(fidlog,[' log2po:' num2str(max(logpo2)) '\n']); + fprintf(fidlog,' \n'); + fclose(fidlog); + jsux = 0; + if j == nruns(b) % I record the last draw... + record.LastParameters(b,:) = x2(end,:); + record.LastLogLiK(b) = logpo2(end); + end + % size of next file in chain b + InitSizeArray(b) = min(nruns(b)-j,MAX_nruns); + % initialization of next file if necessary + if InitSizeArray(b) + x2 = zeros(InitSizeArray(b),npar); + logpo2 = zeros(InitSizeArray(b),1); + NewFile(b) = NewFile(b) + 1; + irun = 0; + end + end + j=j+1; + irun = irun + 1; + end% End of the simulations for one mh-block. + record.AcceptationRates(b) = isux/j; + if exist('OCTAVE_VERSION') || options_.console_mode + if exist('OCTAVE_VERSION') + printf('\n'); + else + fprintf('\n'); + end + diary on; + elseif ~whoiam + close(hh); + end + record.Seeds(b).Normal = randn('state'); + record.Seeds(b).Unifor = rand('state'); + OutputFileName(jloop,:) = {[MhDirectoryName,filesep], [ModelName '_mh*_blck' int2str(b) '.mat']}; + end% End of the loop over the mh-blocks. +end % if use_dll + +myoutput.record = record; +myoutput.irun = irun; +myoutput.NewFile = NewFile; +myoutput.OutputFileName = OutputFileName;