trap possible issues in slice iterations and save info file on progress

time-shift
Marco Ratto 2019-12-17 23:24:48 +01:00
parent 432faa3fae
commit a6e3e7256a
1 changed files with 75 additions and 1 deletions

View File

@ -55,7 +55,12 @@ npar = length(theta);
W1 = sampler_options.W1;
neval = zeros(npar,1);
for it=1:npar
% % % fname0=fname;
fname = [ int2str(sampler_options.curr_block)];
it=0;
while it<npar
it=it+1;
neval(it) = 0;
W = W1(it);
xold = theta(it);
@ -70,6 +75,24 @@ for it=1:npar
% THIS DEFINES THE SLICE S={x: z < ln(f(x))}
% -------------------------------------------------------
fxold = -feval(objective_function,theta,varargin{:});
if ~isfinite(fxold)
disp(['slice_sampler:: Iteration ' int2str(it) ' started with bad parameter set (fval is inf or nan)'])
icount=0;
while ~isfinite(fxold) && icount<1000
icount=icount+1;
theta = prior_draw();
if all(theta(:) >= thetaprior(:,1)) && all(theta(:) <= thetaprior(:,2))
fxold = -feval(objective_function,theta,varargin{:});
end
end
% restart from 1
it = 1;
neval(it) = 0;
W = W1(it);
xold = theta(it);
XLB = thetaprior(it,1);
XUB = thetaprior(it,2);
end
neval(it) = neval(it) + 1;
Z = fxold + log(rand(1,1));
% -------------------------------------------------------------
@ -79,6 +102,7 @@ for it=1:npar
u = rand(1,1);
L = max(XLB,xold-W*u);
R = min(XUB,L+W);
mytxt{it,1} = '';
while(L > XLB)
xsim = L;
theta(it) = xsim;
@ -88,7 +112,26 @@ for it=1:npar
break
end
L = max(XLB,L-W);
if neval(it)>30
L=XLB;
xsim = L;
theta(it) = xsim;
fxl = -feval(objective_function,theta,varargin{:});
icount = 0;
while (isinf(fxl) || isnan(fxl)) && icount<300
icount = icount+1;
L=L+sqrt(eps);
xsim = L;
theta(it) = xsim;
fxl = -feval(objective_function,theta,varargin{:});
end
mytxt{it,1} = sprintf('Getting L for [%s] is taking too long.', varargin{6}.name{it});
save(['slice_iter_info_' fname],'mytxt','neval','it','theta','fxl')
%keyboard;
end
end
neval1 = neval(it);
mytxt{it,2} = '';
while(R < XUB)
xsim = R;
theta(it) = xsim;
@ -98,11 +141,30 @@ for it=1:npar
break
end
R = min(XUB,R+W);
if neval(it)>(neval1+30)
R=XUB;
xsim = R;
theta(it) = xsim;
fxr = -feval(objective_function,theta,varargin{:});
icount = 0;
while (isinf(fxr) || isnan(fxr)) && icount<300
icount = icount+1;
R=R-sqrt(eps);
xsim = R;
theta(it) = xsim;
fxr = -feval(objective_function,theta,varargin{:});
end
mytxt{it,2} = sprintf('Getting R for [%s] is taking too long.', varargin{6}.name{it});
save(['slice_iter_info_' fname],'mytxt','neval','it','theta','fxr')
%keyboard;
end
end
neval2 = neval(it);
% ------------------------------------------------------
% 3. SAMPLING FROM THE SET A = (I INTERSECT S) = (LA,RA)
% ------------------------------------------------------
fxsim = Z-1;
mytxt{it,3} = '';
while (fxsim < Z)
u = rand(1,1);
xsim = L + u*(R - L);
@ -114,8 +176,20 @@ for it=1:npar
else
L = xsim;
end
if (R-L)<1.e-6 %neval(it)>(30+neval2)
disp(sprintf('The sampling for variable [%s] is taking too long as the sampling set is too tight. Check the prior.', varargin{6}.name{it}))
mytxt{it,3} = sprintf('Sampling [%s] is taking too long.', varargin{6}.name{it});
save(['slice_iter_info_' fname],'mytxt','neval','it')
break
end
end
save(['slice_iter_info_' fname],'mytxt','neval','it','theta','fxsim')
if isinf(fxsim) || isnan(fxsim)
theta(it) = xold;
fxsim = fxold;
disp('SLICE: posterior density is infinite. Reset values at initial ones.')
end
end
if sampler_options.rotated && ~isempty(sampler_options.mode) % jumping