4 #include "nlopt-util.h"
7 /* Common Block Declarations */
10 double fx, ldt, dmin__;
15 double v[400] /* was [20][20] */, q0[20], q1[20], qa, qb, qc, qd0,
19 /* Table of constant values */
21 static int pow_ii(int x, int n) /* compute x^n, n >= 0 */
26 else { n >>= 1; x *= x; }
31 static void minfit_(int *m, int *n, double *machep,
32 double *tol, double *ab, double *q);
33 static void min_(int n, int j, int nits, double *d2, double *x1, double *f1, int fk, praxis_func f, void *f_data, double *x, double *t, double *machep, double *h__, struct global_s *global_1, struct q_s *q_1);
34 static double flin_(int n, int j, double *l, praxis_func f, void *f_data, double *x, int *nf, struct q_s *q_1);
35 static void sort_(int *m, int *n, double *d__, double *v);
36 static void quad_(int *n, praxis_func f, void *f_data, double *x, double *t,
37 double *machep, double *h__, struct global_s *global_1, struct q_s *q_1);
39 double praxis_(double *t0, double *machep, double *h0,
40 int *n, double *x, praxis_func f, void *f_data)
42 /* System generated locals */
47 struct global_s global_1;
53 double s, t, y[20], z__[20], f1;
55 double m2, m4, t2, df, dn;
67 double ldfac, large, small, value;
71 /* LAST MODIFIED 3/1/73 */
73 /* PRAXIS RETURNS THE MINIMUM OF THE FUNCTION F(N,X) OF N VARIABLES */
74 /* USING THE PRINCIPAL AXIS METHOD. THE GRADIENT OF THE FUNCTION IS */
77 /* FOR A DESCRIPTION OF THE ALGORITHM, SEE CHAPTER SEVEN OF */
78 /* "ALGORITHMS FOR FINDING ZEROS AND EXTREMA OF FUNCTIONS WITHOUT */
79 /* CALCULATING DERIVATIVES" BY RICHARD P BRENT. */
81 /* THE PARAMETERS ARE: */
82 /* T0 IS A TOLERANCE. PRAXIS ATTEMPTS TO RETURN PRAXIS=F(X) */
83 /* SUCH THAT IF X0 IS THE TRUE LOCAL MINIMUM NEAR X, THEN */
84 /* NORM(X-X0) < T0 + SQUAREROOT(MACHEP)*NORM(X). */
85 /* MACHEP IS THE MACHINE PRECISION, THE SMALLEST NUMBER SUCH THAT */
86 /* 1 + MACHEP > 1. MACHEP SHOULD BE 16.**-13 (ABOUT */
87 /* 2.22D-16) FOR REAL*8 ARITHMETIC ON THE IBM 360. */
88 /* H0 IS THE MAXIMUM STEP SIZE. H0 SHOULD BE SET TO ABOUT THE */
89 /* MAXIMUM DISTANCE FROM THE INITIAL GUESS TO THE MINIMUM. */
90 /* (IF H0 IS SET TOO LARGE OR TOO SMALL, THE INITIAL RATE OF */
91 /* CONVERGENCE MAY BE SLOW.) */
92 /* N (AT LEAST TWO) IS THE NUMBER OF VARIABLES UPON WHICH */
93 /* THE FUNCTION DEPENDS. */
94 /* X IS AN ARRAY CONTAINING ON ENTRY A GUESS OF THE POINT OF */
95 /* MINIMUM, ON RETURN THE ESTIMATED POINT OF MINIMUM. */
96 /* F(N,X) IS THE FUNCTION TO BE MINIMIZED. F SHOULD BE A REAL*8 */
97 /* FUNCTION DECLARED EXTERNAL IN THE CALLING PROGRAM. */
98 /* THE APPROXIMATING QUADRATIC FORM IS */
99 /* Q(X') = F(N,X) + (1/2) * (X'-X)-TRANSPOSE * A * (X'-X) */
100 /* WHERE X IS THE BEST ESTIMATE OF THE MINIMUM AND A IS */
101 /* INVERSE(V-TRANSPOSE) * D * INVERSE(V) */
102 /* (V(*,*) IS THE MATRIX OF SEARCH DIRECTIONS; D(*) IS THE ARRAY */
103 /* OF SECOND DIFFERENCES). IF F HAS CONTINUOUS SECOND DERIVATIVES */
104 /* NEAR X0, A WILL TEND TO THE HESSIAN OF F AT X0 AS X APPROACHES X0. */
106 /* IT IS ASSUMED THAT ON FLOATING-POINT UNDERFLOW THE RESULT IS SET */
108 /* THE USER SHOULD OBSERVE THE COMMENT ON HEURISTIC NUMBERS AFTER */
109 /* THE INITIALIZATION OF MACHINE DEPENDENT NUMBERS. */
112 /* .....IF N>20 OR IF N<20 AND YOU NEED MORE SPACE, CHANGE '20' TO THE */
113 /* LARGEST VALUE OF N IN THE NEXT CARD, IN THE CARD 'IDIM=20', AND */
114 /* IN THE DIMENSION STATEMENTS IN SUBROUTINES MINFIT,MIN,FLIN,QUAD. */
117 /* .....INITIALIZATION..... */
118 /* MACHINE DEPENDENT NUMBERS: */
120 /* Parameter adjustments */
124 small = *machep * *machep;
125 vsmall = small * small;
127 vlarge = 1. / vsmall;
131 /* HEURISTIC NUMBERS: */
132 /* IF THE AXES MAY BE BADLY SCALED (WHICH IS TO BE AVOIDED IF */
133 /* POSSIBLE), THEN SET SCBD=10. OTHERWISE SET SCBD=1. */
134 /* IF THE PROBLEM IS KNOWN TO BE ILL-CONDITIONED, SET ILLC=TRUE. */
135 /* OTHERWISE SET ILLC=FALSE. */
136 /* KTM IS THE NUMBER OF ITERATIONS WITHOUT IMPROVEMENT BEFORE THE */
137 /* ALGORITHM TERMINATES. KTM=4 IS VERY CAUTIOUS; USUALLY KTM=1 */
138 /* IS SATISFACTORY. */
141 illc = 0 /* false */;
151 global_1.fx = f(*n, &x[1], f_data);
152 q_1.qf1 = global_1.fx;
153 t = small + fabs(*t0);
155 global_1.dmin__ = small;
161 /* .....THE FIRST SET OF SEARCH DIRECTIONS V IS THE IDENTITY MATRIX..... */
163 for (i__ = 1; i__ <= i__1; ++i__) {
165 for (j = 1; j <= i__2; ++j) {
167 q_1.v[i__ + j * 20 - 21] = 0.;
170 q_1.v[i__ + i__ * 20 - 21] = 1.;
175 for (i__ = 1; i__ <= i__1; ++i__) {
176 q_1.q0[i__ - 1] = x[i__];
178 q_1.q1[i__ - 1] = x[i__];
181 /* .....THE MAIN LOOP STARTS HERE..... */
187 /* .....MINIMIZE ALONG THE FIRST DIRECTION V(*,1). */
188 /* FX MUST BE PASSED TO MIN BY VALUE. */
190 min_(*n, 1, 2, d__, &s, &value, 0, f,f_data, &x[1], &t,
191 machep, &h__, &global_1, &q_1);
196 for (i__ = 1; i__ <= i__1; ++i__) {
198 q_1.v[i__ - 1] = -q_1.v[i__ - 1];
201 if (sf > d__[0] * .9 && sf * .9 < d__[0]) {
205 for (i__ = 2; i__ <= i__1; ++i__) {
210 /* .....THE INNER LOOP STARTS HERE..... */
213 for (k = 2; k <= i__1; ++k) {
215 for (i__ = 1; i__ <= i__2; ++i__) {
227 /* .....A RANDOM STEP FOLLOWS (TO AVOID RESOLUTION VALLEYS). */
228 /* PRAXIS ASSUMES THAT RANDOM RETURNS A RANDOM NUMBER UNIFORMLY */
229 /* DISTRIBUTED IN (0,1). */
235 for (i__ = 1; i__ <= i__2; ++i__) {
236 s = (global_1.ldt * .1 + t2 * pow_ii(10, kt))
237 * nlopt_urand(-.5,.5);
238 /* was: (random_(n) - .5); */
241 for (j = 1; j <= i__3; ++j) {
243 x[j] += s * q_1.v[j + i__ * 20 - 21];
247 global_1.fx = (*f)(*n, &x[1], f_data);
250 /* .....MINIMIZE ALONG THE "NON-CONJUGATE" DIRECTIONS V(*,K),...,V(*,N) */
254 for (k2 = k; k2 <= i__2; ++k2) {
258 min_(*n, k2, 2, &d__[k2 - 1], &s, &value, 0, f,f_data, &
259 x[1], &t, machep, &h__, &global_1, &q_1);
263 s = sl - global_1.fx;
266 /* Computing 2nd power */
267 d__1 = s + z__[k2 - 1];
268 s = d__[k2 - 1] * (d__1 * d__1);
278 if (illc || df >= (d__1 = *machep * 100 * global_1.fx, fabs(d__1))) {
282 /* .....IF THERE WAS NOT MUCH IMPROVEMENT ON THE FIRST TRY, SET */
283 /* ILLC=TRUE AND START THE INNER LOOP AGAIN..... */
289 /* .....MINIMIZE ALONG THE "CONJUGATE" DIRECTIONS V(*,1),...,V(*,K-1) */
293 for (k2 = 1; k2 <= i__2; ++k2) {
296 min_(*n, k2, 2, &d__[k2 - 1], &s, &value, 0, f,f_data, &
297 x[1], &t, machep, &h__, &global_1, &q_1);
304 for (i__ = 1; i__ <= i__2; ++i__) {
317 /* .....DISCARD DIRECTION V(*,KL). */
318 /* IF NO RANDOM STEP WAS TAKEN, V(*,KL) IS THE "NON-CONJUGATE" */
319 /* DIRECTION ALONG WHICH THE GREATEST IMPROVEMENT WAS MADE..... */
326 for (ii = 1; ii <= i__2; ++ii) {
329 for (j = 1; j <= i__3; ++j) {
331 q_1.v[j + (i__ + 1) * 20 - 21] = q_1.v[j + i__ * 20 - 21];
334 d__[i__] = d__[i__ - 1];
339 for (i__ = 1; i__ <= i__2; ++i__) {
341 q_1.v[i__ + k * 20 - 21] = y[i__ - 1] / lds;
344 /* .....MINIMIZE ALONG THE NEW "CONJUGATE" DIRECTION V(*,K), WHICH IS */
345 /* THE NORMALIZED VECTOR: (NEW X) - (0LD X)..... */
348 min_(*n, k, 4, &d__[k - 1], &lds, &value, 1, f,f_data, &x[1],
349 &t, machep, &h__, &global_1, &q_1);
355 for (i__ = 1; i__ <= i__2; ++i__) {
357 q_1.v[i__ + k * 20 - 21] = -q_1.v[i__ + k * 20 - 21];
360 global_1.ldt = ldfac * global_1.ldt;
361 if (global_1.ldt < lds) {
366 for (i__ = 1; i__ <= i__2; ++i__) {
368 /* Computing 2nd power */
372 t2 = m2 * sqrt(t2) + t;
374 /* .....SEE WHETHER THE LENGTH OF THE STEP TAKEN SINCE STARTING THE */
375 /* INNER LOOP EXCEEDS HALF THE TOLERANCE..... */
377 if (global_1.ldt > t2 * .5f) {
386 /* .....THE INNER LOOP ENDS HERE. */
388 /* TRY QUADRATIC EXTRAPOLATION IN CASE WE ARE IN A CURVED VALLEY. */
391 quad_(n, f,f_data, &x[1], &t, machep, &h__, &global_1, &q_1);
394 for (i__ = 1; i__ <= i__1; ++i__) {
395 d__[i__ - 1] = 1. / sqrt(d__[i__ - 1]);
396 if (dn < d__[i__ - 1]) {
402 for (j = 1; j <= i__1; ++j) {
405 for (i__ = 1; i__ <= i__2; ++i__) {
407 q_1.v[i__ + j * 20 - 21] = s * q_1.v[i__ + j * 20 - 21];
411 /* .....SCALE THE AXES TO TRY TO REDUCE THE CONDITION NUMBER..... */
418 for (i__ = 1; i__ <= i__2; ++i__) {
421 for (j = 1; j <= i__1; ++j) {
423 sl += q_1.v[i__ + j * 20 - 21] * q_1.v[i__ + j * 20 - 21];
425 z__[i__ - 1] = sqrt(sl);
426 if (z__[i__ - 1] < m4) {
429 if (s > z__[i__ - 1]) {
435 for (i__ = 1; i__ <= i__2; ++i__) {
436 sl = s / z__[i__ - 1];
437 z__[i__ - 1] = 1. / sl;
438 if (z__[i__ - 1] <= scbd) {
445 for (j = 1; j <= i__1; ++j) {
447 q_1.v[i__ + j * 20 - 21] = sl * q_1.v[i__ + j * 20 - 21];
452 /* .....CALCULATE A NEW SET OF ORTHOGONAL DIRECTIONS BEFORE REPEATING */
454 /* FIRST TRANSPOSE V FOR MINFIT: */
458 for (i__ = 2; i__ <= i__2; ++i__) {
461 for (j = 1; j <= i__1; ++j) {
462 s = q_1.v[i__ + j * 20 - 21];
463 q_1.v[i__ + j * 20 - 21] = q_1.v[j + i__ * 20 - 21];
465 q_1.v[j + i__ * 20 - 21] = s;
470 /* .....CALL MINFIT TO FIND THE SINGULAR VALUE DECOMPOSITION OF V. */
471 /* THIS GIVES THE PRINCIPAL VALUES AND PRINCIPAL DIRECTIONS OF THE */
472 /* APPROXIMATING QUADRATIC FORM WITHOUT SQUARING THE CONDITION */
475 minfit_(&idim, n, machep, &vsmall, q_1.v, d__);
477 /* .....UNSCALE THE AXES..... */
483 for (i__ = 1; i__ <= i__2; ++i__) {
486 for (j = 1; j <= i__1; ++j) {
488 q_1.v[i__ + j * 20 - 21] = s * q_1.v[i__ + j * 20 - 21];
493 for (i__ = 1; i__ <= i__2; ++i__) {
496 for (j = 1; j <= i__1; ++j) {
498 /* Computing 2nd power */
499 d__1 = q_1.v[j + i__ * 20 - 21];
503 d__[i__ - 1] = s * d__[i__ - 1];
506 for (j = 1; j <= i__1; ++j) {
508 q_1.v[j + i__ * 20 - 21] = s * q_1.v[j + i__ * 20 - 21];
515 for (i__ = 1; i__ <= i__2; ++i__) {
516 dni = dn * d__[i__ - 1];
523 d__[i__ - 1] = 1 / (dni * dni);
526 d__[i__ - 1] = vlarge;
529 d__[i__ - 1] = vsmall;
534 /* .....SORT THE EIGENVALUES AND EIGENVECTORS..... */
536 sort_(&idim, n, d__, q_1.v);
537 global_1.dmin__ = d__[*n - 1];
538 if (global_1.dmin__ < small) {
539 global_1.dmin__ = small;
541 illc = 0 /* false */;
542 if (m2 * d__[0] > global_1.dmin__) {
546 /* .....THE MAIN LOOP ENDS HERE..... */
550 /* .....RETURN..... */
553 ret_val = global_1.fx;
557 static void minfit_(int *m, int *n, double *machep,
558 double *tol, double *ab, double *q)
560 /* System generated locals */
561 int ab_dim1, ab_offset, i__1, i__2, i__3;
564 /* Local variables */
565 double c__, e[20], f, g, h__;
568 int l2, ii, kk, kt, ll2, lp1;
571 /* ...AN IMPROVED VERSION OF MINFIT (SEE GOLUB AND REINSCH, 1969) */
572 /* RESTRICTED TO M=N,P=0. */
573 /* THE SINGULAR VALUES OF THE ARRAY AB ARE RETURNED IN Q AND AB IS */
574 /* OVERWRITTEN WITH THE ORTHOGONAL MATRIX V SUCH THAT U.DIAG(Q) = AB.V, */
575 /* WHERE U IS ANOTHER ORTHOGONAL MATRIX. */
576 /* ...HOUSEHOLDER'S REDUCTION TO BIDIAGONAL FORM... */
577 /* Parameter adjustments */
580 ab_offset = 1 + ab_dim1;
591 for (i__ = 1; i__ <= i__1; ++i__) {
596 for (j = i__; j <= i__2; ++j) {
598 /* Computing 2nd power */
599 d__1 = ab[j + i__ * ab_dim1];
606 f = ab[i__ + i__ * ab_dim1];
612 ab[i__ + i__ * ab_dim1] = f - g;
617 for (j = l; j <= i__2; ++j) {
620 for (k = i__; k <= i__3; ++k) {
622 f += ab[k + i__ * ab_dim1] * ab[k + j * ab_dim1];
626 for (k = i__; k <= i__3; ++k) {
628 ab[k + j * ab_dim1] += f * ab[k + i__ * ab_dim1];
638 for (j = l; j <= i__3; ++j) {
640 s += ab[i__ + j * ab_dim1] * ab[i__ + j * ab_dim1];
650 f = ab[i__ + (i__ + 1) * ab_dim1];
660 ab[i__ + (i__ + 1) * ab_dim1] = f - g;
662 for (j = l; j <= i__3; ++j) {
664 e[j - 1] = ab[i__ + j * ab_dim1] / h__;
667 for (j = l; j <= i__3; ++j) {
670 for (k = l; k <= i__2; ++k) {
672 s += ab[j + k * ab_dim1] * ab[i__ + k * ab_dim1];
675 for (k = l; k <= i__2; ++k) {
677 ab[j + k * ab_dim1] += s * e[k - 1];
681 y = (d__1 = q[i__], fabs(d__1)) + (d__2 = e[i__ - 1], fabs(d__2));
687 /* ...ACCUMULATION OF RIGHT-HAND TRANSFORMATIONS... */
688 ab[*n + *n * ab_dim1] = 1.;
692 for (ii = 2; ii <= i__1; ++ii) {
697 h__ = ab[i__ + (i__ + 1) * ab_dim1] * g;
699 for (j = l; j <= i__2; ++j) {
701 ab[j + i__ * ab_dim1] = ab[i__ + j * ab_dim1] / h__;
704 for (j = l; j <= i__2; ++j) {
707 for (k = l; k <= i__3; ++k) {
709 s += ab[i__ + k * ab_dim1] * ab[k + j * ab_dim1];
712 for (k = l; k <= i__3; ++k) {
714 ab[k + j * ab_dim1] += s * ab[k + i__ * ab_dim1];
719 for (j = l; j <= i__3; ++j) {
720 ab[i__ + j * ab_dim1] = 0.;
722 ab[j + i__ * ab_dim1] = 0.;
724 ab[i__ + i__ * ab_dim1] = 1.;
729 /* ...DIAGONALIZATION OF THE BIDIAGONAL FORM... */
733 for (kk = 1; kk <= i__1; ++kk) {
742 /* fprintf(stderr, "QR failed\n"); */
745 for (ll2 = 1; ll2 <= i__3; ++ll2) {
748 if ((d__1 = e[l - 1], fabs(d__1)) <= eps) {
754 if ((d__1 = q[l - 1], fabs(d__1)) <= eps) {
760 /* ...CANCELLATION OF E(L) IF L>1... */
765 for (i__ = l; i__ <= i__3; ++i__) {
767 e[i__ - 1] = c__ * e[i__ - 1];
768 if (fabs(f) <= eps) {
772 /* ...Q(I) = H = DSQRT(G*G + F*F)... */
773 if (fabs(f) < fabs(g)) {
785 /* Computing 2nd power */
787 h__ = fabs(f) * sqrt(d__1 * d__1 + 1);
790 /* Computing 2nd power */
792 h__ = fabs(g) * sqrt(d__1 * d__1 + 1);
805 /* ...TEST FOR CONVERGENCE... */
811 /* ...SHIFT FROM BOTTOM 2*2 MINOR... */
816 f = ((y - z__) * (y + z__) + (g - h__) * (g + h__)) / (h__ * 2 * y);
817 g = sqrt(f * f + 1.);
822 f = ((x - z__) * (x + z__) + h__ * (y / temp - h__)) / x;
823 /* ...NEXT QR TRANSFORMATION... */
831 for (i__ = lp1; i__ <= i__3; ++i__) {
836 if (fabs(f) < fabs(h__)) {
848 /* Computing 2nd power */
850 z__ = fabs(f) * sqrt(d__1 * d__1 + 1);
853 /* Computing 2nd power */
855 z__ = fabs(h__) * sqrt(d__1 * d__1 + 1);
867 g = -x * s + g * c__;
871 for (j = 1; j <= i__2; ++j) {
872 x = ab[j + (i__ - 1) * ab_dim1];
873 z__ = ab[j + i__ * ab_dim1];
874 ab[j + (i__ - 1) * ab_dim1] = x * c__ + z__ * s;
876 ab[j + i__ * ab_dim1] = -x * s + z__ * c__;
878 if (fabs(f) < fabs(h__)) {
890 /* Computing 2nd power */
892 z__ = fabs(f) * sqrt(d__1 * d__1 + 1);
895 /* Computing 2nd power */
897 z__ = fabs(h__) * sqrt(d__1 * d__1 + 1);
910 x = -s * g + c__ * y;
917 /* ...CONVERGENCE: Q(K) IS MADE NON-NEGATIVE... */
924 for (j = 1; j <= i__3; ++j) {
926 ab[j + k * ab_dim1] = -ab[j + k * ab_dim1];
933 q[1] = ab[ab_dim1 + 1];
934 ab[ab_dim1 + 1] = 1.;
937 static void min_(int n, int j, int nits, double *
938 d2, double *x1, double *f1, int fk, praxis_func f, void *f_data, double *
939 x, double *t, double *machep, double *h__, struct global_s *global_1, struct q_s *q_1)
941 /* System generated locals */
945 /* Local variables */
947 double s, d1, f0, f2, m2, m4, t2, x2, fm;
952 /* ...THE SUBROUTINE MIN MINIMIZES F FROM X IN THE DIRECTION V(*,J) UNLESS */
953 /* J IS LESS THAN 1, WHEN A QUADRATIC SEARCH IS MADE IN THE PLANE */
954 /* DEFINED BY Q0,Q1,X. */
955 /* D2 IS EITHER ZERO OR AN APPROXIMATION TO HALF F". */
956 /* ON ENTRY, X1 IS AN ESTIMATE OF THE DISTANCE FROM X TO THE MINIMUM */
957 /* ALONG V(*,J) (OR, IF J=0, A CURVE). ON RETURN, X1 IS THE DISTANCE */
959 /* IF FK=.TRUE., THEN F1 IS FLIN(X1). OTHERWISE X1 AND F1 ARE IGNORED */
960 /* ON ENTRY UNLESS FINAL FX IS GREATER THAN F1. */
961 /* NITS CONTROLS THE NUMBER OF TIMES AN ATTEMPT WILL BE MADE TO HALVE */
963 /* Parameter adjustments */
967 /* Computing 2nd power */
979 /* ...FIND THE STEP SIZE... */
982 for (i__ = 1; i__ <= i__1; ++i__) {
984 /* Computing 2nd power */
991 temp = global_1->dmin__;
993 t2 = m4 * sqrt(fabs(global_1->fx) / temp + s * global_1->ldt) + m2 *
999 t2 = t2 > small ? t2 : small;
1001 d__1 = t2, d__2 = *h__ * .01;
1002 t2 = d__1 < d__2 ? d__1 : d__2;
1003 if (! (fk) || *f1 > fm) {
1009 if (fk && fabs(*x1) >= t2) {
1017 *f1 = flin_(n, j, x1, f,f_data, &x[1], &global_1->nf, q_1);
1028 /* ...EVALUATE FLIN AT ANOTHER POINT AND ESTIMATE THE SECOND DERIVATIVE... */
1033 f2 = flin_(n, j, &x2, f,f_data, &x[1], &global_1->nf, q_1);
1040 *d2 = (x2 * (*f1 - f0) - *x1 * (f2 - f0)) / (*x1 * x2 * (*x1 - x2));
1041 /* ...ESTIMATE THE FIRST DERIVATIVE AT 0... */
1043 d1 = (*f1 - f0) / *x1 - *x1 * *d2;
1045 /* ...PREDICT THE MINIMUM... */
1055 x2 = d1 * -.5 / *d2;
1057 if (fabs(x2) <= *h__) {
1070 /* ...EVALUATE F AT THE PREDICTED MINIMUM... */
1072 f2 = flin_(n, j, &x2, f,f_data, &x[1], &global_1->nf, q_1);
1073 if (k >= nits || f2 <= f0) {
1076 /* ...NO SUCCESS, SO TRY AGAIN... */
1078 if (f0 < *f1 && *x1 * x2 > 0.) {
1083 /* ...INCREMENT THE ONE-DIMENSIONAL SEARCH COUNTER... */
1093 /* ...GET A NEW ESTIMATE OF THE SECOND DERIVATIVE... */
1095 if ((d__1 = x2 * (x2 - *x1), fabs(d__1)) <= small) {
1098 *d2 = (x2 * (*f1 - f0) - *x1 * (fm - f0)) / (*x1 * x2 * (*x1 - x2));
1110 if (sf1 >= global_1->fx) {
1115 /* ...UPDATE X FOR LINEAR BUT NOT PARABOLIC SEARCH... */
1121 for (i__ = 1; i__ <= i__1; ++i__) {
1123 x[i__] += *x1 * q_1->v[i__ + j * 20 - 21];
1127 static double flin_(int n, int j, double *l, praxis_func f, void *f_data, double *x,
1128 int *nf, struct q_s *q_1)
1130 /* System generated locals */
1134 /* Local variables */
1138 /* ...FLIN IS THE FUNCTION OF ONE REAL VARIABLE L THAT IS MINIMIZED */
1139 /* BY THE SUBROUTINE MIN... */
1140 /* Parameter adjustments */
1147 /* ...THE SEARCH IS LINEAR... */
1149 for (i__ = 1; i__ <= i__1; ++i__) {
1151 t[i__ - 1] = x[i__] + *l * q_1->v[i__ + j * 20 - 21];
1154 /* ...THE SEARCH IS ALONG A PARABOLIC SPACE CURVE... */
1156 q_1->qa = *l * (*l - q_1->qd1) / (q_1->qd0 * (q_1->qd0 + q_1->qd1));
1157 q_1->qb = (*l + q_1->qd0) * (q_1->qd1 - *l) / (q_1->qd0 * q_1->qd1);
1158 q_1->qc = *l * (*l + q_1->qd0) / (q_1->qd1 * (q_1->qd0 + q_1->qd1));
1160 for (i__ = 1; i__ <= i__1; ++i__) {
1162 t[i__ - 1] = q_1->qa * q_1->q0[i__ - 1] + q_1->qb * x[i__] + q_1->qc *
1165 /* ...THE FUNCTION EVALUATION COUNTER NF IS INCREMENTED... */
1168 ret_val = f(n, t, f_data);
1172 static void sort_(int *m, int *n, double *d__, double *v)
1174 /* System generated locals */
1175 int v_dim1, v_offset, i__1, i__2;
1177 /* Local variables */
1182 /* ...SORTS THE ELEMENTS OF D(N) INTO DESCENDING ORDER AND MOVES THE */
1183 /* CORRESPONDING COLUMNS OF V(N,N). */
1184 /* M IS THE ROW DIMENSION OF V AS DECLARED IN THE CALLING PROGRAM. */
1185 /* Parameter adjustments */
1187 v_offset = 1 + v_dim1;
1197 for (i__ = 1; i__ <= i__1; ++i__) {
1202 for (j = ip1; j <= i__2; ++j) {
1217 for (j = 1; j <= i__2; ++j) {
1218 s = v[j + i__ * v_dim1];
1219 v[j + i__ * v_dim1] = v[j + k * v_dim1];
1221 v[j + k * v_dim1] = s;
1228 static void quad_(int *n, praxis_func f, void *f_data, double *x, double *t,
1229 double *machep, double *h__, struct global_s *global_1, struct q_s *q_1)
1231 /* System generated locals */
1235 /* Local variables */
1240 /* ...QUAD LOOKS FOR THE MINIMUM OF F ALONG A CURVE DEFINED BY Q0,Q1,X... */
1241 /* Parameter adjustments */
1246 global_1->fx = q_1->qf1;
1250 for (i__ = 1; i__ <= i__1; ++i__) {
1252 l = q_1->q1[i__ - 1];
1254 q_1->q1[i__ - 1] = s;
1256 /* Computing 2nd power */
1258 q_1->qd1 += d__1 * d__1;
1260 q_1->qd1 = sqrt(q_1->qd1);
1263 if (q_1->qd0 <= 0. || q_1->qd1 <= 0. || global_1->nl < *n * 3 * *n) {
1267 min_(*n, 0, 2, &s, &l, &value, 1, f,f_data, &x[1], t, machep,
1268 h__, global_1, q_1);
1269 q_1->qa = l * (l - q_1->qd1) / (q_1->qd0 * (q_1->qd0 + q_1->qd1));
1270 q_1->qb = (l + q_1->qd0) * (q_1->qd1 - l) / (q_1->qd0 * q_1->qd1);
1271 q_1->qc = l * (l + q_1->qd0) / (q_1->qd1 * (q_1->qd0 + q_1->qd1));
1274 global_1->fx = q_1->qf1;
1279 q_1->qd0 = q_1->qd1;
1281 for (i__ = 1; i__ <= i__1; ++i__) {
1282 s = q_1->q0[i__ - 1];
1283 q_1->q0[i__ - 1] = x[i__];
1285 x[i__] = q_1->qa * s + q_1->qb * x[i__] + q_1->qc * q_1->q1[i__ - 1];