diff --git a/matlab/mr_gstep.m b/matlab/mr_gstep.m index 06e6965ae48ddc4552b6e060ea408051edbc5075..ce6448fbebe899002b79bcdb20b59445e9f4cb01 100644 --- a/matlab/mr_gstep.m +++ b/matlab/mr_gstep.m @@ -1,5 +1,5 @@ -function [f0, x, ig] = mr_gstep(func0,x,htol0,varargin) -% function [f0, x] = mr_gstep(func0,x,htol0,varargin) +function [f0, x, ig] = mr_gstep(init,x,func0,htol0,varargin) +% function [f0, x] = mr_gstep(init,x,func0,htol0,varargin) % % Gibbs type step in optimisation @@ -23,21 +23,22 @@ function [f0, x, ig] = mr_gstep(func0,x,htol0,varargin) global bayestopt_ options_ persistent h1 -gstep_ = options_.gstep; -if nargin<3, +n=size(x,1); + +if init, + gstep_ = options_.gstep; + h1=max(abs(x),sqrt(gstep_)*ones(n,1))*eps^(1/4); + return +end +if nargin<4, htol = 1.e-6; else htol = htol0; end func = str2func(func0); f0=feval(func,x,varargin{:}); -n=size(x,1); h2=bayestopt_.ub-bayestopt_.lb; -if isempty(h1), - h1=max(abs(x),sqrt(gstep_)*ones(n,1))*eps^(1/4); -end - xh1=x; f1=zeros(size(f0,1),n); f_1=f1; diff --git a/matlab/mr_hessian.m b/matlab/mr_hessian.m index 18e9f6fd8c26cc1d84785d91a88acc3988e54154..efa5490c050eb8af3448e6e0f615e9624182915e 100644 --- a/matlab/mr_hessian.m +++ b/matlab/mr_hessian.m @@ -1,5 +1,5 @@ -function [hessian_mat, gg, htol1, ihh, hh_mat0] = mr_hessian(func,x,hflag,htol0,varargin) -% [hessian_mat, gg, htol1, ihh, hh_mat0] = mr_hessian(func,x,hflag,htol0,varargin) +function [hessian_mat, gg, htol1, ihh, hh_mat0] = mr_hessian(init,x,func,hflag,htol0,varargin) +% [hessian_mat, gg, htol1, ihh, hh_mat0] = mr_hessian(init,x,func,hflag,htol0,varargin) % % numerical gradient and Hessian, with 'automatic' check of numerical % error @@ -44,19 +44,20 @@ function [hessian_mat, gg, htol1, ihh, hh_mat0] = mr_hessian(func,x,hflag,htol0, global options_ bayestopt_ persistent h1 htol -gstep_=options_.gstep; -if isempty(htol), htol = 1.e-4; end -func = str2func(func); -[f0, ff0]=feval(func,x,varargin{:}); n=size(x,1); -h2=bayestopt_.ub-bayestopt_.lb; -hmax=bayestopt_.ub-x; -hmax=min(hmax,x-bayestopt_.lb); +if init, + gstep_=options_.gstep; + htol = 1.e-4; %h1=max(abs(x),gstep_*ones(n,1))*eps^(1/3); %h1=max(abs(x),sqrt(gstep_)*ones(n,1))*eps^(1/6); -if isempty(h1), h1=max(abs(x),sqrt(gstep_)*ones(n,1))*eps^(1/4); + return, end +func = str2func(func); +[f0, ff0]=feval(func,x,varargin{:}); +h2=bayestopt_.ub-bayestopt_.lb; +hmax=bayestopt_.ub-x; +hmax=min(hmax,x-bayestopt_.lb); h1 = min(h1,0.5.*hmax); diff --git a/matlab/newrat.m b/matlab/newrat.m index 3a256e279d8d9b4840f1b4ef5d757bb256c5e59c..0e11f12e4d6e823b44b77f053bded1dbd58019f4 100644 --- a/matlab/newrat.m +++ b/matlab/newrat.m @@ -59,8 +59,12 @@ func_hh = [func0,'_hh']; func = str2func(func0); fval0=feval(func,x,varargin{:}); fval=fval0; +% initialize mr_gstep and mr_hessian +mr_gstep(1,x); +mr_hessian(1,x); + if isempty(hh) - [dum, gg, htol0, igg, hhg]=mr_hessian(func_hh,x,flagit,htol,varargin{:}); + [dum, gg, htol0, igg, hhg]=mr_hessian(0,x,func_hh,flagit,htol,varargin{:}); hh0 = reshape(dum,nx,nx); hh=hhg; if min(eig(hh0))<0, @@ -121,7 +125,7 @@ while norm(gg)>gtol & check==0 & jit<nit, iggx(find(ig),find(ig)) = inv( hhx(find(ig),find(ig)) ); [fvala x0 fc retcode] = csminit(func0,x0,fval,ggx,0,iggx,varargin{:}); end - [fvala, x0, ig] = mr_gstep(func0,x0,htol,varargin{:}); + [fvala, x0, ig] = mr_gstep(0,x0,func0,htol,varargin{:}); nig=[nig ig]; if (fval-fvala)<gibbstol*(fval0(icount)-fval), igibbs=0; @@ -162,7 +166,7 @@ while norm(gg)>gtol & check==0 & jit<nit, if flagit==2, hh=hh0; elseif flagg>0, - [dum, gg, htol0, igg, hhg]=mr_hessian(func_hh,xparam1,flagg,ftol0,varargin{:}); + [dum, gg, htol0, igg, hhg]=mr_hessian(0,xparam1,func_hh,flagg,ftol0,varargin{:}); if flagg==2, hh = reshape(dum,nx,nx); ee=eig(hh); @@ -202,7 +206,7 @@ while norm(gg)>gtol & check==0 & jit<nit, catch save m1 x fval0 nig end - [dum, gg, htol0, igg, hhg]=mr_hessian(func_hh,xparam1,flagit,htol,varargin{:}); + [dum, gg, htol0, igg, hhg]=mr_hessian(0,xparam1,func_hh,flagit,htol,varargin{:}); if htol0>htol, %ftol, %ftol=htol0; htol=htol0;