75 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
76 if(verbose>0) printf(
"%s()\n", __func__);
88 unsigned int fixedNr=0;
89 for(
unsigned int i=0; i<nlo->
totalNr; i++)
if(nlo->
xdelta[i]<=0.0) fixedNr++;
98 if(verbose>1) printf(
"macheps := %g\n", macheps);
99 double m2=sqrt(macheps);
102 printf(
"m2 := %e\n", m2);
103 printf(
"m4 := %e\n", m4);
105 double small=macheps*macheps;
106 double vsmall=small*small;
107 double large=1.0/small;
108 double vlarge=1.0/vsmall;
110 printf(
"small := %e\n", small);
111 printf(
"vsmall := %e\n", vsmall);
112 printf(
"large := %e\n", large);
113 printf(
"vlarge := %e\n", vlarge);
117 double h=0.0, scbd=1.0, t=0.0, t2;
120 double min=nan(
""), max=nan(
"");
124 if(isnan(min) || nlo->
xdelta[i]<min) min=nlo->
xdelta[i];
125 if(isnan(max) || nlo->
xdelta[i]>max) max=nlo->
xdelta[i];
127 h/=(double)(nlo->
totalNr-fixedNr);
128 t/=(double)(nlo->
totalNr-fixedNr);
129 if(verbose>2) {printf(
"xdelta_min := %g\nxdelta_max := %g\n", min, max); fflush(stdout);}
130 scbd+=log10(max/min);
131 t2=small+fabs(t); t=t2;
132 if(h<100.0*t) h=100.0*t;
135 printf(
"step := %g\n", h);
136 printf(
"scbd := %g\n", scbd);
137 printf(
"t(2) := %g\n", t);
152 if(verbose>2) {printf(
"initializing\n"); fflush(stdout);}
153 unsigned int i, j, dim=nlo->
totalNr;
154 double ldfac;
if(illc) ldfac=0.1;
else ldfac=0.01;
155 unsigned int nl=0, kt=0;
159 double d[dim], y[dim], z[dim];
161 double **v=malloc(dim*
sizeof(
double *));
if(v==NULL) {
165 for(i=0; i<dim; i++) {
166 v[i]=malloc(dim*
sizeof(
double));
173 if(verbose>2) {printf(
"copying parameters\n"); fflush(stdout);}
175 for(i=0; i<dim; i++) p[i]=nlo->
xfull[i];
177 for(i=0; i<dim; i++) {
179 for(j=0; j<dim; j++) v[i][j]=(i==j ? 1.0 : 0.0);
181 double qd0=0.0, q0[dim], q1[dim];
182 for(i=0; i<dim; i++) q1[i]=q0[i]=nlo->
xfull[i];
186 if(verbose>2) {printf(
"evaluating initial guess\n"); fflush(stdout);}
191 for(i=0; i<dim; i++) free(v[i]);
196 if(verbose>1) {printf(
"initial_objfunc := %g\n", fx); fflush(stdout);}
200 double sf, s, dn, qd1=0.0;
201 int done=0, nLoop=0, ret=0;
205 printf(
"\n-------------------------------\nloop %d, with %d fcalls\n", nLoop, nf);
211 ret=praxisMin(0, 2, &d[0], &s, fx, 0, &fx, v, dim, h, t,
212 macheps, m2, m4, small, dmin, ldt, &nl,
213 &nf, qd0, qd1, q0, q1,
216 if(verbose>0) printf(
"Error %d in praxisMin()\n", ret);
217 for(i=0; i<dim; i++) free(v[i]);
223 if((sf<=(0.9*d[0])) || ((0.9*sf)>=d[0]))
for(i=1; i<dim; i++) d[i]=0.0;
226 unsigned int k, kl=0, k2;
227 double sl, df, f1, lds;
228 for(k=1; k<dim; k++) {
229 if(verbose>5) printf(
"direction %d\n", k);
230 for(i=0; i<dim; i++) y[i]=p[i];
231 sf=fx;
if(kt>0) illc=1;
236 for(i=0; i<dim; i++) {
237 z[i]=(0.1*ldt+t2*pow(10.0,(
double)kt)) * (
drand()-0.5);
238 s=z[i];
for(j=0; j<dim; j++) p[j]+=s*v[j][i];
249 for(k2=k; k2<dim; k2++) {
250 if(verbose>6) printf(
" non-conjugate direction %d\n", k2);
252 ret=praxisMin(k2, 2, &d[k2], &s, fx, 0, &fx, v, dim, h, t,
253 macheps, m2, m4, small, dmin, ldt, &nl,
254 &nf, qd0, qd1, q0, q1,
257 if(verbose>0) printf(
"Error %d in praxisMin()\n", ret);
258 for(i=0; i<dim; i++) free(v[i]);
263 if(illc) s=d[k2]*(s+z[k2])*(s+z[k2]);
else s=sl-fx;
264 if(df<s) {df=s; kl=k2;}
267 if(df>=fabs(100.0*macheps*fx))
break;
272 for(k2=0; k2<k; k2++) {
274 if(verbose>6) printf(
" conjugate direction %d\n", k2);
276 ret=praxisMin(k2, 2, &d[k2], &s, fx, 0, &fx, v, dim, h, t,
277 macheps, m2, m4, small, dmin, ldt, &nl,
278 &nf, qd0, qd1, q0, q1,
281 if(verbose>0) printf(
"Error %d in praxisMin()\n", ret);
282 for(i=0; i<dim; i++) free(v[i]);
288 f1=fx; fx=sf; lds=0.0;
289 for(i=0; i<dim; i++) {
290 sl=p[i]; p[i]=y[i]; y[i]=sl-y[i]; sl=y[i]; lds+=sl*sl;
294 for(i=kl-1; i>=k; i--) {
295 for(j=0; j<dim; j++) v[j][i+1]=v[j][i];
298 d[k]=0.0;
for(i=0; i<dim; i++) v[i][k]=y[i]/lds;
299 ret=praxisMin(k, 4, &d[k], &lds, f1, 1, &fx, v, dim, h, t,
300 macheps, m2, m4, small, dmin, ldt, &nl,
301 &nf, qd0, qd1, q0, q1,
304 if(verbose>0) printf(
"Error %d in praxisMin()\n", ret);
305 for(i=0; i<dim; i++) free(v[i]);
310 if(lds<=0.0) {lds=-lds;
for(i=0; i<dim; i++) v[i][k]=-v[i][k];}
312 ldt*=ldfac;
if(ldt<lds) ldt=lds;
313 for(i=0, t2=0.0; i<dim; i++) t2+=p[i]*p[i];
314 t2=sqrt(t2); t2*=m2; t2+=t;
316 if(verbose>1) printf(
" objfunc := %g\n", fx);
319 if(ldt>(0.5*t2)) kt=0;
else kt++;
320 if(verbose>3 && kt>0) printf(
" kt := %d\n", kt);
321 if(kt>ktm) {done=1;
break;}
338 double qa, qb, qc, qs, ql;
339 qs=fx; fx=qf1; qf1=qs;
340 for(i=0, qd1=0.0; i<dim; i++) {
341 qs=p[i]; ql=q1[i]; p[i]=ql; q1[i]=qs;
342 qd1+=(qs-ql)*(qs-ql);
344 qd1=sqrt(qd1); ql=qd1; qs=0.0;
345 if(qd0>0.0 && qd1>0.0 && nl>=3*dim*dim) {
346 ret=praxisMin(-1, 2, &qs, &ql, qf1, 1, &fx, v, dim, h, t,
347 macheps, m2, m4, small, dmin, ldt, &nl,
348 &nf, qd0, qd1, q0, q1,
351 if(verbose>0) printf(
"Error %d in praxisMin()\n", ret);
352 for(i=0; i<dim; i++) free(v[i]);
357 qa = ql*(ql-qd1)/(qd0*(qd0+qd1));
358 qb = (ql+qd0)*(qd1-ql)/(qd0*qd1);
359 qc = ql*(ql+qd0)/(qd1*(qd0+qd1));
361 fx=qf1; qa=qb=0.0; qc=1.0;
363 if(!isfinite(qa)) qa=0.0;
364 if(!isfinite(qb)) qb=0.0;
365 if(!isfinite(qc)) qc=1.0;
367 for(i=0; i<dim; i++) {
368 qs=q0[i]; q0[i]=p[i];
369 p[i]=qa*s + qb*p[i] + qc*q1[i];
373 for(i=0; i<dim; i++) {d[i]=1.0/sqrt(d[i]);
if(dn<d[i]) dn=d[i];}
374 for(j=0; j<dim; j++) {
376 if(isfinite(s))
for(i=0; i<dim; i++) v[i][j]*=s;
381 for(i=0; i<dim; i++) {
383 for(j=0; j<dim; j++) sl+=v[i][j]*v[i][j];
384 z[i]=sqrt(sl);
if(!isfinite(z[i]) || z[i]<m4) z[i]=m4;
387 for(i=0; i<dim; i++) {
388 sl=s/z[i]; z[i]=1.0/sl;
389 if(z[i]>scbd) {sl=1.0/scbd; z[i]=scbd;}
390 for(j=0; j<dim; j++) v[i][j]*=sl;
395 for(i=1; i<dim; i++)
for(j=0; j<i; j++) {
396 s=v[i][j]; v[i][j]=v[j][i]; v[j][i]=s;
401 ret=praxisMinfit((
int)dim, macheps, vsmall, v, d);
403 if(verbose>0) printf(
"Error %d in praxisMinfit()\n", ret);
404 for(i=0; i<dim; i++) free(v[i]);
410 for(i=0; i<dim; i++) {s=z[i];
for(j=0; j<dim; j++) v[i][j]*=s;}
411 for(i=0; i<dim; i++) {
412 s=0.0;
for(j=0; j<dim; j++) s+=v[j][i]*v[j][i];
413 s=sqrt(s); d[i]*=s; s=1.0/s;
for(j=0; j<dim; j++) v[j][i]*=s;
416 for(i=0; i<dim; i++) {
417 if((dn*d[i]) > large) d[i]=vsmall;
418 else if((dn*d[i]) < small) d[i]=vlarge;
419 else d[i]=pow(dn*d[i], -2.0);
422 praxisSort(d, v, dim);
423 dmin=d[dim-1];
if(dmin<small) dmin=small;
424 illc=(m2*d[0]) > dmin;
431 if(verbose>1) printf(
"func_evals := %d\n", nf);
435 for(i=0; i<dim; i++) free(v[i]);
439 for(i=0; i<dim; i++) nlo->
xfull[i]=p[i];
446 if(ldfac>0.0) ldfac=0.0;