39 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
40 if(verbose>1) {printf(
"%s(NLOPT, %d, status)\n", __func__, maxIter); fflush(stdout);}
58 for(fpi=0; fpi<nlo->
totalNr; fpi++) {
60 if(isfinite(nlo->
xdelta[fpi]) && fabs(nlo->
xdelta[fpi])>macheps && isfinite(r) && r>macheps)
67 if(verbose>3) printf(
" index_of_free_parameter := %u\n", fpi);
70 double pmin=nlo->
xlower[fpi];
71 double pmax=nlo->
xupper[fpi];
72 double delta=nlo->
xdelta[fpi];
73 double tol=nlo->
xtol[fpi];
75 printf(
" initial_parameter := %g [%g, %g, %g]\n", nlo->
xfull[fpi], pmin, pmax, delta);
76 if(!(nlo->
xfull[fpi]>=pmin) || !(nlo->
xfull[fpi]<=pmax)) {
81 if(!( (pmax-pmin) > 2.0*delta)) {
87 if(maxIter<100) maxIter=200+(pmax-pmin)/delta;
88 if(verbose>1) printf(
" maxIter := %u\n", maxIter);
91 double p1=0., p2=0., p3=0., f1=0., f2=0., f3=0.;
95 for(
unsigned int i=0; i<nlo->
totalNr; i++) p[i]=nlo->
xfull[i];
98 unsigned int iterNr=1;
99 p2=minp=nlo->
xfull[fpi];
if(p2<pmin+delta) p2=pmin+delta;
else if(p2>pmax-delta) p2=pmax-delta;
118 if(f1<minf) {minf=f1; minp=p1;}
126 if(f3<minf) {minf=f3; minp=p3;}
131 double jump_size=delta;
132 while(!(f1>f2 && f2<f3)) {
134 printf(
" jump_size := %g\n", jump_size);
135 printf(
" bracketing points: %g %g %g -> %g %g %g\n", p1, p2, p3, f1, f2, f3);
136 printf(
" min: %g -> %g\n", minp, minf);
139 if(iterNr>=maxIter)
break;
140 if((p3-p1)<tol)
break;
146 if(p1==pmin || (fabs(f1-f2)<macheps && (pmax-pmin)<jump_size )) {
147 p3=p2; f3=f2; p2=0.5*(p1+p2);
154 if(f2<minf) {minf=f2; minp=p2;}
157 p3=p2; f3=f2; p2=p1; f2=f1;
158 p1-=jump_size;
if(p1<pmin) p1=pmin;
165 if(f1<minf) {minf=f1; minp=p1;}
172 if(p3==pmax || (fabs(f2-f3)<macheps && (pmax-pmin)<jump_size)) {
173 p1=p2; f1=f2; p2=0.5*(p3+p2);
180 if(f2<minf) {minf=f2; minp=p2;}
183 p1=p2; f1=f2; p2=p3; f2=f3;
184 p3+=jump_size;
if(p3>pmax) p3=pmax;
191 if(f3<minf) {minf=f3; minp=p3;}
197 printf(
" brackets ready.\n\n");
199 printf(
" bracketing points: %g %g %g -> %g %g %g\n", p1, p2, p3, f1, f2, f3);
200 printf(
" min: %g -> %g\n", minp, minf);
207 const double tau=0.05;
208 while(iterNr<maxIter && (p3-p1)>tol) {
211 double d=f1*(p3*p3-p2*p2) + f2*(p1*p1-p3*p3) + f3*(p2*p2-p1*p1);
212 double e=2.0*(f1*(p3-p2) + f2*(p1-p3) + f3*(p2-p1));
213 if(fabs(e)<macheps || !isfinite(d/=e)) {
216 if(p1<=d && d<=p3) {minp=d;}
else {minp=d;
if(p1>minp) minp=p1;
if(p3<minp) minp=p3;}
221 d=(p2-p1)*tau;
if(fabs(p1-minp)<d) minp=p1+d;
else if(fabs(p2-minp)<d) minp=p2-d;
223 d=(p3-p2)*tau;
if(fabs(p2-minp)<d) minp=p2+d;
else if(fabs(p3-minp)<d) minp=p3-d;
228 double bracket_ratio=fabs(p1-p2)/fabs(p2-p3);
229 if(!(bracket_ratio<100.0 && bracket_ratio>0.01)) {
231 if(bracket_ratio>1.0 && minp>p2) minp=0.5*(p1+p2);
else if(minp<p2) minp=0.5*(p2+p3);
244 if(f1>minf && minf<f2) {p3=p2; f3=f2; p2=minp; f2=minf;}
else {p1=minp; f1=minf;}
246 if(f2>minf && minf<f3) {p1=p2; f1=f2; p2=minp; f2=minf;}
else {p3=minp; f3=minf;}
250 printf(
" bracketing points: %g %g %g -> %g %g %g\n", p1, p2, p3, f1, f2, f3);
251 printf(
" min: %g -> %g\n", minp, minf);