101 double (*f)(
int n,
double *x,
void *objf_data),
108 double *working_space,
113 int fixed_n, fitted_n;
118 if(verbose>0) printf(
"in bobyqa()\n");
120 printf(
"original dx={%g", dx[0]);
121 for(j=1; j<n; j++) printf(
", %g", dx[j]);
133 printf(
"%d parameter(s) are fixed.\n", fixed_n); fflush(stdout);
136 if(verbose>0) fprintf(stderr,
"Error: no free parameters.\n");
137 return BOBYQA_INVALID_ARGS;
139 if(fitted_n==1 && verbose>0)
140 fprintf(stderr,
"Warning: only one free parameter.\n");
143 if(npt<=0) npt=2*fitted_n+1;
145 if(npt<fitted_n+2 || npt>(fitted_n+2)*(fitted_n+1)/2) {
147 printf(
"npt:=%d\n", npt);
148 fprintf(stderr,
"Error: bad npt.\n");
150 return(BOBYQA_INVALID_ARGS);
156 if(ret!=BOBYQA_SUCCESS)
return(BOBYQA_OUT_OF_MEMORY);
160 minf_max, ftol_rel, ftol_abs, maxeval,
161 f, objf_data, verbose, &bdata);
162 if(ret!=BOBYQA_SUCCESS) {
171 if(bdata.
verbose>1) printf(
"ret := %d\n", ret);
173 if(ret<0) printf(
"Error in bobyqb(): %s\n",
bobyqa_rc(ret));
174 else printf(
"Return code of bobyqb(): %s\n",
bobyqa_rc(ret));
178 if(bdata.
verbose>1) printf(
"ret := %d\n", ret);
180 printf(
"Error %d in 1-D optimization\n", ret);
184 for(i=0; i<n; i++) x[i]=bdata.
xfull[i];
185 if(nevals!=NULL) *nevals=bdata.
nevals;
191 printf(
"prelim() called %d time(s)\n", bdata.
prelim_nr);
192 printf(
"rescue() called %d time(s)\n", bdata.
rescue_nr);
193 printf(
"altmov() called %d time(s)\n", bdata.
altmov_nr);
194 printf(
"trsbox() called %d time(s)\n", bdata.
trsbox_nr);
195 printf(
"update() called %d time(s)\n", bdata.
update_nr);
199 if(verbose>0) printf(
"out of bobyqa() with return code %d\n", ret);
213 if(bdata->
verbose>0) {printf(
"bobyqa_minimize_single_parameter()\n"); fflush(stdout);}
215 double p1=0, p2=0, p3=0, f1=0, f2=0, f3=0, begin, end;
217 const double tau=0.1;
218 double p_min, f_min, bracket_ratio;
221 if(bdata->
n!=1)
return BOBYQA_INVALID_ARGS;
222 if(bdata->
rhoend<=0.0)
return BOBYQA_INVALID_ARGS;
223 if(bdata->
rhoend>=bdata->
rhobeg)
return BOBYQA_INVALID_ARGS;
224 if(bdata->
maxeval<2)
return BOBYQA_INVALID_ARGS;
233 if(bdata->
xl[0]>=bdata->
xu[0]) {
234 if(bdata->
verbose>1) printf(
"Warning: the only parameter is fixed\n");
235 return BOBYQA_SUCCESS;
245 p1=p2-bdata->
rhobeg;
if(p1>begin) p1=begin;
246 p3=p2+bdata->
rhobeg;
if(p3<end) p3=end;
254 if(p2==p1 || p2==p3) {
262 double jump_size=bdata->
rhobeg;
263 while(!(f1>f2 && f2<f3)) {
265 if(bdata->
verbose>5) printf(
" bracketing: nevals=%d\n", bdata->
nevals);
267 bdata->
x[0]=p2; bdata->
minf=f2;
return BOBYQA_MAXEVAL_REACHED;
270 if((p3-p1)<bdata->
rhoend) {
272 printf(
" max tolerance was reached during bracketing\n");
274 bdata->
x[0]=p1; bdata->
minf=f1;
return BOBYQA_XTOL_REACHED;
277 bdata->
x[0]=p2; bdata->
minf=f2;
return BOBYQA_XTOL_REACHED;
279 bdata->
x[0]=p3; bdata->
minf=f3;
return BOBYQA_XTOL_REACHED;
281 if(bdata->
verbose>6) printf(
" jump_size=%g\n", jump_size);
288 if(p1==begin || (f1==f2 && (end-begin)<jump_size )) {
289 p3=p2; f3=f2; p2=0.5*(p1+p2);
294 p3=p2; f3=f2; p2=p1; f2=f1;
295 p1-=jump_size;
if(p1<begin) p1=begin;
305 if(p3==end || (f2==f3 && (end-begin)<jump_size)) {
306 p1=p2; f1=f2; p2=0.5*(p3+p2);
311 p1=p2; f1=f2; p2=p3; f2=f3;
312 p3+=jump_size;
if(p3>end) p3=end;
319 if(bdata->
verbose>4) printf(
" brackets ready\n");
326 if(bdata->
verbose>5) printf(
" main loop: nevals=%d\n", bdata->
nevals);
329 d=f1*(p3*p3-p2*p2) + f2*(p1*p1-p3*p3) + f3*(p2*p2-p1*p1);
330 d2=2.0*(f1*(p3-p2) + f2*(p1-p3) + f3*(p2-p1));
331 if(d2==0.0 || !isfinite(d/=d2)) {
334 if(p1<=d && d<=p3) {p_min=d;}
335 else {p_min=d;
if(p1>p_min) p_min=p1;
if(p3<p_min) p_min=p3;}
341 if(fabs(p1-p_min)<d) p_min=p1+d;
342 else if(fabs(p2-p_min)<d) p_min=p2-d;
345 if(fabs(p2-p_min)<d) p_min=p2+d;
346 else if(fabs(p3-p_min)<d) p_min=p3-d;
351 bracket_ratio=fabs(p1-p2)/fabs(p2-p3);
352 if(!(bracket_ratio<100.0 && bracket_ratio>0.01)) {
354 if(bracket_ratio>1.0 && p_min>p2) p_min=0.5*(p1+p2);
355 else if(p_min<p2) p_min=0.5*(p2+p3);
364 if(f1>f_min && f_min<f2) {p3=p2; f3=f2; p2=p_min; f2=f_min;}
365 else {p1=p_min; f1 = f_min;}
367 if(f2>f_min && f_min<f3) {p1=p2; f1=f2; p2=p_min; f2=f_min;}
368 else {p3=p_min; f3=f_min;}
371 bdata->
x[0]=p2; bdata->
minf=f2;
372 if(bdata->
nevals>=bdata->
maxeval)
return BOBYQA_MAXEVAL_REACHED;
373 return BOBYQA_XTOL_REACHED;
1095 int i, ih, j, k, nh, ksav;
1096 double d1, diff, temp, den, densav, hdiag, pqold;
1097 double suma, sumb, sum, gqsq, gisq;
1099 if(bdata->
verbose>5) {printf(
"calc_with_xnew()\n"); fflush(stdout);}
1103 for (i=0; i<bdata->
n; i++) {
1104 d1=fmax(bdata->
xl[i], bdata->
xbase[i]+bdata->
xnew[i]);
1105 bdata->
x[i]=fmin(d1, bdata->
xu[i]);
1106 if(bdata->
xnew[i]==bdata->
sl[i]) bdata->
x[i]=bdata->
xl[i];
1107 if(bdata->
xnew[i]==bdata->
su[i]) bdata->
x[i]=bdata->
xu[i];
1113 if(bdata->
verbose>3) printf(
"BOBYQA_MAXEVAL_REACHED\n");
1114 bdata->
rc = BOBYQA_MAXEVAL_REACHED;
1116 if(bdata->
rc != BOBYQA_SUCCESS) {
1123 if(bdata->
ntrits == -1) {
1125 if(bdata->
verbose>3) printf(
"BOBYQA_XTOL_REACHED 1\n");
1126 bdata->
rc = BOBYQA_XTOL_REACHED;
1133 if(bdata->
verbose>3) printf(
"BOBYQA_MINF_MAX_REACHED\n");
1134 return BOBYQA_MINF_MAX_REACHED;
1140 for(j=ih=0; j<bdata->
n; j++) {
1142 for(i=0; i<=j; i++, ih++) {
1143 temp = bdata->
dtrial[i]*bdata->
dtrial[j];
if(i==j) temp*=0.5;
1144 bdata->
vquad += bdata->
hq[ih]*temp;
1147 for(k=0; k<bdata->
npt; k++)
1152 bdata->
diffa=fabs(diff);
1160 printf(
"BOBYQA_ROUNDOFF_LIMITED 3; ntrits=%d vquad=%g\n",
1162 bdata->
rc = BOBYQA_ROUNDOFF_LIMITED;
1167 if(bdata->
verbose>3) printf(
"BOBYQA_XTOL_REACHED 2\n");
1168 bdata->
rc = BOBYQA_XTOL_REACHED;
1176 if(bdata->
ratio <= 0.1) {
1178 }
else if(bdata->
ratio <= .7) {
1190 for(k=0; k<bdata->
npt; k++) {
1191 for(j=0, hdiag=0.0; j<bdata->
nptm; j++)
1193 if(!isfinite(hdiag) && bdata->
verbose>0)
1194 printf(
"INF in calc_with_xnew(): k=%d hdiag=%.10E\n", k, hdiag);
1196 if(!isfinite(den) && bdata->
verbose>0) {
1197 printf(
"INF in calc_with_xnew(): k=%d den=%.10E\n", k, den);
1199 for(j=0, bdata->
distsq=0.0; j<bdata->n; j++) {
1200 d1=bdata->
xpt[k+j*bdata->
npt]-bdata->
xnew[j];
1204 printf(
"INF in calc_with_xnew(): k=%d bdata->distsq=%.10E\n",
1207 d1=bdata->
distsq/bdata->
delsq; temp=fmax(1.0, d1*d1);
1208 if(temp*den > bdata->
scaden) {
1220 pqold=bdata->
pq[bdata->
knew-1]; bdata->
pq[bdata->
knew-1]=0.0;
1221 for(i=ih=0; i<bdata->
n; i++) {
1222 temp=pqold*bdata->
xpt[bdata->
knew-1 + i * bdata->
npt];
1223 for(j=0; j<=i; j++, ih++)
1224 bdata->
hq[ih]+=temp*bdata->
xpt[bdata->
knew-1 + j*bdata->
npt];
1226 for(j=0; j<bdata->
nptm; j++) {
1227 temp=diff*bdata->
zmat[bdata->
knew-1+j*bdata->
npt];
1228 for(k=0; k<bdata->
npt; k++) bdata->
pq[k]+=temp*bdata->
zmat[k+j*bdata->
npt];
1234 for(i=0; i<bdata->
n; i++) {
1239 for(k=0; k<bdata->
npt; k++) {
1240 for(j=0, suma=0.0; j<bdata->
nptm; j++) {
1244 if(isfinite(v)) suma+=v;
1246 printf(
"INF in calc_with_xnew(v): k=%d j=%d a=%E b=%E\n",
1248 bdata->
zmat[k + j*bdata->
npt]);
1252 bdata->
zmat[k + j*bdata->
npt];
1254 if(!isfinite(suma) && bdata->
verbose>0) {
1255 printf(
"INF in calc_with_xnew(suma): k=%d j=%d a=%E b=%E\n", k, j,
1260 if(!isfinite(suma)) {
1261 if(bdata->
verbose>0) printf(
"INF in calc_with_xnew: suma\n");
1262 if(bdata->
verbose>3) printf(
"BOBYQA_ROUNDOFF_LIMITED 4\n");
1263 bdata->
rc = BOBYQA_ROUNDOFF_LIMITED;
1267 for(j=0, sumb=0.0; j<bdata->
n; j++)
1268 sumb+=bdata->
xpt[k+j*bdata->
npt]*bdata->
xopt[j];
1270 for(j=0; j<bdata->
n; j++)
1271 bdata->
wn[j]+=temp*bdata->
xpt[k+j*bdata->
npt];
1273 for(i=0; i<bdata->
n; i++) bdata->
gopt[i]+=diff*bdata->
wn[i];
1276 if(!isfinite(bdata->
fopt) || !isfinite(bdata->
newf)) {
1277 if(bdata->
verbose>3) printf(
"BOBYQA_ROUNDOFF_LIMITED N\n");
1278 bdata->
rc = BOBYQA_ROUNDOFF_LIMITED;
1284 for(j=0, ih=0; j<bdata->
n; j++) {
1287 for(i=0; i<=j; i++, ih++) {
1288 if(i<j) bdata->
gopt[j]+=bdata->
hq[ih]*bdata->
dtrial[i];
1292 for(k=0; k<bdata->
npt; k++) {
1293 for(j=0, temp=0.0; j<bdata->
n; j++)
1296 for(i=0; i<bdata->
n; i++) bdata->
gopt[i]+=temp*bdata->
xpt[k+i*bdata->
npt];
1303 printf(
"fopt=%.15E newf=%.15E ftol_abs=%.15E\n", bdata->
fopt,
1305 if(bdata->
verbose>3) printf(
"BOBYQA_ABSFTOL_REACHED 2a\n");
1306 bdata->
rc = BOBYQA_ABSFTOL_REACHED;
1313 if(bdata->
verbose>3) printf(
"BOBYQA_RELFTOL_REACHED 2b\n");
1314 bdata->
rc = BOBYQA_RELFTOL_REACHED;
1320 if(bdata->
verbose>3) printf(
"BOBYQA_FTOL_REACHED 2c\n");
1321 bdata->
rc = BOBYQA_FTOL_REACHED;
1329 if(bdata->
ntrits<=0)
return bdata->
rc;
1333 nh=bdata->
n*(bdata->
n+1)/2;
1334 for(k=0; k<bdata->
npt; k++) {
1336 bdata->
w2npt[k]=0.0;
1338 for(j=0; j<bdata->
nptm; j++) {
1339 for(k=0, sum=0.0; k<bdata->
npt; k++)
1341 for(k=0; k<bdata->
npt; k++)
1344 for(k=0; k<bdata->
npt; k++) {
1345 for(j=0, sum=0.0; j<bdata->
n; j++)
1346 sum+=bdata->
xpt[k+j*bdata->
npt]*bdata->
xopt[j];
1348 bdata->
w2npt[k]*=sum;
1351 for(i=0; i<bdata->
n; i++) {
1352 for(k=0, sum=0.0; k<bdata->
npt; k++)
1355 if(bdata->
xopt[i]==bdata->
sl[i]) {
1356 d1=fmin(0.0, bdata->
gopt[i]); gqsq+=d1*d1;
1357 d1=fmin(0.0, sum); gisq+=d1*d1;
1358 }
else if(bdata->
xopt[i]==bdata->
su[i]) {
1359 d1=fmax(0.0, bdata->
gopt[i]); gqsq+=d1*d1;
1360 d1=fmax(0.0, sum); gisq+=d1*d1;
1362 d1=bdata->
gopt[i]; gqsq+=d1*d1; gisq+=sum*sum;
1364 bdata->
vlag[bdata->
npt+i]=sum;
1369 bdata->
itest++;
if(gqsq<10.0*gisq) bdata->
itest=0;
1370 if(bdata->
itest>=3) {
1371 for(i=0; i<bdata->
npt || i<nh; i++) {
1372 if(i<bdata->n) bdata->
gopt[i]=bdata->
vlag[bdata->
npt+i];
1373 if(i<bdata->npt) bdata->
pq[i]=bdata->
w2npt[bdata->
npt+i];
1374 if(i<nh) bdata->
hq[i]=0.0;
1879 if(bdata->
verbose>3) {printf(
"bobyqa_altmov()\n"); fflush(stdout);}
1883 double ha, gw, diff;
1887 double vlag, subd, temp;
1889 double step=0.0, curv;
1891 double scale, csave=0.0, tempa, tempb, tempd, sumin, ggfree;
1893 double dderiv, bigstp, predsq, presav, distsq, stpsav=0.0, wfixsq, wsqsav=0.0;
1898 for(k=0; k<bdata->
npt; k++) bdata->
hcol[k]=0.0;
1899 for(j=0; j<bdata->
npt-bdata->
n-1; j++) {
1900 temp = bdata->
zmat[(bdata->
knew-1) + j*bdata->
npt];
1901 for(k=0; k<bdata->
npt; k++)
1902 bdata->
hcol[k] += temp * bdata->
zmat[k + j*bdata->
npt];
1905 ha = 0.5*bdata->
alpha;
1908 for(i=0; i<bdata->
n; i++)
1910 for(k=0; k<bdata->
npt; k++) {
1912 for(j=0; j<bdata->
n; j++) temp+=bdata->
xpt[k + j*bdata->
npt]*bdata->
xopt[j];
1913 temp*=bdata->
hcol[k];
1914 for(i=0; i<bdata->
n; i++) bdata->
glag[i]+=temp*bdata->
xpt[k+i*bdata->
npt];
1923 for(k=ksav=0; k<bdata->
npt; k++) {
1924 if(k==bdata->
kopt-1)
continue;
1926 for(i=0; i<bdata->
n; i++) {
1927 temp = bdata->
xpt[k + i*bdata->
npt] - bdata->
xopt[i];
1928 dderiv += bdata->
glag[i]*temp;
1929 distsq += temp*temp;
1931 subd = bdata->
adelt / sqrt(distsq);
1932 slbd=-subd; ilbd=iubd=0;
1933 sumin = fmin(1.0, subd);
1936 for(i=0; i<bdata->
n; i++) {
1937 temp = bdata->
xpt[k + i*bdata->
npt] - bdata->
xopt[i];
1939 if(slbd*temp < bdata->sl[i]-bdata->
xopt[i]) {
1940 slbd = (bdata->
sl[i] - bdata->
xopt[i]) / temp;
1943 if(subd*temp > bdata->
su[i] - bdata->
xopt[i]) {
1944 subd = fmax(sumin, (bdata->
su[i] - bdata->
xopt[i]) / temp);
1947 }
else if(temp<0.0) {
1948 if(slbd*temp > bdata->
su[i] - bdata->
xopt[i]) {
1949 slbd = (bdata->
su[i] - bdata->
xopt[i]) / temp;
1952 if(subd*temp < bdata->sl[i] - bdata->
xopt[i]) {
1953 subd = fmax(sumin, (bdata->
sl[i] - bdata->
xopt[i]) / temp);
1961 if(k==bdata->
knew-1) {
1962 diff = dderiv - 1.0;
1963 step = slbd; vlag = slbd * (dderiv - slbd * diff);
1964 isbd = ilbd; temp = subd * (dderiv - subd * diff);
1965 if(fabs(temp) > fabs(vlag)) {
1966 step = subd; vlag = temp; isbd = iubd;
1968 tempd = 0.5 * dderiv;
1969 tempa = tempd - diff * slbd;
1970 tempb = tempd - diff * subd;
1971 if(tempa*tempb < 0.0) {
1972 temp = tempd*tempd/diff;
1973 if(fabs(temp) > fabs(vlag)) {step=tempd/diff; vlag=temp; isbd=0;}
1978 step = slbd; vlag = slbd * (1.0 - slbd);
1979 isbd = ilbd; temp = subd * (1.0 - subd);
1980 if(fabs(temp) > fabs(vlag)) {step=subd; vlag=temp; isbd=iubd;}
1981 if(subd>0.5 && fabs(vlag)<0.25) {step=0.5; vlag=0.25; isbd=0;}
1986 temp = step*(1.0-step)*distsq;
1987 predsq = vlag*vlag*(vlag*vlag + ha*temp*temp);
1988 if(predsq>presav) {presav=predsq; ksav=k; stpsav=step; ibdsav=isbd;}
1992 for(i=0; i<bdata->
n; i++) {
1993 temp=bdata->
xopt[i]+stpsav*(bdata->
xpt[ksav+i*bdata->
npt]-bdata->
xopt[i]);
1994 d2=fmin(bdata->
su[i],temp);
1995 bdata->
xnew[i] = fmax(bdata->
sl[i],d2);
1997 if(ibdsav<0) bdata->
xnew[-ibdsav]=bdata->
sl[-ibdsav];
1998 if(ibdsav>0) bdata->
xnew[ibdsav]=bdata->
su[ibdsav];
2007 wfixsq = ggfree = 0.0;
2008 for(i=0; i<bdata->
n; i++) {
2010 tempa = fmin(bdata->
xopt[i] - bdata->
sl[i], bdata->
glag[i]);
2011 tempb = fmax(bdata->
xopt[i] - bdata->
su[i], bdata->
glag[i]);
2019 if(tempa>0.0 || tempb<0.0) {
2023 if(isfinite(d2)) ggfree+=d2;
else ggfree+=fabs(bdata->
glag[i]);
2028 if(!isfinite(ggfree) || ggfree==0.0) {bdata->
cauchy=0.0;
return;}
2034 temp=fma(bdata->
adelt, bdata->
adelt, -wfixsq);
2036 if(isnan(temp) || !isfinite(temp))
break;
2038 wsqsav=wfixsq; step=sqrt(temp/ggfree);
2040 if(isnan(step) || !isfinite(step)) {bdata->
cauchy=0.0;
return;}
2042 for(i=0; i<bdata->
n; i++) {
2043 if(bdata->
ccstep[i]==bigstp) {
2045 d2=fma(bdata->
glag[i], -step, bdata->
xopt[i]);
2046 if(d2 <= bdata->sl[i]) {
2049 }
else if(d2 >= bdata->
su[i]) {
2053 ggfree+=bdata->
glag[i]*bdata->
glag[i];
2062 }
while(isfinite(ggfree) && isfinite(wfixsq) && isfinite(wsqsav) &&
2065 wfixsq-wsqsav>1.0E-50 && ggfree>1.0E-50 && temp>0.0);
2070 for(i=0, gw=0.0; i<bdata->
n; i++) {
2071 if(bdata->
ccstep[i]==bigstp) {
2073 d2=fmin(bdata->
su[i], bdata->
xopt[i]+bdata->
ccstep[i]);
2074 bdata->
xalt[i]=fmax(bdata->
sl[i], d2);
2075 }
else if(bdata->
ccstep[i]==0.0) {
2077 }
else if(bdata->
glag[i]>0.0) {
2078 bdata->
xalt[i]=bdata->
sl[i];
2080 bdata->
xalt[i]=bdata->
su[i];
2089 for(k=0, curv=0.0; k<bdata->
npt; k++) {
2090 for(j=0, temp=0.0; j<bdata->
n; j++)
2092 curv += bdata->
hcol[k]*temp*temp;
2094 if(iflag==1) curv=-curv;
2095 if(curv>-gw && curv<-(1.0+M_SQRT2)*gw) {
2097 for(i=0; i<bdata->
n; i++) {
2099 temp = fma(scale, bdata->
ccstep[i], bdata->
xopt[i]);
2100 d2=fmin(bdata->
su[i], temp);
2101 bdata->
xalt[i]=fmax(bdata->
sl[i], d2);
2106 d1=fma(0.5, curv, gw);
2114 for(i=0; i<bdata->
n; i++) {
2118 csave=bdata->
cauchy; iflag=1;
2123 if(csave > bdata->
cauchy) {
2124 for(i=0; i<bdata->
n; i++) bdata->
xalt[i]=bdata->
ccstep[bdata->
n+i];
2139 if(bdata->
verbose>5) {printf(
"bobyqa_prelim()\n"); fflush(stdout);}
2142 int i, j, k, ih, np, nfm;
2143 int nfx, ipt=0, jpt=0;
2144 double fbeg, diff, temp, recip, stepa, stepb;
2146 double rhosq, SQRT_HALF;
2151 recip = 1.0 / rhosq;
2154 stepa=stepb=fbeg=0.0;
2160 for(j=0; j<bdata->
n; j++) {
2161 bdata->
xbase[j]=bdata->
x[j];
2162 for(k=0; k<bdata->
npt; k++) bdata->
xpt[k+j*bdata->
npt]=0.0;
2163 for(i=0; i<bdata->
ndim; i++) bdata->
bmat[i+j*bdata->
ndim]=0.0;
2165 for(ih=0; ih<bdata->
n*np/2; ih++) bdata->
hq[ih]=0.0;
2166 for(k=0; k<bdata->
npt; k++) {
2168 for(j=0; j<bdata->
npt-np; j++) bdata->
zmat[k+j*bdata->
npt]=0.0;
2174 nf=0; SQRT_HALF=sqrt(0.5);
2176 nfm=nf; nfx=nf-bdata->
n; nf++;
2177 if(nfm<=2*bdata->n) {
2178 if(nfm>=1 && nfm<=bdata->n) {
2180 if(bdata->
su[nfm-1]==0.0) stepa=-stepa;
2181 bdata->
xpt[nf-1+(nfm-1)*bdata->
npt]=stepa;
2182 }
else if (nfm > bdata->
n) {
2183 stepa = bdata->
xpt[nf-1 - bdata->
n + (nfx-1)*bdata->
npt];
2185 if(bdata->
sl[nfx-1]==0.0) {
2186 stepb=fmin(2.0*bdata->
rhobeg, bdata->
su[nfx-1]);}
2187 if(bdata->
su[nfx-1]==0.0) {
2188 stepb=fmax(-2.0*bdata->
rhobeg, bdata->
sl[nfx-1]);}
2189 bdata->
xpt[nf-1 + (nfx-1)*bdata->
npt] = stepb;
2192 itemp=(nfm-np)/bdata->
n;
2193 jpt=nfm-itemp*bdata->
n-bdata->
n; ipt=jpt+itemp;
2194 if(ipt > bdata->
n) {itemp=jpt; jpt=ipt-bdata->
n; ipt=itemp;}
2195 bdata->
xpt[nf-1+(ipt-1)*bdata->
npt]= bdata->
xpt[ipt+(ipt-1)*bdata->
npt];
2196 bdata->
xpt[nf-1+(jpt-1)*bdata->
npt]= bdata->
xpt[jpt+(jpt-1)*bdata->
npt];
2201 for(j=0; j<bdata->
n; j++) {
2202 d2 = bdata->
xbase[j] + bdata->
xpt[nf-1 + j*bdata->
npt];
2203 d1 = fmax(bdata->
xl[j],d2);
2204 bdata->
x[j] = fmin(d1,bdata->
xu[j]);
2205 if(bdata->
xpt[nf-1 + j*bdata->
npt] == bdata->
sl[j])
2206 bdata->
x[j]=bdata->
xl[j];
2207 else if(bdata->
xpt[nf-1 + j*bdata->
npt] == bdata->
su[j])
2208 bdata->
x[j]=bdata->
xu[j];
2212 bdata->
fval[nf-1]=f;
2213 if(nf==1) {fbeg=f; bdata->
kopt=1;}
2214 else if(f<bdata->fval[bdata->
kopt-1]) bdata->
kopt=nf;
2222 if(nf<=2*bdata->n+1) {
2223 if(nf>=2 && nf<=bdata->n+1) {
2224 bdata->
gopt[nfm-1] = (f-fbeg)/stepa;
2225 if(bdata->
npt < nf+bdata->
n) {
2226 bdata->
bmat[(nfm-1)*bdata->
ndim] = -1.0/stepa;
2227 bdata->
bmat[(nf-1) + (nfm-1)*bdata->
ndim] = 1.0/stepa;
2228 bdata->
bmat[bdata->
npt + (nfm-1) + (nfm-1)*bdata->
ndim] = -0.5*rhosq;
2230 }
else if(nf>=bdata->
n+2) {
2232 temp = (f-fbeg)/stepb; diff=stepb-stepa;
2233 bdata->
hq[ih-1] = 2.0*(temp-bdata->
gopt[nfx-1])/diff;
2234 bdata->
gopt[nfx-1] = (bdata->
gopt[nfx-1]*stepb - temp*stepa) / diff;
2235 if(stepa*stepb < 0.0) {
2236 if(f < bdata->fval[nf-1 - bdata->
n]) {
2237 bdata->
fval[nf-1] = bdata->
fval[nf-1 - bdata->
n];
2238 bdata->
fval[nf-1 - bdata->
n] = f;
2239 if(bdata->
kopt==nf) bdata->
kopt=nf-bdata->
n;
2240 bdata->
xpt[nf-1 - bdata->
n + (nfx-1)*bdata->
npt] = stepb;
2241 bdata->
xpt[nf-1 + (nfx-1)*bdata->
npt] = stepa;
2244 bdata->
bmat[(nfx-1)*bdata->
ndim] = -(stepa+stepb)/(stepa*stepb);
2245 bdata->
bmat[(nf-1) + (nfx-1)*bdata->
ndim] =
2246 -0.5/bdata->
xpt[nf-1 - bdata->
n + (nfx-1)*bdata->
npt];
2247 bdata->
bmat[nf-1 - bdata->
n + (nfx-1)*bdata->
ndim] =
2248 -bdata->
bmat[(nfx-1)*bdata->
ndim] -
2249 bdata->
bmat[nf-1 + (nfx-1)*bdata->
ndim];
2250 bdata->
zmat[(nfx-1)*bdata->
npt] = M_SQRT2/(stepa*stepb);
2251 bdata->
zmat[nf-1 + (nfx-1)*bdata->
npt] = SQRT_HALF/rhosq;
2252 bdata->
zmat[nf-1 - bdata->
n + (nfx-1)*bdata->
npt] =
2253 -bdata->
zmat[(nfx-1)*bdata->
npt] -
2254 bdata->
zmat[nf-1 + (nfx-1)*bdata->
npt];
2260 ih = ipt*(ipt-1)/2 + jpt;
2261 bdata->
zmat[(nfx-1)*bdata->
npt] = recip;
2262 bdata->
zmat[nf-1 + (nfx-1)*bdata->
npt] = recip;
2263 bdata->
zmat[ipt + (nfx-1)*bdata->
npt] = -recip;
2264 bdata->
zmat[jpt + (nfx-1)*bdata->
npt] = -recip;
2265 temp= bdata->
xpt[nf - 1 + (ipt-1)*bdata->
npt]
2266 * bdata->
xpt[nf - 1 + (jpt-1)*bdata->
npt];
2268 (fbeg - bdata->
fval[ipt] - bdata->
fval[jpt] + f) / temp;
2272 if(f < bdata->minf_max) {
2274 return BOBYQA_MINF_MAX_REACHED;
2277 return BOBYQA_MAXEVAL_REACHED;
2279 }
while (nf<bdata->npt);
2281 return BOBYQA_SUCCESS;
2297 if(bdata->
verbose>0) {printf(
"bobyqa_rescue()\n"); fflush(stdout);}
2300 int i, j, k, ih, jp, ip, iq, np, iw;
2301 double xp=0.0, xq=0.0, den;
2303 int ihq, jpn, kpt, kold;
2304 double sum, diff, winc, temp, bsum;
2306 double hdiag, fbase, sfrac, vquad, sumpq;
2307 double dsqmin=0.0, distsq, vlmxsq;
2331 ptsaux=malloc(2*bdata->
n*
sizeof(
double));
2332 ptsid=malloc(bdata->
npt*
sizeof(
double));
2333 w=malloc((bdata->
ndim*bdata->
npt)*
sizeof(
double));
2337 sfrac = 0.5 / (double)np;
2346 for(k=0; k<bdata->
npt; k++) {
2347 for(j=0, distsq=0.0; j<bdata->
n; j++) {
2348 bdata->
xpt[k + j*bdata->
npt] -= bdata->
xopt[j];
2349 distsq += bdata->
xpt[k + j*bdata->
npt] * bdata->
xpt[k + j*bdata->
npt];
2351 sumpq += bdata->
pq[k];
2352 w[bdata->
ndim + k] = distsq;
2353 winc=fmax(winc, distsq);
2354 for(j=0; j<bdata->
nptm; j++) bdata->
zmat[k + j*bdata->
npt] = 0.0;
2360 for(j=0; j<bdata->
n; j++) {
2361 w[j] = 0.5*sumpq*bdata->
xopt[j];
2362 for(k=0; k<bdata->
npt; k++)
2363 w[j] += bdata->
pq[k] * bdata->
xpt[k + j*bdata->
npt];
2364 for(i=0; i<=j; i++, ih++)
2365 bdata->
hq[ih] += w[i]*bdata->
xopt[j] + w[j]*bdata->
xopt[i];
2370 for(j=0; j<bdata->
n; j++) {
2372 bdata->
sl[j] -= bdata->
xopt[j];
2373 bdata->
su[j] -= bdata->
xopt[j];
2374 bdata->
xopt[j] = 0.0;
2375 ptsaux[j] = fmin(bdata->
delta, bdata->
su[j]);
2376 ptsaux[j+bdata->
n] = fmax((-bdata->
delta), bdata->
sl[j]);
2377 if(ptsaux[j] + ptsaux[j+bdata->
n] < 0.0) {
2379 ptsaux[j] = ptsaux[j+bdata->
n];
2380 ptsaux[j+bdata->
n] = temp;
2382 if(fabs(ptsaux[j+bdata->
n]) < 0.5*(fabs(ptsaux[j])))
2383 ptsaux[j+bdata->
n] = 0.5*ptsaux[j];
2384 for(i=0; i<bdata->
ndim; ++i) bdata->
bmat[i + j*bdata->
ndim] = 0.0;
2386 fbase = bdata->
fval[bdata->
kopt-1];
2392 for(j=0; j<bdata->
n; j++) {
2393 jp = j + 1; jpn = jp + bdata->
n;
2394 ptsid[jp] = (double)(j+1) + sfrac;
2395 if(jpn < bdata->npt) {
2396 ptsid[jpn] = (double)(j+1)/(double)(np+1) + sfrac;
2397 temp = 1.0 / (ptsaux[j] - ptsaux[j+bdata->
n]);
2398 bdata->
bmat[jp + j*bdata->
ndim] = -temp + 1.0 / ptsaux[j];
2399 bdata->
bmat[jpn + j*bdata->
ndim] = temp + 1.0 / ptsaux[j+bdata->
n];
2402 bdata->
zmat[j*bdata->
npt] = M_SQRT2/fabs(ptsaux[j] * ptsaux[j+bdata->
n]);
2403 bdata->
zmat[jp + j*bdata->
npt] =
2404 bdata->
zmat[j*bdata->
npt] * ptsaux[j+bdata->
n] * temp;
2405 bdata->
zmat[jpn + j*bdata->
npt] =
2406 -bdata->
zmat[j*bdata->
npt] * ptsaux[j] * temp;
2408 bdata->
bmat[j*bdata->
ndim] = -1.0 / ptsaux[j];
2409 bdata->
bmat[jp + j*bdata->
ndim] = 1.0 / ptsaux[j];
2410 bdata->
bmat[j + bdata->
npt + j*bdata->
ndim] = -0.5*(ptsaux[j]*ptsaux[j]);
2415 if (bdata->
npt >= bdata->
n + np) {
2416 for(k=2*np-1; k<bdata->
npt; k++) {
2419 iw = (int) ( ((
double)(k+1-np)-0.5) / (
double)bdata->
n );
2420 ip = k+1 - np - iw*bdata->
n;
2422 if(iq>bdata->
n) iq-=bdata->
n;
2423 ptsid[k] = (double)ip + (
double)iq/(double)np + sfrac;
2424 temp = 1.0 / (ptsaux[ip]*ptsaux[iq]);
2425 bdata->
zmat[(k-np)*bdata->
npt] = temp;
2426 bdata->
zmat[ip + (k-np)*bdata->
npt] = -temp;
2427 bdata->
zmat[iq + (k-np)*bdata->
npt] = -temp;
2428 bdata->
zmat[k + (k-np)*bdata->
npt] = temp;
2436 for(j=0; j<bdata->
n; j++) {
2437 temp = bdata->
bmat[kold-1 + j*bdata->
ndim];
2438 bdata->
bmat[kold-1 + j*bdata->
ndim] =
2442 for(j=0; j<bdata->
nptm; j++) {
2443 temp = bdata->
zmat[kold-1 + j*bdata->
npt];
2444 bdata->
zmat[kold-1 + j*bdata->
npt] =
2448 ptsid[kold-1] = ptsid[bdata->
knew-1];
2449 ptsid[bdata->
knew-1]=0.0;
2450 w[bdata->
ndim + bdata->
knew-1]=0.0;
2453 temp = bdata->
vlag[kold-1];
2461 if(nrem==0) {free(ptsaux); free(ptsid); free(w);
return BOBYQA_SUCCESS;}
2463 for(k=0; k<bdata->
npt; k++)
2464 w[k+bdata->
ndim] = fabs(w[k+bdata->
ndim]);
2472 for(k=0; k<bdata->
npt; k++) {
2473 if(w[bdata->
ndim+k] > 0.0) {
2474 if(dsqmin==0.0 || w[bdata->
ndim+k]<dsqmin) {
2475 bdata->
knew=k+1; dsqmin=w[bdata->
ndim+k];}
2478 if(dsqmin==0.0)
break;
2481 for(j=0; j<bdata->
n; j++)
2485 for(k=0; k<bdata->
npt; k++) {
2487 if(k==bdata->
kopt-1) {
2488 }
else if(ptsid[k]==0.0) {
2489 for(j=0; j<bdata->
n; j++)
2490 sum += w[bdata->
npt+j]*bdata->
xpt[k + j*bdata->
npt];
2493 if(ip>0) sum = w[bdata->
npt + ip-1] * ptsaux[ip-1];
2494 iq = (int) ( (
double)np*ptsid[k] - (
double)(ip*np));
2496 iw=0;
if(ip==0) iw=1;
2497 sum += w[iq-1 + bdata->
npt] * ptsaux[iq-1 + iw*bdata->
n];
2504 for(k=0; k<bdata->
npt; k++) {
2505 for(j=0, sum=0.0; j<bdata->
n; j++)
2506 sum += bdata->
bmat[k + j*bdata->
ndim] * w[bdata->
npt + j];
2507 bdata->
vlag[k] = sum;
2510 for(j=0; j<bdata->
nptm; j++) {
2511 for(k=0, sum=0.0; k<bdata->
npt; k++)
2512 sum += bdata->
zmat[k + j*bdata->
npt] * w[k];
2513 bdata->
beta -= sum*sum;
2514 for(k=0; k<bdata->
npt; k++)
2515 bdata->
vlag[k] += sum * bdata->
zmat[k + j*bdata->
npt];
2517 bsum = distsq = 0.0;
2518 for(j=0; j<bdata->
n; j++) {
2519 for(k=0, sum=0.0; k<bdata->
npt; k++)
2520 sum += bdata->
bmat[k + j*bdata->
ndim] * w[k];
2521 jp = j + bdata->
npt;
2522 bsum += sum * w[jp];
2523 for(ip=bdata->
npt; ip<bdata->ndim; ip++)
2524 sum += bdata->
bmat[ip + j*bdata->
ndim] * w[ip];
2525 bsum += sum * w[jp];
2526 bdata->
vlag[jp] = sum;
2527 d1 = bdata->
xpt[bdata->
knew-1 + j*bdata->
npt]; distsq += d1*d1;
2530 bdata->
beta += 0.5*distsq*distsq - bsum;
2537 bdata->
denom = vlmxsq = 0.0;
2538 for(k=0; k<bdata->
npt; k++) {
2539 if(ptsid[k] != 0.0) {
2540 for(j=0, hdiag=0.0; j<bdata->
nptm; j++)
2541 hdiag += bdata->
zmat[k + j*bdata->
npt] * bdata->
zmat[k + j*bdata->
npt];
2542 den = bdata->
beta*hdiag + bdata->
vlag[k]*bdata->
vlag[k];
2543 if(den > bdata->
denom) {kold=k+1; bdata->
denom=den;}
2545 vlmxsq = fmax(vlmxsq, bdata->
vlag[k]*bdata->
vlag[k]);
2547 if(bdata->
denom > 0.01*vlmxsq)
break;
2550 }
while(dsqmin!=0.0);
2559 for(kpt=0; kpt<bdata->
npt; kpt++)
if((ptsid[kpt]!=0.0)) {
2562 free(ptsaux); free(ptsid); free(w);
return BOBYQA_MAXEVAL_REACHED;}
2565 for(j=0; j<bdata->
n; j++) {
2566 w[j] = bdata->
xpt[kpt + j*bdata->
npt];
2567 bdata->
xpt[kpt + j*bdata->
npt] = 0.0;
2568 temp = bdata->
pq[kpt] * w[j];
2569 for(i=0; i<=j; i++, ih++) bdata->
hq[ih] += temp*w[i];
2571 bdata->
pq[kpt] = 0.0;
2572 ip = (int) ptsid[kpt];
2573 iq = (int) ((
double)np * ptsid[kpt] - (
double)(ip * np));
2576 bdata->
xpt[kpt + (ip-1)*bdata->
npt] = xp;
2580 if(ip==0) xq = ptsaux[iq-1 + bdata->
n];
2581 bdata->
xpt[kpt + (iq-1)*bdata->
npt] = xq;
2587 ihp = (ip + ip*ip) / 2;
2588 vquad += xp * (bdata->
gopt[ip-1] + 0.5*xp*bdata->
hq[ihp-1]);
2591 ihq = (iq + iq*iq) / 2;
2592 vquad += xq * (bdata->
gopt[iq-1] + 0.5*xq*bdata->
hq[ihq-1]);
2594 if(ihp>=ihq) iw=ihp;
else iw=ihq;
2596 vquad += xp*xq*bdata->
hq[iw-1];
2599 for(k=0; k<bdata->
npt; k++) {
2601 if(ip > 0) temp += xp * bdata->
xpt[k + (ip-1)*bdata->
npt];
2602 if(iq > 0) temp += xq * bdata->
xpt[k + (iq-1)*bdata->
npt];
2603 vquad += 0.5 * bdata->
pq[k] * temp*temp;
2609 for(i=0; i<bdata->
n; i++) {
2610 d2 = bdata->
xbase[i] + bdata->
xpt[kpt + i*bdata->
npt];
2611 d1 = fmax(bdata->
xl[i], d2);
2612 w[i] = fmin(d1, bdata->
xu[i]);
2613 if(bdata->
xpt[kpt + i*bdata->
npt] == bdata->
sl[i]) w[i] = bdata->
xl[i];
2614 if(bdata->
xpt[kpt + i*bdata->
npt] == bdata->
su[i]) w[i] = bdata->
xu[i];
2619 bdata->
fval[kpt] = f;
2621 if(f < bdata->fval[bdata->
kopt-1]) bdata->
kopt = kpt+1;
2622 if(f < bdata->minf_max) {
2623 free(ptsaux); free(ptsid); free(w);
return BOBYQA_MINF_MAX_REACHED;}
2625 free(ptsaux); free(ptsid); free(w);
return BOBYQA_MAXEVAL_REACHED;}
2631 for(i=0; i<bdata->
n; i++)
2632 bdata->
gopt[i] += diff * bdata->
bmat[kpt + i*bdata->
ndim];
2633 for(k=0; k<bdata->
npt; k++) {
2634 for(j=0, sum=0.0; j<bdata->
nptm; j++)
2635 sum += bdata->
zmat[k + j*bdata->
npt] * bdata->
zmat[kpt + j*bdata->
npt];
2638 bdata->
pq[k] += temp;
2641 iq = (int) ((
double)np*ptsid[k] - (
double)(ip*np));
2642 ihq = (iq*iq + iq) / 2;
2644 d1=ptsaux[iq-1 + bdata->
n];
2645 bdata->
hq[ihq-1] += temp * (d1*d1);
2647 ihp = (ip*ip + ip) / 2;
2649 bdata->
hq[ihp-1] += temp * (d1*d1);
2652 bdata->
hq[ihq-1] += temp * (d1*d1);
2653 if(ihp>=ihq) iw=ihp;
else iw=ihq;
2655 bdata->
hq[iw-1] += temp * ptsaux[ip-1] * ptsaux[iq-1];
2663 free(ptsaux); free(ptsid); free(w);
2664 return BOBYQA_SUCCESS;
2728 if(bdata->
verbose>5) {printf(
"trsbox()\n"); fflush(stdout);}
2729 int i, iu, iact, nact, isav, iterc, itermax, perp_altern=1;
2730 double ds, dhd, dhs, cth, shs, sth, ssq, beta, sdec=0.0, blen;
2731 double angt, qred, d1, d2;
2732 double temp, xsav=0.0, xsum, angbd, dredg=0.0, sredg;
2733 double resid, delsq, ggsav=0.0, tempa, tempb, redmax;
2734 double dredsq=0.0, redsav, gredsq=0.0, rednew;
2735 double rdprev=0.0, rdnext=0.0, stplen, stepsq;
2745 for(i=0; i<bdata->
n; i++) {
2746 bdata->
xbdi[i] = 0.0;
2747 if(bdata->
xopt[i]<=bdata->
sl[i] && bdata->
gopt[i]>=0.0)
2748 bdata->
xbdi[i]=-1.0;
2749 else if(bdata->
xopt[i]>=bdata->
su[i] && bdata->
gopt[i]<=0.0)
2751 if(bdata->
xbdi[i]!=0.0) nact++;
2757 bdata->_crvmin = -1.0;
2765 itermax = iterc + bdata->
n - nact;
2768 for(i=0; i<bdata->
n; i++) {
2769 if(bdata->
xbdi[i]!=0.0) bdata->
s[i]=0.0;
2770 else if(beta==0.0) bdata->
s[i]=-bdata->
gnew[i];
2771 else bdata->
s[i]=beta*bdata->
s[i]-bdata->
gnew[i];
2772 stepsq+=bdata->
s[i]*bdata->
s[i];
2777 if(beta==0.0) {gredsq=stepsq; itermax=iterc+bdata->
n-nact;}
2778 if(gredsq*delsq <= qred*qred*1.0E-04) {
2788 resid=delsq; ds=shs=0.0;
2789 for(i=0; i<bdata->
n; i++)
if(bdata->
xbdi[i]==0.0) {
2791 ds+=bdata->
s[i]*bdata->
dtrial[i]; shs+=bdata->
s[i]*bdata->
hs[i];
2795 if(!isfinite(resid) || resid<=0.0)
break;
2796 temp=sqrt(stepsq*resid + ds*ds);
2797 if(ds<0.0) blen=(temp-ds)/stepsq;
else blen=resid/(temp+ds);
2798 stplen=blen;
if(shs>0.0) {d1=blen; d2=gredsq/shs; stplen=fmin(d1, d2);}
2803 for(i=0; i<bdata->
n; i++)
if(bdata->
s[i]!=0.0) {
2805 if(bdata->
s[i]>0.0) temp=(bdata->
su[i]-xsum)/bdata->
s[i];
2806 else temp=(bdata->
sl[i]-xsum)/bdata->
s[i];
2807 if(temp<stplen) {stplen=temp; iact=i+1;}
2812 if(isfinite(stplen) && stplen>0.0) {
2818 iterc++; temp=shs/stepsq;
2819 if(iact==0 && temp>0.0) {
2820 bdata->_crvmin=fmin(bdata->_crvmin, temp);
2821 if(bdata->_crvmin==-1.0) bdata->_crvmin=temp;
2823 ggsav=gredsq; gredsq=0.0;
2824 for(i=0; i<bdata->
n; i++) {
2825 bdata->
gnew[i]+=stplen*bdata->
hs[i];
2826 if(bdata->
xbdi[i]==0.0) gredsq+=bdata->
gnew[i]*bdata->
gnew[i];
2827 bdata->
dtrial[i]+=stplen*bdata->
s[i];
2829 d1=stplen*(ggsav-0.5*stplen*shs); sdec=fmax(d1,0.0); qred+=sdec;
2835 if(bdata->
s[i]<0.0) bdata->
xbdi[i]=-1.0;
else bdata->
xbdi[i]=1.0;
2837 if(!isfinite(delsq) || delsq<=0.0)
break;
2844 if(stplen>=blen)
break;
2845 if(iterc==itermax || sdec<=0.01*qred) {
2848 beta=gredsq/ggsav;
if(!isfinite(beta)) beta=0.0;
2854 if(perp_altern==1) {
2858 if(nact>=bdata->
n-1) {
2861 dredsq=dredg=gredsq=0.0;
2862 for(i=0; i<bdata->
n; i++) {
2863 if(bdata->
xbdi[i]==0.0) {
2872 for(i=0; i<bdata->
n; i++) bdata->
hred[i]=bdata->
hs[i];
2878 temp = gredsq*dredsq - dredg*dredg;
2879 if(!isfinite(temp) || temp<=qred*qred*1.0E-04) {
2883 for(i=0; i<bdata->
n; i++) {
2884 if(bdata->
xbdi[i]==0.0)
2885 bdata->
s[i]=(dredg*bdata->
dtrial[i]-dredsq*bdata->
gnew[i])/temp;
2886 else bdata->
s[i]=0.0;
2895 for(i=0; i<bdata->
n; i++)
if(bdata->
xbdi[i]==0.0) {
2898 if(tempa<=0.0) {nact++; bdata->
xbdi[i]=-1.0;
break;}
2899 else if(tempb<=0.0) {nact++; bdata->
xbdi[i]=1.0;
break;}
2900 d1=bdata->
dtrial[i]; d2=bdata->
s[i]; ssq=d1*d1+d2*d2;
2901 d1=bdata->
xopt[i]-bdata->
sl[i]; temp=ssq-d1*d1;
2903 temp=sqrt(temp)-bdata->
s[i];
2904 if(angbd*temp>tempa) {angbd=tempa/temp; iact=i+1; xsav=-1.0;}
2906 d1=bdata->
su[i]-bdata->
xopt[i]; temp=ssq-d1*d1;
2908 temp=sqrt(temp)+bdata->
s[i];
2909 if(angbd*temp>tempb) {angbd=tempb/temp; iact=i+1; xsav=1.0;}
2912 if(i<bdata->n) {perp_altern=1;
continue;}
2917 for(i=0; i<bdata->
n; i++)
if(bdata->
xbdi[i]==0.0) {
2918 shs += bdata->
s[i]*bdata->
hs[i];
2919 dhs += bdata->
dtrial[i]*bdata->
hs[i];
2926 redmax=redsav=0.0; isav=0;
2927 iu=(int)(angbd*17.+3.1);
2928 for(i=1; i<=iu; i++) {
2929 angt = angbd*(double)i/(
double)iu;
2930 sth = (angt+angt)/(1.0+angt*angt);
2931 temp = shs+angt*(angt*dhd-dhs-dhs);
2932 rednew = sth*(angt*dredg-sredg-0.5*sth*temp);
2933 if(rednew>redmax) {redmax=rednew; isav=i; rdprev=redsav;}
2934 else if(i==isav+1) {rdnext=rednew;}
2944 temp = (rdnext-rdprev)/(redmax+redmax-rdprev-rdnext);
2945 angt = angbd*((double)isav+0.5*temp)/(
double)iu;
2947 d2=angt*angt; cth=(1.0-d2)/(1.0+d2);
2948 sth = (angt+angt)/(1.0+d2);
2949 temp = shs+angt*(angt*dhd-dhs-dhs);
2950 sdec = sth*(angt*dredg-sredg-0.5*sth*temp);
2959 for(i=0; i<bdata->
n; i++) {
2960 bdata->
gnew[i]+=(cth-1.0)*bdata->
hred[i]+sth*bdata->
hs[i];
2961 if(bdata->
xbdi[i]==0.0) {
2964 gredsq+=bdata->
gnew[i]*bdata->
gnew[i];
2966 bdata->
hred[i]=cth*bdata->
hred[i]+sth*bdata->
hs[i];
2970 if(iact>0 && isav==iu) {
2971 nact++; bdata->
xbdi[iact-1]=xsav;
2972 perp_altern=1;
continue;
2977 if(sdec<=0.01*qred)
break;
bobyqa_result bobyqa(int n, int npt, double *x, const double *xl, const double *xu, const double *dx, const double rhoend, double xtol_rel, double minf_max, double ftol_rel, double ftol_abs, int maxeval, int *nevals, double *minf, double(*f)(int n, double *x, void *objf_data), void *objf_data, double *working_space, int verbose)
bobyqa_result bobyqa_set_optimization(int full_n, double *x, const double *dx, const double *xl, const double *xu, const double rhoend, double xtol_rel, double minf_max, double ftol_rel, double ftol_abs, int maxeval, double(*f)(int n, double *x, void *objf_data), void *objf_data, int verbose, bobyqa_data *bdata)