From 2476ffdbb9662df81281f81c044dcb04694ec216 Mon Sep 17 00:00:00 2001 From: Johannes Pfeifer Date: Tue, 11 Aug 2015 14:37:37 +0200 Subject: [PATCH] Add indicator for successful run of MCMC and provide error message if load_mh_file is used with crashed chain Closes #917 --- matlab/load_last_mh_history_file.m | 21 ++++++++++++++++++--- matlab/metropolis_hastings_initialization.m | 5 +++++ matlab/random_walk_metropolis_hastings.m | 2 ++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/matlab/load_last_mh_history_file.m b/matlab/load_last_mh_history_file.m index 1455861ea..3e54f9853 100644 --- a/matlab/load_last_mh_history_file.m +++ b/matlab/load_last_mh_history_file.m @@ -1,5 +1,15 @@ function info = load_last_mh_history_file(MetropolisFolder, ModelName) - +% function info = load_last_mh_history_file(MetropolisFolder, ModelName) +% Loads the last mh_history_file +% Inputs: +% MetropolisFolder [char] Name of the metropolis subfolder +% ModelName [char] Name of the mod-file +% Outputs: +% info [struct] structure storing the MH history +% +% Notes: The record structure is written to the caller workspace via an +% assignin statement. + % Copyright (C) 2013 Dynare Team % % This file is part of Dynare. @@ -27,7 +37,7 @@ mh_history_files = dir([BaseName '_mh_history_*.mat']); % Consistency with older versions of Dynare. if isequal(length(mh_history_files),0) if exist([BaseName '_mh_history.mat']) - format_mh_history_file = 1; + format_mh_history_file = 1; % old Dynare format else error(['Estimation::load_mh_file: I cannot find any mh-history file in ' MetropolisFolder '!']) end @@ -35,13 +45,14 @@ else format_mh_history_file = 0; end -if format_mh_history_file +if format_mh_history_file %needed to preserve backward compatibility load([BaseName '_mh_history.mat']); record.LastLogPost = record.LastLogLiK; record.InitialLogPost = record.InitialLogLiK; record.LastSeeds = record.Seeds; record.AcceptanceRatio = record.AcceptationRates; record.InitialSeeds = NaN; % This information is forever lost... + record.MCMCConcludedSuccessfully = NaN; % This information is forever lost... record = rmfield(record,'LastLogLiK'); record = rmfield(record,'InitialLogLiK'); record = rmfield(record,'Seeds'); @@ -49,6 +60,10 @@ if format_mh_history_file save([BaseName '_mh_history_0.mat'],'record'); else load([BaseName '_mh_history_' num2str(length(mh_history_files)-1) '.mat']); + % add fields that have later been introduced + if ~isfield(record,'MCMCConcludedSuccessfully') + record.MCMCConcludedSuccessfully = NaN; % This information is forever lost... + end end if isequal(nargout,0) diff --git a/matlab/metropolis_hastings_initialization.m b/matlab/metropolis_hastings_initialization.m index 4650830e5..c8e04f3bd 100644 --- a/matlab/metropolis_hastings_initialization.m +++ b/matlab/metropolis_hastings_initialization.m @@ -210,6 +210,7 @@ if ~options_.load_mh_file && ~options_.mh_recover record.LastLogPost = zeros(nblck,1); record.LastFileNumber = AnticipatedNumberOfFiles ; record.LastLineNumber = AnticipatedNumberOfLinesInTheLastFile; + record.MCMCConcludedSuccessfully = 0; fprintf('Ok!\n'); id = write_mh_history_file(MetropolisFolder, ModelName, record); disp(['Estimation::mcmc: Details about the MCMC are available in ' BaseName '_mh_history_' num2str(id) '.mat']) @@ -234,6 +235,10 @@ elseif options_.load_mh_file && ~options_.mh_recover % Here we consider previous mh files (previous mh did not crash). disp('Estimation::mcmc: I am loading past Metropolis-Hastings simulations...') load_last_mh_history_file(MetropolisFolder, ModelName); + if ~isnan(record.MCMCConcludedSuccessfully) && ~record.MCMCConcludedSuccessfully + error('Estimation::mcmc: You are trying to load an MCMC that did not finish successfully. Please use mh_recover.') + end + record.MCMCConcludedSuccessfully=0; %reset indicator for this run mh_files = dir([ MetropolisFolder filesep ModelName '_mh*.mat']); if ~length(mh_files) error('Estimation::mcmc: I cannot find any MH file to load here!') diff --git a/matlab/random_walk_metropolis_hastings.m b/matlab/random_walk_metropolis_hastings.m index c5ff16c03..8f18d1d0f 100644 --- a/matlab/random_walk_metropolis_hastings.m +++ b/matlab/random_walk_metropolis_hastings.m @@ -163,6 +163,8 @@ end irun = fout(1).irun; NewFile = fout(1).NewFile; +record.MCMCConcludedSuccessfully = 1; %set indicator for successful run + update_last_mh_history_file(MetropolisFolder, ModelName, record); % Provide diagnostic output