0001 function [fh,xh,gh,H,itct,fcount,retcodeh] = csminwel1(fcn,x0,H0,grad,crit,nit,method,epsilon,varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043 global bayestopt_
0044
0045 fh = [];
0046 xh = [];
0047 [nx,no]=size(x0);
0048 nx=max(nx,no);
0049 Verbose=1;
0050 NumGrad= isempty(grad);
0051 done=0;
0052 itct=0;
0053 fcount=0;
0054 snit=100;
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066 [f0,junk1,junk2,cost_flag] = feval(fcn,x0,varargin{:});
0067
0068 if ~cost_flag
0069 disp('Bad initial parameter.')
0070 return
0071 end
0072
0073 if NumGrad
0074 switch method
0075 case 2
0076 [g,badg] = numgrad2(fcn, f0, x0, epsilon, varargin{:});
0077 case 3
0078 [g,badg] = numgrad3(fcn, f0, x0, epsilon, varargin{:});
0079 case 5
0080 [g,badg] = numgrad5(fcn, f0, x0, epsilon, varargin{:});
0081 end
0082 elseif ischar(grad)
0083 [g,badg] = feval(grad,x0,varargin{:});
0084 else
0085 g=junk1;
0086 badg=0;
0087 end
0088 retcode3=101;
0089 x=x0;
0090 f=f0;
0091 H=H0;
0092 cliff=0;
0093 while ~done
0094 bayestopt_.penalty = f;
0095 g1=[]; g2=[]; g3=[];
0096
0097 disp('-----------------')
0098 disp('-----------------')
0099
0100 disp(sprintf('f at the beginning of new iteration, %20.10f',f))
0101
0102
0103
0104 itct=itct+1;
0105 [f1 x1 fc retcode1] = csminit1(fcn,x,f,g,badg,H,varargin{:});
0106
0107
0108
0109
0110 fcount = fcount+fc;
0111
0112
0113
0114
0115
0116
0117
0118
0119 if retcode1 ~= 1
0120 if retcode1==2 || retcode1==4
0121 wall1=1; badg1=1;
0122 else
0123 if NumGrad
0124 switch method
0125 case 2
0126 [g1 badg1] = numgrad2(fcn, f1, x1, epsilon, varargin{:});
0127 case 3
0128 [g1 badg1] = numgrad3(fcn, f1, x1, epsilon, varargin{:});
0129 case 5
0130 [g1,badg1] = numgrad5(fcn, f1, x1, epsilon, varargin{:});
0131 end
0132 elseif ischar(grad),
0133 [g1 badg1] = feval(grad,x1,varargin{:});
0134 else
0135 [junk1,g1,junk2, cost_flag] = feval(fcn,x1,varargin{:});
0136 badg1 = ~cost_flag;
0137 end
0138 wall1=badg1;
0139
0140 save g1.mat g1 x1 f1 varargin;
0141
0142
0143 end
0144 if wall1
0145
0146
0147
0148
0149 Hcliff=H+diag(diag(H).*rand(nx,1));
0150 disp('Cliff. Perturbing search direction.')
0151 [f2 x2 fc retcode2] = csminit1(fcn,x,f,g,badg,Hcliff,varargin{:});
0152
0153
0154
0155 fcount = fcount+fc;
0156 if f2 < f
0157 if retcode2==2 || retcode2==4
0158 wall2=1; badg2=1;
0159 else
0160 if NumGrad
0161 switch method
0162 case 2
0163 [g2 badg2] = numgrad2(fcn, f2, x2, epsilon, varargin{:});
0164 case 3
0165 [g2 badg2] = numgrad3(fcn, f2, x2, epsilon, varargin{:});
0166 case 5
0167 [g2,badg2] = numgrad5(fcn, f2, x2, epsilon, varargin{:});
0168 end
0169 elseif ischar(grad),
0170 [g2 badg2] = feval(grad,x2,varargin{:});
0171 else
0172 [junk1,g2,junk2, cost_flag] = feval(fcn,x1,varargin{:});
0173 badg2 = ~cost_flag;
0174 end
0175 wall2=badg2;
0176
0177 badg2
0178 save g2.mat g2 x2 f2 varargin
0179
0180
0181 end
0182 if wall2
0183 disp('Cliff again. Try traversing')
0184 if norm(x2-x1) < 1e-13
0185 f3=f; x3=x; badg3=1;retcode3=101;
0186 else
0187 gcliff=((f2-f1)/((norm(x2-x1))^2))*(x2-x1);
0188 if(size(x0,2)>1), gcliff=gcliff', end
0189 [f3 x3 fc retcode3] = csminit1(fcn,x,f,gcliff,0,eye(nx),varargin{:});
0190
0191
0192
0193
0194 fcount = fcount+fc;
0195 if retcode3==2 || retcode3==4
0196 wall3=1; badg3=1;
0197 else
0198 if NumGrad
0199 switch method
0200 case 2
0201 [g3 badg3] = numgrad2(fcn, f3, x3, epsilon, varargin{:});
0202 case 3
0203 [g3 badg3] = numgrad3(fcn, f3, x3, epsilon, varargin{:});
0204 case 5
0205 [g3,badg3] = numgrad5(fcn, f3, x3, epsilon, varargin{:});
0206 end
0207 elseif ischar(grad),
0208 [g3 badg3] = feval(grad,x3,varargin{:});
0209 else
0210 [junk1,g3,junk2, cost_flag] = feval(fcn,x1,varargin{:});
0211 badg3 = ~cost_flag;
0212 end
0213 wall3=badg3;
0214
0215 save g3.mat g3 x3 f3 varargin;
0216
0217
0218 end
0219 end
0220 else
0221 f3=f; x3=x; badg3=1; retcode3=101;
0222 end
0223 else
0224 f3=f; x3=x; badg3=1;retcode3=101;
0225 end
0226 else
0227
0228 f2=f; f3=f; badg2=1; badg3=1; retcode2=101; retcode3=101;
0229 end
0230 else
0231 f2=f;f3=f;f1=f;retcode2=retcode1;retcode3=retcode1;
0232 end
0233
0234 if f3 < f - crit && badg3==0 && f3 < f2 && f3 < f1
0235 ih=3;
0236 fh=f3;xh=x3;gh=g3;badgh=badg3;retcodeh=retcode3;
0237 elseif f2 < f - crit && badg2==0 && f2 < f1
0238 ih=2;
0239 fh=f2;xh=x2;gh=g2;badgh=badg2;retcodeh=retcode2;
0240 elseif f1 < f - crit && badg1==0
0241 ih=1;
0242 fh=f1;xh=x1;gh=g1;badgh=badg1;retcodeh=retcode1;
0243 else
0244 [fh,ih] = min([f1,f2,f3]);
0245
0246
0247 switch ih
0248 case 1
0249 xh=x1;
0250 case 2
0251 xh=x2;
0252 case 3
0253 xh=x3;
0254 end
0255
0256
0257 retcodei=[retcode1,retcode2,retcode3];
0258 retcodeh=retcodei(ih);
0259 if exist('gh')
0260 nogh=isempty(gh);
0261 else
0262 nogh=1;
0263 end
0264 if nogh
0265 if NumGrad
0266 switch method
0267 case 2
0268 [gh,badgh] = numgrad2(fcn, fh, xh, epsilon, varargin{:});
0269 case 3
0270 [gh,badgh] = numgrad3(fcn, fh, xh, epsilon, varargin{:});
0271 case 5
0272 [gh,badgh] = numgrad5(fcn, fh, xh, epsilon, varargin{:});
0273 end
0274 elseif ischar(grad),
0275 [gh badgh] = feval(grad, xh,varargin{:});
0276 else
0277 [junk1,gh,junk2, cost_flag] = feval(fcn,x1,varargin{:});
0278 badgh = ~cost_flag;
0279 end
0280 end
0281 badgh=1;
0282 end
0283
0284
0285
0286
0287
0288
0289 stuck = (abs(fh-f) < crit);
0290 if (~badg) && (~badgh) && (~stuck)
0291 H = bfgsi(H,gh-g,xh-x);
0292 end
0293 if Verbose
0294 disp('----')
0295 disp(sprintf('Improvement on iteration %d = %18.9f',itct,f-fh))
0296 end
0297
0298 if itct > nit
0299 disp('iteration count termination')
0300 done = 1;
0301 elseif stuck
0302 disp('improvement < crit termination')
0303 done = 1;
0304 end
0305 rc=retcodeh;
0306 if rc == 1
0307 disp('zero gradient')
0308 elseif rc == 6
0309 disp('smallest step still improving too slow, reversed gradient')
0310 elseif rc == 5
0311 disp('largest step still improving too fast')
0312 elseif (rc == 4) || (rc==2)
0313 disp('back and forth on step length never finished')
0314 elseif rc == 3
0315 disp('smallest step still improving too slow')
0316 elseif rc == 7
0317 disp('warning: possible inaccuracy in H matrix')
0318 end
0319
0320 f=fh;
0321 x=xh;
0322 g=gh;
0323 badg=badgh;
0324 end
0325
0326