| [0b990d] | 1 | c Below are the contents of the original file that was used to generate | 
|---|
|  | 2 | c mcsearch.h and mcsearch.cc.  Only the mcsrch and mcstep routines are | 
|---|
|  | 3 | c used.  This file is not compiled or otherwise used. | 
|---|
|  | 4 | C     ---------------------------------------------------------------------- | 
|---|
|  | 5 | C     This file contains the LBFGS algorithm and supporting routines | 
|---|
|  | 6 | C | 
|---|
|  | 7 | C     **************** | 
|---|
|  | 8 | C     LBFGS SUBROUTINE | 
|---|
|  | 9 | C     **************** | 
|---|
|  | 10 | C | 
|---|
|  | 11 | SUBROUTINE LBFGS(N,M,X,F,G,DIAGCO,DIAG,IPRINT,EPS,XTOL,W,IFLAG) | 
|---|
|  | 12 | C | 
|---|
|  | 13 | INTEGER N,M,IPRINT(2),IFLAG | 
|---|
|  | 14 | DOUBLE PRECISION X(N),G(N),DIAG(N),W(N*(2*M+1)+2*M) | 
|---|
|  | 15 | DOUBLE PRECISION F,EPS,XTOL | 
|---|
|  | 16 | INTEGER DIAGCO | 
|---|
|  | 17 | C | 
|---|
|  | 18 | C        LIMITED MEMORY BFGS METHOD FOR LARGE SCALE OPTIMIZATION | 
|---|
|  | 19 | C                          JORGE NOCEDAL | 
|---|
|  | 20 | C                        *** July 1990 *** | 
|---|
|  | 21 | C | 
|---|
|  | 22 | C | 
|---|
|  | 23 | C     This subroutine solves the unconstrained minimization problem | 
|---|
|  | 24 | C | 
|---|
|  | 25 | C                      min F(x),    x= (x1,x2,...,xN), | 
|---|
|  | 26 | C | 
|---|
|  | 27 | C      using the limited memory BFGS method. The routine is especially | 
|---|
|  | 28 | C      effective on problems involving a large number of variables. In | 
|---|
|  | 29 | C      a typical iteration of this method an approximation Hk to the | 
|---|
|  | 30 | C      inverse of the Hessian is obtained by applying M BFGS updates to | 
|---|
|  | 31 | C      a diagonal matrix Hk0, using information from the previous M steps. | 
|---|
|  | 32 | C      The user specifies the number M, which determines the amount of | 
|---|
|  | 33 | C      storage required by the routine. The user may also provide the | 
|---|
|  | 34 | C      diagonal matrices Hk0 if not satisfied with the default choice. | 
|---|
|  | 35 | C      The algorithm is described in "On the limited memory BFGS method | 
|---|
|  | 36 | C      for large scale optimization", by D. Liu and J. Nocedal, | 
|---|
|  | 37 | C      Mathematical Programming B 45 (1989) 503-528. | 
|---|
|  | 38 | C | 
|---|
|  | 39 | C      The user is required to calculate the function value F and its | 
|---|
|  | 40 | C      gradient G. In order to allow the user complete control over | 
|---|
|  | 41 | C      these computations, reverse  communication is used. The routine | 
|---|
|  | 42 | C      must be called repeatedly under the control of the parameter | 
|---|
|  | 43 | C      IFLAG. | 
|---|
|  | 44 | C | 
|---|
|  | 45 | C      The steplength is determined at each iteration by means of the | 
|---|
|  | 46 | C      line search routine MCVSRCH, which is a slight modification of | 
|---|
|  | 47 | C      the routine CSRCH written by More' and Thuente. | 
|---|
|  | 48 | C | 
|---|
|  | 49 | C      The calling statement is | 
|---|
|  | 50 | C | 
|---|
|  | 51 | C          CALL LBFGS(N,M,X,F,G,DIAGCO,DIAG,IPRINT,EPS,XTOL,W,IFLAG) | 
|---|
|  | 52 | C | 
|---|
|  | 53 | C      where | 
|---|
|  | 54 | C | 
|---|
|  | 55 | C     N       is an INTEGER variable that must be set by the user to the | 
|---|
|  | 56 | C             number of variables. It is not altered by the routine. | 
|---|
|  | 57 | C             Restriction: N>0. | 
|---|
|  | 58 | C | 
|---|
|  | 59 | C     M       is an INTEGER variable that must be set by the user to | 
|---|
|  | 60 | C             the number of corrections used in the BFGS update. It | 
|---|
|  | 61 | C             is not altered by the routine. Values of M less than 3 are | 
|---|
|  | 62 | C             not recommended; large values of M will result in excessive | 
|---|
|  | 63 | C             computing time. 3<= M <=7 is recommended. Restriction: M>0. | 
|---|
|  | 64 | C | 
|---|
|  | 65 | C     X       is a DOUBLE PRECISION array of length N. On initial entry | 
|---|
|  | 66 | C             it must be set by the user to the values of the initial | 
|---|
|  | 67 | C             estimate of the solution vector. On exit with IFLAG=0, it | 
|---|
|  | 68 | C             contains the values of the variables at the best point | 
|---|
|  | 69 | C             found (usually a solution). | 
|---|
|  | 70 | C | 
|---|
|  | 71 | C     F       is a DOUBLE PRECISION variable. Before initial entry and on | 
|---|
|  | 72 | C             a re-entry with IFLAG=1, it must be set by the user to | 
|---|
|  | 73 | C             contain the value of the function F at the point X. | 
|---|
|  | 74 | C | 
|---|
|  | 75 | C     G       is a DOUBLE PRECISION array of length N. Before initial | 
|---|
|  | 76 | C             entry and on a re-entry with IFLAG=1, it must be set by | 
|---|
|  | 77 | C             the user to contain the components of the gradient G at | 
|---|
|  | 78 | C             the point X. | 
|---|
|  | 79 | C | 
|---|
|  | 80 | C     DIAGCO  is a LOGICAL variable that must be set to .TRUE. if the | 
|---|
|  | 81 | C             user  wishes to provide the diagonal matrix Hk0 at each | 
|---|
|  | 82 | C             iteration. Otherwise it should be set to .FALSE., in which | 
|---|
|  | 83 | C             case  LBFGS will use a default value described below. If | 
|---|
|  | 84 | C             DIAGCO is set to .TRUE. the routine will return at each | 
|---|
|  | 85 | C             iteration of the algorithm with IFLAG=2, and the diagonal | 
|---|
|  | 86 | C              matrix Hk0  must be provided in the array DIAG. | 
|---|
|  | 87 | C | 
|---|
|  | 88 | C | 
|---|
|  | 89 | C     DIAG    is a DOUBLE PRECISION array of length N. If DIAGCO=.TRUE., | 
|---|
|  | 90 | C             then on initial entry or on re-entry with IFLAG=2, DIAG | 
|---|
|  | 91 | C             it must be set by the user to contain the values of the | 
|---|
|  | 92 | C             diagonal matrix Hk0.  Restriction: all elements of DIAG | 
|---|
|  | 93 | C             must be positive. | 
|---|
|  | 94 | C | 
|---|
|  | 95 | C     IPRINT  is an INTEGER array of length two which must be set by the | 
|---|
|  | 96 | C             user. | 
|---|
|  | 97 | C | 
|---|
|  | 98 | C             IPRINT(1) specifies the frequency of the output: | 
|---|
|  | 99 | C                IPRINT(1) < 0 : no output is generated, | 
|---|
|  | 100 | C                IPRINT(1) = 0 : output only at first and last iteration, | 
|---|
|  | 101 | C                IPRINT(1) > 0 : output every IPRINT(1) iterations. | 
|---|
|  | 102 | C | 
|---|
|  | 103 | C             IPRINT(2) specifies the type of output generated: | 
|---|
|  | 104 | C                IPRINT(2) = 0 : iteration count, number of function | 
|---|
|  | 105 | C                                evaluations, function value, norm of the | 
|---|
|  | 106 | C                                gradient, and steplength, | 
|---|
|  | 107 | C                IPRINT(2) = 1 : same as IPRINT(2)=0, plus vector of | 
|---|
|  | 108 | C                                variables and  gradient vector at the | 
|---|
|  | 109 | C                                initial point, | 
|---|
|  | 110 | C                IPRINT(2) = 2 : same as IPRINT(2)=1, plus vector of | 
|---|
|  | 111 | C                                variables, | 
|---|
|  | 112 | C                IPRINT(2) = 3 : same as IPRINT(2)=2, plus gradient vector. | 
|---|
|  | 113 | C | 
|---|
|  | 114 | C | 
|---|
|  | 115 | C     EPS     is a positive DOUBLE PRECISION variable that must be set by | 
|---|
|  | 116 | C             the user, and determines the accuracy with which the solution | 
|---|
|  | 117 | C             is to be found. The subroutine terminates when | 
|---|
|  | 118 | C | 
|---|
|  | 119 | C                         ||G|| < EPS max(1,||X||), | 
|---|
|  | 120 | C | 
|---|
|  | 121 | C             where ||.|| denotes the Euclidean norm. | 
|---|
|  | 122 | C | 
|---|
|  | 123 | C     XTOL    is a  positive DOUBLE PRECISION variable that must be set by | 
|---|
|  | 124 | C             the user to an estimate of the machine precision (e.g. | 
|---|
|  | 125 | C             10**(-16) on a SUN station 3/60). The line search routine will | 
|---|
|  | 126 | C             terminate if the relative width of the interval of uncertainty | 
|---|
|  | 127 | C             is less than XTOL. | 
|---|
|  | 128 | C | 
|---|
|  | 129 | C     W       is a DOUBLE PRECISION array of length N(2M+1)+2M used as | 
|---|
|  | 130 | C             workspace for LBFGS. This array must not be altered by the | 
|---|
|  | 131 | C             user. | 
|---|
|  | 132 | C | 
|---|
|  | 133 | C     IFLAG   is an INTEGER variable that must be set to 0 on initial entry | 
|---|
|  | 134 | C             to the subroutine. A return with IFLAG<0 indicates an error, | 
|---|
|  | 135 | C             and IFLAG=0 indicates that the routine has terminated without | 
|---|
|  | 136 | C             detecting errors. On a return with IFLAG=1, the user must | 
|---|
|  | 137 | C             evaluate the function F and gradient G. On a return with | 
|---|
|  | 138 | C             IFLAG=2, the user must provide the diagonal matrix Hk0. | 
|---|
|  | 139 | C | 
|---|
|  | 140 | C             The following negative values of IFLAG, detecting an error, | 
|---|
|  | 141 | C             are possible: | 
|---|
|  | 142 | C | 
|---|
|  | 143 | C              IFLAG=-1  The line search routine MCSRCH failed. The | 
|---|
|  | 144 | C                        parameter INFO provides more detailed information | 
|---|
|  | 145 | C                        (see also the documentation of MCSRCH): | 
|---|
|  | 146 | C | 
|---|
|  | 147 | C                       INFO = 0  IMPROPER INPUT PARAMETERS. | 
|---|
|  | 148 | C | 
|---|
|  | 149 | C                       INFO = 2  RELATIVE WIDTH OF THE INTERVAL OF | 
|---|
|  | 150 | C                                 UNCERTAINTY IS AT MOST XTOL. | 
|---|
|  | 151 | C | 
|---|
|  | 152 | C                       INFO = 3  MORE THAN 20 FUNCTION EVALUATIONS WERE | 
|---|
|  | 153 | C                                 REQUIRED AT THE PRESENT ITERATION. | 
|---|
|  | 154 | C | 
|---|
|  | 155 | C                       INFO = 4  THE STEP IS TOO SMALL. | 
|---|
|  | 156 | C | 
|---|
|  | 157 | C                       INFO = 5  THE STEP IS TOO LARGE. | 
|---|
|  | 158 | C | 
|---|
|  | 159 | C                       INFO = 6  ROUNDING ERRORS PREVENT FURTHER PROGRESS. | 
|---|
|  | 160 | C                                 THERE MAY NOT BE A STEP WHICH SATISFIES | 
|---|
|  | 161 | C                                 THE SUFFICIENT DECREASE AND CURVATURE | 
|---|
|  | 162 | C                                 CONDITIONS. TOLERANCES MAY BE TOO SMALL. | 
|---|
|  | 163 | C | 
|---|
|  | 164 | C | 
|---|
|  | 165 | C              IFLAG=-2  The i-th diagonal element of the diagonal inverse | 
|---|
|  | 166 | C                        Hessian approximation, given in DIAG, is not | 
|---|
|  | 167 | C                        positive. | 
|---|
|  | 168 | C | 
|---|
|  | 169 | C              IFLAG=-3  Improper input parameters for LBFGS (N or M are | 
|---|
|  | 170 | C                        not positive). | 
|---|
|  | 171 | C | 
|---|
|  | 172 | C | 
|---|
|  | 173 | C | 
|---|
|  | 174 | C    ON THE DRIVER: | 
|---|
|  | 175 | C | 
|---|
|  | 176 | C    The program that calls LBFGS must contain the declaration: | 
|---|
|  | 177 | C | 
|---|
|  | 178 | C                       EXTERNAL LB2 | 
|---|
|  | 179 | C | 
|---|
|  | 180 | C    LB2 is a BLOCK DATA that defines the default values of several | 
|---|
|  | 181 | C    parameters described in the COMMON section. | 
|---|
|  | 182 | C | 
|---|
|  | 183 | C | 
|---|
|  | 184 | C | 
|---|
|  | 185 | C    COMMON: | 
|---|
|  | 186 | C | 
|---|
|  | 187 | C     The subroutine contains one common area, which the user may wish to | 
|---|
|  | 188 | C    reference: | 
|---|
|  | 189 | C | 
|---|
|  | 190 | COMMON /LB3/MP,LP,GTOL,STPMIN,STPMAX | 
|---|
|  | 191 | C | 
|---|
|  | 192 | C    MP  is an INTEGER variable with default value 6. It is used as the | 
|---|
|  | 193 | C        unit number for the printing of the monitoring information | 
|---|
|  | 194 | C        controlled by IPRINT. | 
|---|
|  | 195 | C | 
|---|
|  | 196 | C    LP  is an INTEGER variable with default value 6. It is used as the | 
|---|
|  | 197 | C        unit number for the printing of error messages. This printing | 
|---|
|  | 198 | C        may be suppressed by setting LP to a non-positive value. | 
|---|
|  | 199 | C | 
|---|
|  | 200 | C    GTOL is a DOUBLE PRECISION variable with default value 0.9, which | 
|---|
|  | 201 | C        controls the accuracy of the line search routine MCSRCH. If the | 
|---|
|  | 202 | C        function and gradient evaluations are inexpensive with respect | 
|---|
|  | 203 | C        to the cost of the iteration (which is sometimes the case when | 
|---|
|  | 204 | C        solving very large problems) it may be advantageous to set GTOL | 
|---|
|  | 205 | C        to a small value. A typical small value is 0.1.  Restriction: | 
|---|
|  | 206 | C        GTOL should be greater than 1.D-04. | 
|---|
|  | 207 | C | 
|---|
|  | 208 | C    STPMIN and STPMAX are non-negative DOUBLE PRECISION variables which | 
|---|
|  | 209 | C        specify lower and uper bounds for the step in the line search. | 
|---|
|  | 210 | C        Their default values are 1.D-20 and 1.D+20, respectively. These | 
|---|
|  | 211 | C        values need not be modified unless the exponents are too large | 
|---|
|  | 212 | C        for the machine being used, or unless the problem is extremely | 
|---|
|  | 213 | C        badly scaled (in which case the exponents should be increased). | 
|---|
|  | 214 | C | 
|---|
|  | 215 | C | 
|---|
|  | 216 | C  MACHINE DEPENDENCIES | 
|---|
|  | 217 | C | 
|---|
|  | 218 | C        The only variables that are machine-dependent are XTOL, | 
|---|
|  | 219 | C        STPMIN and STPMAX. | 
|---|
|  | 220 | C | 
|---|
|  | 221 | C | 
|---|
|  | 222 | C  GENERAL INFORMATION | 
|---|
|  | 223 | C | 
|---|
|  | 224 | C    Other routines called directly:  DAXPY, DDOT, LB1, MCSRCH | 
|---|
|  | 225 | C | 
|---|
|  | 226 | C    Input/Output  :  No input; diagnostic messages on unit MP and | 
|---|
|  | 227 | C                     error messages on unit LP. | 
|---|
|  | 228 | C | 
|---|
|  | 229 | C | 
|---|
|  | 230 | C     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
|---|
|  | 231 | C | 
|---|
|  | 232 | DOUBLE PRECISION GTOL,ONE,ZERO,GNORM,DDOT,STP1,FTOL,STPMIN, | 
|---|
|  | 233 | .                 STPMAX,STP,YS,YY,SQ,YR,BETA,XNORM | 
|---|
|  | 234 | INTEGER MP,LP,ITER,NFUN,POINT,ISPT,IYPT,MAXFEV,INFO, | 
|---|
|  | 235 | .        BOUND,NPT,CP,I,NFEV,INMC,IYCN,ISCN | 
|---|
|  | 236 | LOGICAL FINISH | 
|---|
|  | 237 | C | 
|---|
|  | 238 | SAVE | 
|---|
|  | 239 | DATA ONE,ZERO/1.0D+0,0.0D+0/ | 
|---|
|  | 240 | C | 
|---|
|  | 241 | C     INITIALIZE | 
|---|
|  | 242 | C     ---------- | 
|---|
|  | 243 | C | 
|---|
|  | 244 | IF(IFLAG.EQ.0) GO TO 10 | 
|---|
|  | 245 | GO TO (172,100) IFLAG | 
|---|
|  | 246 | 10  ITER= 0 | 
|---|
|  | 247 | IF(N.LE.0.OR.M.LE.0) GO TO 196 | 
|---|
|  | 248 | IF(GTOL.LE.1.D-04) THEN | 
|---|
|  | 249 | IF(LP.GT.0) WRITE(LP,245) | 
|---|
|  | 250 | GTOL=9.D-01 | 
|---|
|  | 251 | ENDIF | 
|---|
|  | 252 | NFUN= 1 | 
|---|
|  | 253 | POINT= 0 | 
|---|
|  | 254 | FINISH= .FALSE. | 
|---|
|  | 255 | IF(DIAGCO.NE.0) THEN | 
|---|
|  | 256 | DO 30 I=1,N | 
|---|
|  | 257 | 30      IF (DIAG(I).LE.ZERO) GO TO 195 | 
|---|
|  | 258 | ELSE | 
|---|
|  | 259 | DO 40 I=1,N | 
|---|
|  | 260 | 40      DIAG(I)= 1.0D0 | 
|---|
|  | 261 | ENDIF | 
|---|
|  | 262 | C | 
|---|
|  | 263 | C     THE WORK VECTOR W IS DIVIDED AS FOLLOWS: | 
|---|
|  | 264 | C     --------------------------------------- | 
|---|
|  | 265 | C     THE FIRST N LOCATIONS ARE USED TO STORE THE GRADIENT AND | 
|---|
|  | 266 | C         OTHER TEMPORARY INFORMATION. | 
|---|
|  | 267 | C     LOCATIONS (N+1)...(N+M) STORE THE SCALARS RHO. | 
|---|
|  | 268 | C     LOCATIONS (N+M+1)...(N+2M) STORE THE NUMBERS ALPHA USED | 
|---|
|  | 269 | C         IN THE FORMULA THAT COMPUTES H*G. | 
|---|
|  | 270 | C     LOCATIONS (N+2M+1)...(N+2M+NM) STORE THE LAST M SEARCH | 
|---|
|  | 271 | C         STEPS. | 
|---|
|  | 272 | C     LOCATIONS (N+2M+NM+1)...(N+2M+2NM) STORE THE LAST M | 
|---|
|  | 273 | C         GRADIENT DIFFERENCES. | 
|---|
|  | 274 | C | 
|---|
|  | 275 | C     THE SEARCH STEPS AND GRADIENT DIFFERENCES ARE STORED IN A | 
|---|
|  | 276 | C     CIRCULAR ORDER CONTROLLED BY THE PARAMETER POINT. | 
|---|
|  | 277 | C | 
|---|
|  | 278 | ISPT= N+2*M | 
|---|
|  | 279 | IYPT= ISPT+N*M | 
|---|
|  | 280 | DO 50 I=1,N | 
|---|
|  | 281 | 50   W(ISPT+I)= -G(I)*DIAG(I) | 
|---|
|  | 282 | GNORM= DSQRT(DDOT(N,G,1,G,1)) | 
|---|
|  | 283 | STP1= ONE/GNORM | 
|---|
|  | 284 | C | 
|---|
|  | 285 | C     PARAMETERS FOR LINE SEARCH ROUTINE | 
|---|
|  | 286 | C | 
|---|
|  | 287 | FTOL= 1.0D-4 | 
|---|
|  | 288 | MAXFEV= 20 | 
|---|
|  | 289 | C | 
|---|
|  | 290 | IF(IPRINT(1).GE.0) CALL LB1(IPRINT,ITER,NFUN, | 
|---|
|  | 291 | *                     GNORM,N,M,X,F,G,STP,FINISH) | 
|---|
|  | 292 | C | 
|---|
|  | 293 | C    -------------------- | 
|---|
|  | 294 | C     MAIN ITERATION LOOP | 
|---|
|  | 295 | C    -------------------- | 
|---|
|  | 296 | C | 
|---|
|  | 297 | 80   ITER= ITER+1 | 
|---|
|  | 298 | INFO=0 | 
|---|
|  | 299 | BOUND=ITER-1 | 
|---|
|  | 300 | IF(ITER.EQ.1) GO TO 165 | 
|---|
|  | 301 | IF (ITER .GT. M)BOUND=M | 
|---|
|  | 302 | C | 
|---|
|  | 303 | YS= DDOT(N,W(IYPT+NPT+1),1,W(ISPT+NPT+1),1) | 
|---|
|  | 304 | IF(DIAGCO.EQ.0) THEN | 
|---|
|  | 305 | YY= DDOT(N,W(IYPT+NPT+1),1,W(IYPT+NPT+1),1) | 
|---|
|  | 306 | DO 90 I=1,N | 
|---|
|  | 307 | 90    DIAG(I)= YS/YY | 
|---|
|  | 308 | ELSE | 
|---|
|  | 309 | IFLAG=2 | 
|---|
|  | 310 | RETURN | 
|---|
|  | 311 | ENDIF | 
|---|
|  | 312 | 100  CONTINUE | 
|---|
|  | 313 | IF(DIAGCO.NE.0) THEN | 
|---|
|  | 314 | DO 110 I=1,N | 
|---|
|  | 315 | 110    IF (DIAG(I).LE.ZERO) GO TO 195 | 
|---|
|  | 316 | ENDIF | 
|---|
|  | 317 | C | 
|---|
|  | 318 | C     COMPUTE -H*G USING THE FORMULA GIVEN IN: Nocedal, J. 1980, | 
|---|
|  | 319 | C     "Updating quasi-Newton matrices with limited storage", | 
|---|
|  | 320 | C     Mathematics of Computation, Vol.24, No.151, pp. 773-782. | 
|---|
|  | 321 | C     --------------------------------------------------------- | 
|---|
|  | 322 | C | 
|---|
|  | 323 | CP= POINT | 
|---|
|  | 324 | IF (POINT.EQ.0) CP=M | 
|---|
|  | 325 | W(N+CP)= ONE/YS | 
|---|
|  | 326 | DO 112 I=1,N | 
|---|
|  | 327 | 112  W(I)= -G(I) | 
|---|
|  | 328 | CP= POINT | 
|---|
|  | 329 | DO 125 I= 1,BOUND | 
|---|
|  | 330 | CP=CP-1 | 
|---|
|  | 331 | IF (CP.EQ. -1)CP=M-1 | 
|---|
|  | 332 | SQ= DDOT(N,W(ISPT+CP*N+1),1,W,1) | 
|---|
|  | 333 | INMC=N+M+CP+1 | 
|---|
|  | 334 | IYCN=IYPT+CP*N | 
|---|
|  | 335 | W(INMC)= W(N+CP+1)*SQ | 
|---|
|  | 336 | CALL DAXPY(N,-W(INMC),W(IYCN+1),1,W,1) | 
|---|
|  | 337 | 125  CONTINUE | 
|---|
|  | 338 | C | 
|---|
|  | 339 | DO 130 I=1,N | 
|---|
|  | 340 | 130  W(I)=DIAG(I)*W(I) | 
|---|
|  | 341 | C | 
|---|
|  | 342 | DO 145 I=1,BOUND | 
|---|
|  | 343 | YR= DDOT(N,W(IYPT+CP*N+1),1,W,1) | 
|---|
|  | 344 | BETA= W(N+CP+1)*YR | 
|---|
|  | 345 | INMC=N+M+CP+1 | 
|---|
|  | 346 | BETA= W(INMC)-BETA | 
|---|
|  | 347 | ISCN=ISPT+CP*N | 
|---|
|  | 348 | CALL DAXPY(N,BETA,W(ISCN+1),1,W,1) | 
|---|
|  | 349 | CP=CP+1 | 
|---|
|  | 350 | IF (CP.EQ.M)CP=0 | 
|---|
|  | 351 | 145  CONTINUE | 
|---|
|  | 352 | C | 
|---|
|  | 353 | C     STORE THE NEW SEARCH DIRECTION | 
|---|
|  | 354 | C     ------------------------------ | 
|---|
|  | 355 | C | 
|---|
|  | 356 | DO 160 I=1,N | 
|---|
|  | 357 | 160   W(ISPT+POINT*N+I)= W(I) | 
|---|
|  | 358 | C | 
|---|
|  | 359 | C     OBTAIN THE ONE-DIMENSIONAL MINIMIZER OF THE FUNCTION | 
|---|
|  | 360 | C     BY USING THE LINE SEARCH ROUTINE MCSRCH | 
|---|
|  | 361 | C     ---------------------------------------------------- | 
|---|
|  | 362 | 165  NFEV=0 | 
|---|
|  | 363 | STP=ONE | 
|---|
|  | 364 | IF (ITER.EQ.1) STP=STP1 | 
|---|
|  | 365 | DO 170 I=1,N | 
|---|
|  | 366 | 170  W(I)=G(I) | 
|---|
|  | 367 | 172  CONTINUE | 
|---|
|  | 368 | CALL MCSRCH(N,X,F,G,W(ISPT+POINT*N+1),STP,FTOL, | 
|---|
|  | 369 | *            XTOL,MAXFEV,INFO,NFEV,DIAG) | 
|---|
|  | 370 | IF (INFO .EQ. -1) THEN | 
|---|
|  | 371 | IFLAG=1 | 
|---|
|  | 372 | RETURN | 
|---|
|  | 373 | ENDIF | 
|---|
|  | 374 | IF (INFO .NE. 1) GO TO 190 | 
|---|
|  | 375 | NFUN= NFUN + NFEV | 
|---|
|  | 376 | C | 
|---|
|  | 377 | C     COMPUTE THE NEW STEP AND GRADIENT CHANGE | 
|---|
|  | 378 | C     ----------------------------------------- | 
|---|
|  | 379 | C | 
|---|
|  | 380 | NPT=POINT*N | 
|---|
|  | 381 | DO 175 I=1,N | 
|---|
|  | 382 | W(ISPT+NPT+I)= STP*W(ISPT+NPT+I) | 
|---|
|  | 383 | 175  W(IYPT+NPT+I)= G(I)-W(I) | 
|---|
|  | 384 | POINT=POINT+1 | 
|---|
|  | 385 | IF (POINT.EQ.M)POINT=0 | 
|---|
|  | 386 | C | 
|---|
|  | 387 | C     TERMINATION TEST | 
|---|
|  | 388 | C     ---------------- | 
|---|
|  | 389 | C | 
|---|
|  | 390 | GNORM= DSQRT(DDOT(N,G,1,G,1)) | 
|---|
|  | 391 | XNORM= DSQRT(DDOT(N,X,1,X,1)) | 
|---|
|  | 392 | XNORM= DMAX1(1.0D0,XNORM) | 
|---|
|  | 393 | IF (GNORM/XNORM .LE. EPS) FINISH=.TRUE. | 
|---|
|  | 394 | C | 
|---|
|  | 395 | IF(IPRINT(1).GE.0) CALL LB1(IPRINT,ITER,NFUN, | 
|---|
|  | 396 | *               GNORM,N,M,X,F,G,STP,FINISH) | 
|---|
|  | 397 | IF (FINISH) THEN | 
|---|
|  | 398 | IFLAG=0 | 
|---|
|  | 399 | RETURN | 
|---|
|  | 400 | ENDIF | 
|---|
|  | 401 | GO TO 80 | 
|---|
|  | 402 | C | 
|---|
|  | 403 | C     ------------------------------------------------------------ | 
|---|
|  | 404 | C     END OF MAIN ITERATION LOOP. ERROR EXITS. | 
|---|
|  | 405 | C     ------------------------------------------------------------ | 
|---|
|  | 406 | C | 
|---|
|  | 407 | 190  IFLAG=-1 | 
|---|
|  | 408 | IF(LP.GT.0) WRITE(LP,200) INFO | 
|---|
|  | 409 | RETURN | 
|---|
|  | 410 | 195  IFLAG=-2 | 
|---|
|  | 411 | IF(LP.GT.0) WRITE(LP,235) I | 
|---|
|  | 412 | RETURN | 
|---|
|  | 413 | 196  IFLAG= -3 | 
|---|
|  | 414 | IF(LP.GT.0) WRITE(LP,240) | 
|---|
|  | 415 | C | 
|---|
|  | 416 | C     FORMATS | 
|---|
|  | 417 | C     ------- | 
|---|
|  | 418 | C | 
|---|
|  | 419 | 200  FORMAT(/' IFLAG= -1 ',/' LINE SEARCH FAILED. SEE' | 
|---|
|  | 420 | .          ' DOCUMENTATION OF ROUTINE MCSRCH',/' ERROR RETURN' | 
|---|
|  | 421 | .          ' OF LINE SEARCH: INFO= ',I2,/ | 
|---|
|  | 422 | .          ' POSSIBLE CAUSES: FUNCTION OR GRADIENT ARE INCORRECT',/, | 
|---|
|  | 423 | .          ' OR INCORRECT TOLERANCES') | 
|---|
|  | 424 | 235  FORMAT(/' IFLAG= -2',/' THE',I5,'-TH DIAGONAL ELEMENT OF THE',/, | 
|---|
|  | 425 | .       ' INVERSE HESSIAN APPROXIMATION IS NOT POSITIVE') | 
|---|
|  | 426 | 240  FORMAT(/' IFLAG= -3',/' IMPROPER INPUT PARAMETERS (N OR M', | 
|---|
|  | 427 | .       ' ARE NOT POSITIVE)') | 
|---|
|  | 428 | 245  FORMAT(/'  GTOL IS LESS THAN OR EQUAL TO 1.D-04', | 
|---|
|  | 429 | .       / ' IT HAS BEEN RESET TO 9.D-01') | 
|---|
|  | 430 | RETURN | 
|---|
|  | 431 | END | 
|---|
|  | 432 | C | 
|---|
|  | 433 | C     LAST LINE OF SUBROUTINE LBFGS | 
|---|
|  | 434 | C | 
|---|
|  | 435 | C | 
|---|
|  | 436 | SUBROUTINE LB1(IPRINT,ITER,NFUN, | 
|---|
|  | 437 | *                     GNORM,N,M,X,F,G,STP,FINISH) | 
|---|
|  | 438 | C | 
|---|
|  | 439 | C     ------------------------------------------------------------- | 
|---|
|  | 440 | C     THIS ROUTINE PRINTS MONITORING INFORMATION. THE FREQUENCY AND | 
|---|
|  | 441 | C     AMOUNT OF OUTPUT ARE CONTROLLED BY IPRINT. | 
|---|
|  | 442 | C     ------------------------------------------------------------- | 
|---|
|  | 443 | C | 
|---|
|  | 444 | INTEGER IPRINT(2),ITER,NFUN,LP,MP,N,M | 
|---|
|  | 445 | DOUBLE PRECISION X(N),G(N),F,GNORM,STP,GTOL,STPMIN,STPMAX | 
|---|
|  | 446 | LOGICAL FINISH | 
|---|
|  | 447 | COMMON /LB3/MP,LP,GTOL,STPMIN,STPMAX | 
|---|
|  | 448 | C | 
|---|
|  | 449 | IF (ITER.EQ.0)THEN | 
|---|
|  | 450 | WRITE(MP,10) | 
|---|
|  | 451 | WRITE(MP,20) N,M | 
|---|
|  | 452 | WRITE(MP,30)F,GNORM | 
|---|
|  | 453 | IF (IPRINT(2).GE.1)THEN | 
|---|
|  | 454 | WRITE(MP,40) | 
|---|
|  | 455 | WRITE(MP,50) (X(I),I=1,N) | 
|---|
|  | 456 | WRITE(MP,60) | 
|---|
|  | 457 | WRITE(MP,50) (G(I),I=1,N) | 
|---|
|  | 458 | ENDIF | 
|---|
|  | 459 | WRITE(MP,10) | 
|---|
|  | 460 | WRITE(MP,70) | 
|---|
|  | 461 | ELSE | 
|---|
|  | 462 | IF ((IPRINT(1).EQ.0).AND.(ITER.NE.1.AND..NOT.FINISH))RETURN | 
|---|
|  | 463 | IF (IPRINT(1).NE.0)THEN | 
|---|
|  | 464 | IF(MOD(ITER-1,IPRINT(1)).EQ.0.OR.FINISH)THEN | 
|---|
|  | 465 | IF(IPRINT(2).GT.1.AND.ITER.GT.1) WRITE(MP,70) | 
|---|
|  | 466 | WRITE(MP,80)ITER,NFUN,F,GNORM,STP | 
|---|
|  | 467 | ELSE | 
|---|
|  | 468 | RETURN | 
|---|
|  | 469 | ENDIF | 
|---|
|  | 470 | ELSE | 
|---|
|  | 471 | IF( IPRINT(2).GT.1.AND.FINISH) WRITE(MP,70) | 
|---|
|  | 472 | WRITE(MP,80)ITER,NFUN,F,GNORM,STP | 
|---|
|  | 473 | ENDIF | 
|---|
|  | 474 | IF (IPRINT(2).EQ.2.OR.IPRINT(2).EQ.3)THEN | 
|---|
|  | 475 | IF (FINISH)THEN | 
|---|
|  | 476 | WRITE(MP,90) | 
|---|
|  | 477 | ELSE | 
|---|
|  | 478 | WRITE(MP,40) | 
|---|
|  | 479 | ENDIF | 
|---|
|  | 480 | WRITE(MP,50)(X(I),I=1,N) | 
|---|
|  | 481 | IF (IPRINT(2).EQ.3)THEN | 
|---|
|  | 482 | WRITE(MP,60) | 
|---|
|  | 483 | WRITE(MP,50)(G(I),I=1,N) | 
|---|
|  | 484 | ENDIF | 
|---|
|  | 485 | ENDIF | 
|---|
|  | 486 | IF (FINISH) WRITE(MP,100) | 
|---|
|  | 487 | ENDIF | 
|---|
|  | 488 | C | 
|---|
|  | 489 | 10   FORMAT('*************************************************') | 
|---|
|  | 490 | 20   FORMAT('  N=',I5,'   NUMBER OF CORRECTIONS=',I2, | 
|---|
|  | 491 | .       /,  '       INITIAL VALUES') | 
|---|
|  | 492 | 30   FORMAT(' F= ',1PD10.3,'   GNORM= ',1PD10.3) | 
|---|
|  | 493 | 40   FORMAT(' VECTOR X= ') | 
|---|
|  | 494 | 50   FORMAT(6(2X,1PD10.3)) | 
|---|
|  | 495 | 60   FORMAT(' GRADIENT VECTOR G= ') | 
|---|
|  | 496 | 70   FORMAT(/'   I   NFN',4X,'FUNC',8X,'GNORM',7X,'STEPLENGTH'/) | 
|---|
|  | 497 | 80   FORMAT(2(I4,1X),3X,3(1PD10.3,2X)) | 
|---|
|  | 498 | 90   FORMAT(' FINAL POINT X= ') | 
|---|
|  | 499 | 100  FORMAT(/' THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.', | 
|---|
|  | 500 | .       /' IFLAG = 0') | 
|---|
|  | 501 | C | 
|---|
|  | 502 | RETURN | 
|---|
|  | 503 | END | 
|---|
|  | 504 | C     ****** | 
|---|
|  | 505 | C | 
|---|
|  | 506 | C | 
|---|
|  | 507 | C   ---------------------------------------------------------- | 
|---|
|  | 508 | C     DATA | 
|---|
|  | 509 | C   ---------------------------------------------------------- | 
|---|
|  | 510 | C | 
|---|
|  | 511 | BLOCK DATA LB2 | 
|---|
|  | 512 | INTEGER LP,MP | 
|---|
|  | 513 | DOUBLE PRECISION GTOL,STPMIN,STPMAX | 
|---|
|  | 514 | COMMON /LB3/MP,LP,GTOL,STPMIN,STPMAX | 
|---|
|  | 515 | DATA MP,LP,GTOL,STPMIN,STPMAX/6,6,9.0D-01,1.0D-20,1.0D+20/ | 
|---|
|  | 516 | END | 
|---|
|  | 517 | C | 
|---|
|  | 518 | C | 
|---|
|  | 519 | C   ---------------------------------------------------------- | 
|---|
|  | 520 | C | 
|---|
|  | 521 | subroutine daxpy(n,da,dx,incx,dy,incy) | 
|---|
|  | 522 | c | 
|---|
|  | 523 | c     constant times a vector plus a vector. | 
|---|
|  | 524 | c     uses unrolled loops for increments equal to one. | 
|---|
|  | 525 | c     jack dongarra, linpack, 3/11/78. | 
|---|
|  | 526 | c | 
|---|
|  | 527 | double precision dx(1),dy(1),da | 
|---|
|  | 528 | integer i,incx,incy,ix,iy,m,mp1,n | 
|---|
|  | 529 | c | 
|---|
|  | 530 | if(n.le.0)return | 
|---|
|  | 531 | if (da .eq. 0.0d0) return | 
|---|
|  | 532 | if(incx.eq.1.and.incy.eq.1)go to 20 | 
|---|
|  | 533 | c | 
|---|
|  | 534 | c        code for unequal increments or equal increments | 
|---|
|  | 535 | c          not equal to 1 | 
|---|
|  | 536 | c | 
|---|
|  | 537 | ix = 1 | 
|---|
|  | 538 | iy = 1 | 
|---|
|  | 539 | if(incx.lt.0)ix = (-n+1)*incx + 1 | 
|---|
|  | 540 | if(incy.lt.0)iy = (-n+1)*incy + 1 | 
|---|
|  | 541 | do 10 i = 1,n | 
|---|
|  | 542 | dy(iy) = dy(iy) + da*dx(ix) | 
|---|
|  | 543 | ix = ix + incx | 
|---|
|  | 544 | iy = iy + incy | 
|---|
|  | 545 | 10 continue | 
|---|
|  | 546 | return | 
|---|
|  | 547 | c | 
|---|
|  | 548 | c        code for both increments equal to 1 | 
|---|
|  | 549 | c | 
|---|
|  | 550 | c | 
|---|
|  | 551 | c        clean-up loop | 
|---|
|  | 552 | c | 
|---|
|  | 553 | 20 m = mod(n,4) | 
|---|
|  | 554 | if( m .eq. 0 ) go to 40 | 
|---|
|  | 555 | do 30 i = 1,m | 
|---|
|  | 556 | dy(i) = dy(i) + da*dx(i) | 
|---|
|  | 557 | 30 continue | 
|---|
|  | 558 | if( n .lt. 4 ) return | 
|---|
|  | 559 | 40 mp1 = m + 1 | 
|---|
|  | 560 | do 50 i = mp1,n,4 | 
|---|
|  | 561 | dy(i) = dy(i) + da*dx(i) | 
|---|
|  | 562 | dy(i + 1) = dy(i + 1) + da*dx(i + 1) | 
|---|
|  | 563 | dy(i + 2) = dy(i + 2) + da*dx(i + 2) | 
|---|
|  | 564 | dy(i + 3) = dy(i + 3) + da*dx(i + 3) | 
|---|
|  | 565 | 50 continue | 
|---|
|  | 566 | return | 
|---|
|  | 567 | end | 
|---|
|  | 568 | C | 
|---|
|  | 569 | C | 
|---|
|  | 570 | C   ---------------------------------------------------------- | 
|---|
|  | 571 | C | 
|---|
|  | 572 | double precision function ddot(n,dx,incx,dy,incy) | 
|---|
|  | 573 | c | 
|---|
|  | 574 | c     forms the dot product of two vectors. | 
|---|
|  | 575 | c     uses unrolled loops for increments equal to one. | 
|---|
|  | 576 | c     jack dongarra, linpack, 3/11/78. | 
|---|
|  | 577 | c | 
|---|
|  | 578 | double precision dx(1),dy(1),dtemp | 
|---|
|  | 579 | integer i,incx,incy,ix,iy,m,mp1,n | 
|---|
|  | 580 | c | 
|---|
|  | 581 | ddot = 0.0d0 | 
|---|
|  | 582 | dtemp = 0.0d0 | 
|---|
|  | 583 | if(n.le.0)return | 
|---|
|  | 584 | if(incx.eq.1.and.incy.eq.1)go to 20 | 
|---|
|  | 585 | c | 
|---|
|  | 586 | c        code for unequal increments or equal increments | 
|---|
|  | 587 | c          not equal to 1 | 
|---|
|  | 588 | c | 
|---|
|  | 589 | ix = 1 | 
|---|
|  | 590 | iy = 1 | 
|---|
|  | 591 | if(incx.lt.0)ix = (-n+1)*incx + 1 | 
|---|
|  | 592 | if(incy.lt.0)iy = (-n+1)*incy + 1 | 
|---|
|  | 593 | do 10 i = 1,n | 
|---|
|  | 594 | dtemp = dtemp + dx(ix)*dy(iy) | 
|---|
|  | 595 | ix = ix + incx | 
|---|
|  | 596 | iy = iy + incy | 
|---|
|  | 597 | 10 continue | 
|---|
|  | 598 | ddot = dtemp | 
|---|
|  | 599 | return | 
|---|
|  | 600 | c | 
|---|
|  | 601 | c        code for both increments equal to 1 | 
|---|
|  | 602 | c | 
|---|
|  | 603 | c | 
|---|
|  | 604 | c        clean-up loop | 
|---|
|  | 605 | c | 
|---|
|  | 606 | 20 m = mod(n,5) | 
|---|
|  | 607 | if( m .eq. 0 ) go to 40 | 
|---|
|  | 608 | do 30 i = 1,m | 
|---|
|  | 609 | dtemp = dtemp + dx(i)*dy(i) | 
|---|
|  | 610 | 30 continue | 
|---|
|  | 611 | if( n .lt. 5 ) go to 60 | 
|---|
|  | 612 | 40 mp1 = m + 1 | 
|---|
|  | 613 | do 50 i = mp1,n,5 | 
|---|
|  | 614 | dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) + | 
|---|
|  | 615 | *   dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4) | 
|---|
|  | 616 | 50 continue | 
|---|
|  | 617 | 60 ddot = dtemp | 
|---|
|  | 618 | return | 
|---|
|  | 619 | end | 
|---|
|  | 620 | C    ------------------------------------------------------------------ | 
|---|
|  | 621 | C | 
|---|
|  | 622 | C     ************************** | 
|---|
|  | 623 | C     LINE SEARCH ROUTINE MCSRCH | 
|---|
|  | 624 | C     ************************** | 
|---|
|  | 625 | C | 
|---|
|  | 626 | SUBROUTINE MCSRCH(N,X,F,G,S,STP,FTOL,XTOL,MAXFEV,INFO,NFEV,WA) | 
|---|
|  | 627 | INTEGER N,MAXFEV,INFO,NFEV | 
|---|
|  | 628 | DOUBLE PRECISION F,STP,FTOL,GTOL,XTOL,STPMIN,STPMAX | 
|---|
|  | 629 | DOUBLE PRECISION X(N),G(N),S(N),WA(N) | 
|---|
|  | 630 | COMMON /LB3/MP,LP,GTOL,STPMIN,STPMAX | 
|---|
|  | 631 | SAVE | 
|---|
|  | 632 | C | 
|---|
|  | 633 | C                     SUBROUTINE MCSRCH | 
|---|
|  | 634 | C | 
|---|
|  | 635 | C     A slight modification of the subroutine CSRCH of More' and Thuente. | 
|---|
|  | 636 | C     The changes are to allow reverse communication, and do not affect | 
|---|
|  | 637 | C     the performance of the routine. | 
|---|
|  | 638 | C | 
|---|
|  | 639 | C     THE PURPOSE OF MCSRCH IS TO FIND A STEP WHICH SATISFIES | 
|---|
|  | 640 | C     A SUFFICIENT DECREASE CONDITION AND A CURVATURE CONDITION. | 
|---|
|  | 641 | C | 
|---|
|  | 642 | C     AT EACH STAGE THE SUBROUTINE UPDATES AN INTERVAL OF | 
|---|
|  | 643 | C     UNCERTAINTY WITH ENDPOINTS STX AND STY. THE INTERVAL OF | 
|---|
|  | 644 | C     UNCERTAINTY IS INITIALLY CHOSEN SO THAT IT CONTAINS A | 
|---|
|  | 645 | C     MINIMIZER OF THE MODIFIED FUNCTION | 
|---|
|  | 646 | C | 
|---|
|  | 647 | C          F(X+STP*S) - F(X) - FTOL*STP*(GRADF(X)'S). | 
|---|
|  | 648 | C | 
|---|
|  | 649 | C     IF A STEP IS OBTAINED FOR WHICH THE MODIFIED FUNCTION | 
|---|
|  | 650 | C     HAS A NONPOSITIVE FUNCTION VALUE AND NONNEGATIVE DERIVATIVE, | 
|---|
|  | 651 | C     THEN THE INTERVAL OF UNCERTAINTY IS CHOSEN SO THAT IT | 
|---|
|  | 652 | C     CONTAINS A MINIMIZER OF F(X+STP*S). | 
|---|
|  | 653 | C | 
|---|
|  | 654 | C     THE ALGORITHM IS DESIGNED TO FIND A STEP WHICH SATISFIES | 
|---|
|  | 655 | C     THE SUFFICIENT DECREASE CONDITION | 
|---|
|  | 656 | C | 
|---|
|  | 657 | C           F(X+STP*S) .LE. F(X) + FTOL*STP*(GRADF(X)'S), | 
|---|
|  | 658 | C | 
|---|
|  | 659 | C     AND THE CURVATURE CONDITION | 
|---|
|  | 660 | C | 
|---|
|  | 661 | C           ABS(GRADF(X+STP*S)'S)) .LE. GTOL*ABS(GRADF(X)'S). | 
|---|
|  | 662 | C | 
|---|
|  | 663 | C     IF FTOL IS LESS THAN GTOL AND IF, FOR EXAMPLE, THE FUNCTION | 
|---|
|  | 664 | C     IS BOUNDED BELOW, THEN THERE IS ALWAYS A STEP WHICH SATISFIES | 
|---|
|  | 665 | C     BOTH CONDITIONS. IF NO STEP CAN BE FOUND WHICH SATISFIES BOTH | 
|---|
|  | 666 | C     CONDITIONS, THEN THE ALGORITHM USUALLY STOPS WHEN ROUNDING | 
|---|
|  | 667 | C     ERRORS PREVENT FURTHER PROGRESS. IN THIS CASE STP ONLY | 
|---|
|  | 668 | C     SATISFIES THE SUFFICIENT DECREASE CONDITION. | 
|---|
|  | 669 | C | 
|---|
|  | 670 | C     THE SUBROUTINE STATEMENT IS | 
|---|
|  | 671 | C | 
|---|
|  | 672 | C        SUBROUTINE MCSRCH(N,X,F,G,S,STP,FTOL,XTOL, MAXFEV,INFO,NFEV,WA) | 
|---|
|  | 673 | C     WHERE | 
|---|
|  | 674 | C | 
|---|
|  | 675 | C       N IS A POSITIVE INTEGER INPUT VARIABLE SET TO THE NUMBER | 
|---|
|  | 676 | C         OF VARIABLES. | 
|---|
|  | 677 | C | 
|---|
|  | 678 | C       X IS AN ARRAY OF LENGTH N. ON INPUT IT MUST CONTAIN THE | 
|---|
|  | 679 | C         BASE POINT FOR THE LINE SEARCH. ON OUTPUT IT CONTAINS | 
|---|
|  | 680 | C         X + STP*S. | 
|---|
|  | 681 | C | 
|---|
|  | 682 | C       F IS A VARIABLE. ON INPUT IT MUST CONTAIN THE VALUE OF F | 
|---|
|  | 683 | C         AT X. ON OUTPUT IT CONTAINS THE VALUE OF F AT X + STP*S. | 
|---|
|  | 684 | C | 
|---|
|  | 685 | C       G IS AN ARRAY OF LENGTH N. ON INPUT IT MUST CONTAIN THE | 
|---|
|  | 686 | C         GRADIENT OF F AT X. ON OUTPUT IT CONTAINS THE GRADIENT | 
|---|
|  | 687 | C         OF F AT X + STP*S. | 
|---|
|  | 688 | C | 
|---|
|  | 689 | C       S IS AN INPUT ARRAY OF LENGTH N WHICH SPECIFIES THE | 
|---|
|  | 690 | C         SEARCH DIRECTION. | 
|---|
|  | 691 | C | 
|---|
|  | 692 | C       STP IS A NONNEGATIVE VARIABLE. ON INPUT STP CONTAINS AN | 
|---|
|  | 693 | C         INITIAL ESTIMATE OF A SATISFACTORY STEP. ON OUTPUT | 
|---|
|  | 694 | C         STP CONTAINS THE FINAL ESTIMATE. | 
|---|
|  | 695 | C | 
|---|
|  | 696 | C       FTOL AND GTOL ARE NONNEGATIVE INPUT VARIABLES. (In this reverse | 
|---|
|  | 697 | C         communication implementation GTOL is defined in a COMMON | 
|---|
|  | 698 | C         statement.) TERMINATION OCCURS WHEN THE SUFFICIENT DECREASE | 
|---|
|  | 699 | C         CONDITION AND THE DIRECTIONAL DERIVATIVE CONDITION ARE | 
|---|
|  | 700 | C         SATISFIED. | 
|---|
|  | 701 | C | 
|---|
|  | 702 | C       XTOL IS A NONNEGATIVE INPUT VARIABLE. TERMINATION OCCURS | 
|---|
|  | 703 | C         WHEN THE RELATIVE WIDTH OF THE INTERVAL OF UNCERTAINTY | 
|---|
|  | 704 | C         IS AT MOST XTOL. | 
|---|
|  | 705 | C | 
|---|
|  | 706 | C       STPMIN AND STPMAX ARE NONNEGATIVE INPUT VARIABLES WHICH | 
|---|
|  | 707 | C         SPECIFY LOWER AND UPPER BOUNDS FOR THE STEP. (In this reverse | 
|---|
|  | 708 | C         communication implementatin they are defined in a COMMON | 
|---|
|  | 709 | C         statement). | 
|---|
|  | 710 | C | 
|---|
|  | 711 | C       MAXFEV IS A POSITIVE INTEGER INPUT VARIABLE. TERMINATION | 
|---|
|  | 712 | C         OCCURS WHEN THE NUMBER OF CALLS TO FCN IS AT LEAST | 
|---|
|  | 713 | C         MAXFEV BY THE END OF AN ITERATION. | 
|---|
|  | 714 | C | 
|---|
|  | 715 | C       INFO IS AN INTEGER OUTPUT VARIABLE SET AS FOLLOWS: | 
|---|
|  | 716 | C | 
|---|
|  | 717 | C         INFO = 0  IMPROPER INPUT PARAMETERS. | 
|---|
|  | 718 | C | 
|---|
|  | 719 | C         INFO =-1  A RETURN IS MADE TO COMPUTE THE FUNCTION AND GRADIENT. | 
|---|
|  | 720 | C | 
|---|
|  | 721 | C         INFO = 1  THE SUFFICIENT DECREASE CONDITION AND THE | 
|---|
|  | 722 | C                   DIRECTIONAL DERIVATIVE CONDITION HOLD. | 
|---|
|  | 723 | C | 
|---|
|  | 724 | C         INFO = 2  RELATIVE WIDTH OF THE INTERVAL OF UNCERTAINTY | 
|---|
|  | 725 | C                   IS AT MOST XTOL. | 
|---|
|  | 726 | C | 
|---|
|  | 727 | C         INFO = 3  NUMBER OF CALLS TO FCN HAS REACHED MAXFEV. | 
|---|
|  | 728 | C | 
|---|
|  | 729 | C         INFO = 4  THE STEP IS AT THE LOWER BOUND STPMIN. | 
|---|
|  | 730 | C | 
|---|
|  | 731 | C         INFO = 5  THE STEP IS AT THE UPPER BOUND STPMAX. | 
|---|
|  | 732 | C | 
|---|
|  | 733 | C         INFO = 6  ROUNDING ERRORS PREVENT FURTHER PROGRESS. | 
|---|
|  | 734 | C                   THERE MAY NOT BE A STEP WHICH SATISFIES THE | 
|---|
|  | 735 | C                   SUFFICIENT DECREASE AND CURVATURE CONDITIONS. | 
|---|
|  | 736 | C                   TOLERANCES MAY BE TOO SMALL. | 
|---|
|  | 737 | C | 
|---|
|  | 738 | C       NFEV IS AN INTEGER OUTPUT VARIABLE SET TO THE NUMBER OF | 
|---|
|  | 739 | C         CALLS TO FCN. | 
|---|
|  | 740 | C | 
|---|
|  | 741 | C       WA IS A WORK ARRAY OF LENGTH N. | 
|---|
|  | 742 | C | 
|---|
|  | 743 | C     SUBPROGRAMS CALLED | 
|---|
|  | 744 | C | 
|---|
|  | 745 | C       MCSTEP | 
|---|
|  | 746 | C | 
|---|
|  | 747 | C       FORTRAN-SUPPLIED...ABS,MAX,MIN | 
|---|
|  | 748 | C | 
|---|
|  | 749 | C     ARGONNE NATIONAL LABORATORY. MINPACK PROJECT. JUNE 1983 | 
|---|
|  | 750 | C     JORGE J. MORE', DAVID J. THUENTE | 
|---|
|  | 751 | C | 
|---|
|  | 752 | C     ********** | 
|---|
|  | 753 | INTEGER INFOC,J | 
|---|
|  | 754 | LOGICAL BRACKT,STAGE1 | 
|---|
|  | 755 | DOUBLE PRECISION DG,DGM,DGINIT,DGTEST,DGX,DGXM,DGY,DGYM, | 
|---|
|  | 756 | *       FINIT,FTEST1,FM,FX,FXM,FY,FYM,P5,P66,STX,STY, | 
|---|
|  | 757 | *       STMIN,STMAX,WIDTH,WIDTH1,XTRAPF,ZERO | 
|---|
|  | 758 | DATA P5,P66,XTRAPF,ZERO /0.5D0,0.66D0,4.0D0,0.0D0/ | 
|---|
|  | 759 | IF(INFO.EQ.-1) GO TO 45 | 
|---|
|  | 760 | INFOC = 1 | 
|---|
|  | 761 | C | 
|---|
|  | 762 | C     CHECK THE INPUT PARAMETERS FOR ERRORS. | 
|---|
|  | 763 | C | 
|---|
|  | 764 | IF (N .LE. 0 .OR. STP .LE. ZERO .OR. FTOL .LT. ZERO .OR. | 
|---|
|  | 765 | *    GTOL .LT. ZERO .OR. XTOL .LT. ZERO .OR. STPMIN .LT. ZERO | 
|---|
|  | 766 | *    .OR. STPMAX .LT. STPMIN .OR. MAXFEV .LE. 0) RETURN | 
|---|
|  | 767 | C | 
|---|
|  | 768 | C     COMPUTE THE INITIAL GRADIENT IN THE SEARCH DIRECTION | 
|---|
|  | 769 | C     AND CHECK THAT S IS A DESCENT DIRECTION. | 
|---|
|  | 770 | C | 
|---|
|  | 771 | DGINIT = ZERO | 
|---|
|  | 772 | DO 10 J = 1, N | 
|---|
|  | 773 | DGINIT = DGINIT + G(J)*S(J) | 
|---|
|  | 774 | 10    CONTINUE | 
|---|
|  | 775 | IF (DGINIT .GE. ZERO) then | 
|---|
|  | 776 | write(LP,15) | 
|---|
|  | 777 | 15    FORMAT(/'  THE SEARCH DIRECTION IS NOT A DESCENT DIRECTION') | 
|---|
|  | 778 | RETURN | 
|---|
|  | 779 | ENDIF | 
|---|
|  | 780 | C | 
|---|
|  | 781 | C     INITIALIZE LOCAL VARIABLES. | 
|---|
|  | 782 | C | 
|---|
|  | 783 | BRACKT = .FALSE. | 
|---|
|  | 784 | STAGE1 = .TRUE. | 
|---|
|  | 785 | NFEV = 0 | 
|---|
|  | 786 | FINIT = F | 
|---|
|  | 787 | DGTEST = FTOL*DGINIT | 
|---|
|  | 788 | WIDTH = STPMAX - STPMIN | 
|---|
|  | 789 | WIDTH1 = WIDTH/P5 | 
|---|
|  | 790 | DO 20 J = 1, N | 
|---|
|  | 791 | WA(J) = X(J) | 
|---|
|  | 792 | 20    CONTINUE | 
|---|
|  | 793 | C | 
|---|
|  | 794 | C     THE VARIABLES STX, FX, DGX CONTAIN THE VALUES OF THE STEP, | 
|---|
|  | 795 | C     FUNCTION, AND DIRECTIONAL DERIVATIVE AT THE BEST STEP. | 
|---|
|  | 796 | C     THE VARIABLES STY, FY, DGY CONTAIN THE VALUE OF THE STEP, | 
|---|
|  | 797 | C     FUNCTION, AND DERIVATIVE AT THE OTHER ENDPOINT OF | 
|---|
|  | 798 | C     THE INTERVAL OF UNCERTAINTY. | 
|---|
|  | 799 | C     THE VARIABLES STP, F, DG CONTAIN THE VALUES OF THE STEP, | 
|---|
|  | 800 | C     FUNCTION, AND DERIVATIVE AT THE CURRENT STEP. | 
|---|
|  | 801 | C | 
|---|
|  | 802 | STX = ZERO | 
|---|
|  | 803 | FX = FINIT | 
|---|
|  | 804 | DGX = DGINIT | 
|---|
|  | 805 | STY = ZERO | 
|---|
|  | 806 | FY = FINIT | 
|---|
|  | 807 | DGY = DGINIT | 
|---|
|  | 808 | C | 
|---|
|  | 809 | C     START OF ITERATION. | 
|---|
|  | 810 | C | 
|---|
|  | 811 | 30 CONTINUE | 
|---|
|  | 812 | C | 
|---|
|  | 813 | C        SET THE MINIMUM AND MAXIMUM STEPS TO CORRESPOND | 
|---|
|  | 814 | C        TO THE PRESENT INTERVAL OF UNCERTAINTY. | 
|---|
|  | 815 | C | 
|---|
|  | 816 | IF (BRACKT) THEN | 
|---|
|  | 817 | STMIN = MIN(STX,STY) | 
|---|
|  | 818 | STMAX = MAX(STX,STY) | 
|---|
|  | 819 | ELSE | 
|---|
|  | 820 | STMIN = STX | 
|---|
|  | 821 | STMAX = STP + XTRAPF*(STP - STX) | 
|---|
|  | 822 | END IF | 
|---|
|  | 823 | C | 
|---|
|  | 824 | C        FORCE THE STEP TO BE WITHIN THE BOUNDS STPMAX AND STPMIN. | 
|---|
|  | 825 | C | 
|---|
|  | 826 | STP = MAX(STP,STPMIN) | 
|---|
|  | 827 | STP = MIN(STP,STPMAX) | 
|---|
|  | 828 | C | 
|---|
|  | 829 | C        IF AN UNUSUAL TERMINATION IS TO OCCUR THEN LET | 
|---|
|  | 830 | C        STP BE THE LOWEST POINT OBTAINED SO FAR. | 
|---|
|  | 831 | C | 
|---|
|  | 832 | IF ((BRACKT .AND. (STP .LE. STMIN .OR. STP .GE. STMAX)) | 
|---|
|  | 833 | *      .OR. NFEV .GE. MAXFEV-1 .OR. INFOC .EQ. 0 | 
|---|
|  | 834 | *      .OR. (BRACKT .AND. STMAX-STMIN .LE. XTOL*STMAX)) STP = STX | 
|---|
|  | 835 | C | 
|---|
|  | 836 | C        EVALUATE THE FUNCTION AND GRADIENT AT STP | 
|---|
|  | 837 | C        AND COMPUTE THE DIRECTIONAL DERIVATIVE. | 
|---|
|  | 838 | C        We return to main program to obtain F and G. | 
|---|
|  | 839 | C | 
|---|
|  | 840 | DO 40 J = 1, N | 
|---|
|  | 841 | X(J) = WA(J) + STP*S(J) | 
|---|
|  | 842 | 40       CONTINUE | 
|---|
|  | 843 | INFO=-1 | 
|---|
|  | 844 | RETURN | 
|---|
|  | 845 | C | 
|---|
|  | 846 | 45    INFO=0 | 
|---|
|  | 847 | NFEV = NFEV + 1 | 
|---|
|  | 848 | DG = ZERO | 
|---|
|  | 849 | DO 50 J = 1, N | 
|---|
|  | 850 | DG = DG + G(J)*S(J) | 
|---|
|  | 851 | 50       CONTINUE | 
|---|
|  | 852 | FTEST1 = FINIT + STP*DGTEST | 
|---|
|  | 853 | C | 
|---|
|  | 854 | C        TEST FOR CONVERGENCE. | 
|---|
|  | 855 | C | 
|---|
|  | 856 | IF ((BRACKT .AND. (STP .LE. STMIN .OR. STP .GE. STMAX)) | 
|---|
|  | 857 | *      .OR. INFOC .EQ. 0) INFO = 6 | 
|---|
|  | 858 | IF (STP .EQ. STPMAX .AND. | 
|---|
|  | 859 | *       F .LE. FTEST1 .AND. DG .LE. DGTEST) INFO = 5 | 
|---|
|  | 860 | IF (STP .EQ. STPMIN .AND. | 
|---|
|  | 861 | *       (F .GT. FTEST1 .OR. DG .GE. DGTEST)) INFO = 4 | 
|---|
|  | 862 | IF (NFEV .GE. MAXFEV) INFO = 3 | 
|---|
|  | 863 | IF (BRACKT .AND. STMAX-STMIN .LE. XTOL*STMAX) INFO = 2 | 
|---|
|  | 864 | IF (F .LE. FTEST1 .AND. ABS(DG) .LE. GTOL*(-DGINIT)) INFO = 1 | 
|---|
|  | 865 | C | 
|---|
|  | 866 | C        CHECK FOR TERMINATION. | 
|---|
|  | 867 | C | 
|---|
|  | 868 | IF (INFO .NE. 0) RETURN | 
|---|
|  | 869 | C | 
|---|
|  | 870 | C        IN THE FIRST STAGE WE SEEK A STEP FOR WHICH THE MODIFIED | 
|---|
|  | 871 | C        FUNCTION HAS A NONPOSITIVE VALUE AND NONNEGATIVE DERIVATIVE. | 
|---|
|  | 872 | C | 
|---|
|  | 873 | IF (STAGE1 .AND. F .LE. FTEST1 .AND. | 
|---|
|  | 874 | *       DG .GE. MIN(FTOL,GTOL)*DGINIT) STAGE1 = .FALSE. | 
|---|
|  | 875 | C | 
|---|
|  | 876 | C        A MODIFIED FUNCTION IS USED TO PREDICT THE STEP ONLY IF | 
|---|
|  | 877 | C        WE HAVE NOT OBTAINED A STEP FOR WHICH THE MODIFIED | 
|---|
|  | 878 | C        FUNCTION HAS A NONPOSITIVE FUNCTION VALUE AND NONNEGATIVE | 
|---|
|  | 879 | C        DERIVATIVE, AND IF A LOWER FUNCTION VALUE HAS BEEN | 
|---|
|  | 880 | C        OBTAINED BUT THE DECREASE IS NOT SUFFICIENT. | 
|---|
|  | 881 | C | 
|---|
|  | 882 | IF (STAGE1 .AND. F .LE. FX .AND. F .GT. FTEST1) THEN | 
|---|
|  | 883 | C | 
|---|
|  | 884 | C           DEFINE THE MODIFIED FUNCTION AND DERIVATIVE VALUES. | 
|---|
|  | 885 | C | 
|---|
|  | 886 | FM = F - STP*DGTEST | 
|---|
|  | 887 | FXM = FX - STX*DGTEST | 
|---|
|  | 888 | FYM = FY - STY*DGTEST | 
|---|
|  | 889 | DGM = DG - DGTEST | 
|---|
|  | 890 | DGXM = DGX - DGTEST | 
|---|
|  | 891 | DGYM = DGY - DGTEST | 
|---|
|  | 892 | C | 
|---|
|  | 893 | C           CALL CSTEP TO UPDATE THE INTERVAL OF UNCERTAINTY | 
|---|
|  | 894 | C           AND TO COMPUTE THE NEW STEP. | 
|---|
|  | 895 | C | 
|---|
|  | 896 | CALL MCSTEP(STX,FXM,DGXM,STY,FYM,DGYM,STP,FM,DGM, | 
|---|
|  | 897 | *                 BRACKT,STMIN,STMAX,INFOC) | 
|---|
|  | 898 | C | 
|---|
|  | 899 | C           RESET THE FUNCTION AND GRADIENT VALUES FOR F. | 
|---|
|  | 900 | C | 
|---|
|  | 901 | FX = FXM + STX*DGTEST | 
|---|
|  | 902 | FY = FYM + STY*DGTEST | 
|---|
|  | 903 | DGX = DGXM + DGTEST | 
|---|
|  | 904 | DGY = DGYM + DGTEST | 
|---|
|  | 905 | ELSE | 
|---|
|  | 906 | C | 
|---|
|  | 907 | C           CALL MCSTEP TO UPDATE THE INTERVAL OF UNCERTAINTY | 
|---|
|  | 908 | C           AND TO COMPUTE THE NEW STEP. | 
|---|
|  | 909 | C | 
|---|
|  | 910 | CALL MCSTEP(STX,FX,DGX,STY,FY,DGY,STP,F,DG, | 
|---|
|  | 911 | *                 BRACKT,STMIN,STMAX,INFOC) | 
|---|
|  | 912 | END IF | 
|---|
|  | 913 | C | 
|---|
|  | 914 | C        FORCE A SUFFICIENT DECREASE IN THE SIZE OF THE | 
|---|
|  | 915 | C        INTERVAL OF UNCERTAINTY. | 
|---|
|  | 916 | C | 
|---|
|  | 917 | IF (BRACKT) THEN | 
|---|
|  | 918 | IF (ABS(STY-STX) .GE. P66*WIDTH1) | 
|---|
|  | 919 | *         STP = STX + P5*(STY - STX) | 
|---|
|  | 920 | WIDTH1 = WIDTH | 
|---|
|  | 921 | WIDTH = ABS(STY-STX) | 
|---|
|  | 922 | END IF | 
|---|
|  | 923 | C | 
|---|
|  | 924 | C        END OF ITERATION. | 
|---|
|  | 925 | C | 
|---|
|  | 926 | GO TO 30 | 
|---|
|  | 927 | C | 
|---|
|  | 928 | C     LAST LINE OF SUBROUTINE MCSRCH. | 
|---|
|  | 929 | C | 
|---|
|  | 930 | END | 
|---|
|  | 931 | SUBROUTINE MCSTEP(STX,FX,DX,STY,FY,DY,STP,FP,DP,BRACKT, | 
|---|
|  | 932 | *                 STPMIN,STPMAX,INFO) | 
|---|
|  | 933 | INTEGER INFO | 
|---|
|  | 934 | DOUBLE PRECISION STX,FX,DX,STY,FY,DY,STP,FP,DP,STPMIN,STPMAX | 
|---|
|  | 935 | LOGICAL BRACKT,BOUND | 
|---|
|  | 936 | C | 
|---|
|  | 937 | C     SUBROUTINE MCSTEP | 
|---|
|  | 938 | C | 
|---|
|  | 939 | C     THE PURPOSE OF MCSTEP IS TO COMPUTE A SAFEGUARDED STEP FOR | 
|---|
|  | 940 | C     A LINESEARCH AND TO UPDATE AN INTERVAL OF UNCERTAINTY FOR | 
|---|
|  | 941 | C     A MINIMIZER OF THE FUNCTION. | 
|---|
|  | 942 | C | 
|---|
|  | 943 | C     THE PARAMETER STX CONTAINS THE STEP WITH THE LEAST FUNCTION | 
|---|
|  | 944 | C     VALUE. THE PARAMETER STP CONTAINS THE CURRENT STEP. IT IS | 
|---|
|  | 945 | C     ASSUMED THAT THE DERIVATIVE AT STX IS NEGATIVE IN THE | 
|---|
|  | 946 | C     DIRECTION OF THE STEP. IF BRACKT IS SET TRUE THEN A | 
|---|
|  | 947 | C     MINIMIZER HAS BEEN BRACKETED IN AN INTERVAL OF UNCERTAINTY | 
|---|
|  | 948 | C     WITH ENDPOINTS STX AND STY. | 
|---|
|  | 949 | C | 
|---|
|  | 950 | C     THE SUBROUTINE STATEMENT IS | 
|---|
|  | 951 | C | 
|---|
|  | 952 | C       SUBROUTINE MCSTEP(STX,FX,DX,STY,FY,DY,STP,FP,DP,BRACKT, | 
|---|
|  | 953 | C                        STPMIN,STPMAX,INFO) | 
|---|
|  | 954 | C | 
|---|
|  | 955 | C     WHERE | 
|---|
|  | 956 | C | 
|---|
|  | 957 | C       STX, FX, AND DX ARE VARIABLES WHICH SPECIFY THE STEP, | 
|---|
|  | 958 | C         THE FUNCTION, AND THE DERIVATIVE AT THE BEST STEP OBTAINED | 
|---|
|  | 959 | C         SO FAR. THE DERIVATIVE MUST BE NEGATIVE IN THE DIRECTION | 
|---|
|  | 960 | C         OF THE STEP, THAT IS, DX AND STP-STX MUST HAVE OPPOSITE | 
|---|
|  | 961 | C         SIGNS. ON OUTPUT THESE PARAMETERS ARE UPDATED APPROPRIATELY. | 
|---|
|  | 962 | C | 
|---|
|  | 963 | C       STY, FY, AND DY ARE VARIABLES WHICH SPECIFY THE STEP, | 
|---|
|  | 964 | C         THE FUNCTION, AND THE DERIVATIVE AT THE OTHER ENDPOINT OF | 
|---|
|  | 965 | C         THE INTERVAL OF UNCERTAINTY. ON OUTPUT THESE PARAMETERS ARE | 
|---|
|  | 966 | C         UPDATED APPROPRIATELY. | 
|---|
|  | 967 | C | 
|---|
|  | 968 | C       STP, FP, AND DP ARE VARIABLES WHICH SPECIFY THE STEP, | 
|---|
|  | 969 | C         THE FUNCTION, AND THE DERIVATIVE AT THE CURRENT STEP. | 
|---|
|  | 970 | C         IF BRACKT IS SET TRUE THEN ON INPUT STP MUST BE | 
|---|
|  | 971 | C         BETWEEN STX AND STY. ON OUTPUT STP IS SET TO THE NEW STEP. | 
|---|
|  | 972 | C | 
|---|
|  | 973 | C       BRACKT IS A LOGICAL VARIABLE WHICH SPECIFIES IF A MINIMIZER | 
|---|
|  | 974 | C         HAS BEEN BRACKETED. IF THE MINIMIZER HAS NOT BEEN BRACKETED | 
|---|
|  | 975 | C         THEN ON INPUT BRACKT MUST BE SET FALSE. IF THE MINIMIZER | 
|---|
|  | 976 | C         IS BRACKETED THEN ON OUTPUT BRACKT IS SET TRUE. | 
|---|
|  | 977 | C | 
|---|
|  | 978 | C       STPMIN AND STPMAX ARE INPUT VARIABLES WHICH SPECIFY LOWER | 
|---|
|  | 979 | C         AND UPPER BOUNDS FOR THE STEP. | 
|---|
|  | 980 | C | 
|---|
|  | 981 | C       INFO IS AN INTEGER OUTPUT VARIABLE SET AS FOLLOWS: | 
|---|
|  | 982 | C         IF INFO = 1,2,3,4,5, THEN THE STEP HAS BEEN COMPUTED | 
|---|
|  | 983 | C         ACCORDING TO ONE OF THE FIVE CASES BELOW. OTHERWISE | 
|---|
|  | 984 | C         INFO = 0, AND THIS INDICATES IMPROPER INPUT PARAMETERS. | 
|---|
|  | 985 | C | 
|---|
|  | 986 | C     SUBPROGRAMS CALLED | 
|---|
|  | 987 | C | 
|---|
|  | 988 | C       FORTRAN-SUPPLIED ... ABS,MAX,MIN,SQRT | 
|---|
|  | 989 | C | 
|---|
|  | 990 | C     ARGONNE NATIONAL LABORATORY. MINPACK PROJECT. JUNE 1983 | 
|---|
|  | 991 | C     JORGE J. MORE', DAVID J. THUENTE | 
|---|
|  | 992 | C | 
|---|
|  | 993 | DOUBLE PRECISION GAMMA,P,Q,R,S,SGND,STPC,STPF,STPQ,THETA | 
|---|
|  | 994 | INFO = 0 | 
|---|
|  | 995 | C | 
|---|
|  | 996 | C     CHECK THE INPUT PARAMETERS FOR ERRORS. | 
|---|
|  | 997 | C | 
|---|
|  | 998 | IF ((BRACKT .AND. (STP .LE. MIN(STX,STY) .OR. | 
|---|
|  | 999 | *    STP .GE. MAX(STX,STY))) .OR. | 
|---|
|  | 1000 | *    DX*(STP-STX) .GE. 0.0 .OR. STPMAX .LT. STPMIN) RETURN | 
|---|
|  | 1001 | C | 
|---|
|  | 1002 | C     DETERMINE IF THE DERIVATIVES HAVE OPPOSITE SIGN. | 
|---|
|  | 1003 | C | 
|---|
|  | 1004 | SGND = DP*(DX/ABS(DX)) | 
|---|
|  | 1005 | C | 
|---|
|  | 1006 | C     FIRST CASE. A HIGHER FUNCTION VALUE. | 
|---|
|  | 1007 | C     THE MINIMUM IS BRACKETED. IF THE CUBIC STEP IS CLOSER | 
|---|
|  | 1008 | C     TO STX THAN THE QUADRATIC STEP, THE CUBIC STEP IS TAKEN, | 
|---|
|  | 1009 | C     ELSE THE AVERAGE OF THE CUBIC AND QUADRATIC STEPS IS TAKEN. | 
|---|
|  | 1010 | C | 
|---|
|  | 1011 | IF (FP .GT. FX) THEN | 
|---|
|  | 1012 | INFO = 1 | 
|---|
|  | 1013 | BOUND = .TRUE. | 
|---|
|  | 1014 | THETA = 3*(FX - FP)/(STP - STX) + DX + DP | 
|---|
|  | 1015 | S = MAX(ABS(THETA),ABS(DX),ABS(DP)) | 
|---|
|  | 1016 | GAMMA = S*SQRT((THETA/S)**2 - (DX/S)*(DP/S)) | 
|---|
|  | 1017 | IF (STP .LT. STX) GAMMA = -GAMMA | 
|---|
|  | 1018 | P = (GAMMA - DX) + THETA | 
|---|
|  | 1019 | Q = ((GAMMA - DX) + GAMMA) + DP | 
|---|
|  | 1020 | R = P/Q | 
|---|
|  | 1021 | STPC = STX + R*(STP - STX) | 
|---|
|  | 1022 | STPQ = STX + ((DX/((FX-FP)/(STP-STX)+DX))/2)*(STP - STX) | 
|---|
|  | 1023 | IF (ABS(STPC-STX) .LT. ABS(STPQ-STX)) THEN | 
|---|
|  | 1024 | STPF = STPC | 
|---|
|  | 1025 | ELSE | 
|---|
|  | 1026 | STPF = STPC + (STPQ - STPC)/2 | 
|---|
|  | 1027 | END IF | 
|---|
|  | 1028 | BRACKT = .TRUE. | 
|---|
|  | 1029 | C | 
|---|
|  | 1030 | C     SECOND CASE. A LOWER FUNCTION VALUE AND DERIVATIVES OF | 
|---|
|  | 1031 | C     OPPOSITE SIGN. THE MINIMUM IS BRACKETED. IF THE CUBIC | 
|---|
|  | 1032 | C     STEP IS CLOSER TO STX THAN THE QUADRATIC (SECANT) STEP, | 
|---|
|  | 1033 | C     THE CUBIC STEP IS TAKEN, ELSE THE QUADRATIC STEP IS TAKEN. | 
|---|
|  | 1034 | C | 
|---|
|  | 1035 | ELSE IF (SGND .LT. 0.0) THEN | 
|---|
|  | 1036 | INFO = 2 | 
|---|
|  | 1037 | BOUND = .FALSE. | 
|---|
|  | 1038 | THETA = 3*(FX - FP)/(STP - STX) + DX + DP | 
|---|
|  | 1039 | S = MAX(ABS(THETA),ABS(DX),ABS(DP)) | 
|---|
|  | 1040 | GAMMA = S*SQRT((THETA/S)**2 - (DX/S)*(DP/S)) | 
|---|
|  | 1041 | IF (STP .GT. STX) GAMMA = -GAMMA | 
|---|
|  | 1042 | P = (GAMMA - DP) + THETA | 
|---|
|  | 1043 | Q = ((GAMMA - DP) + GAMMA) + DX | 
|---|
|  | 1044 | R = P/Q | 
|---|
|  | 1045 | STPC = STP + R*(STX - STP) | 
|---|
|  | 1046 | STPQ = STP + (DP/(DP-DX))*(STX - STP) | 
|---|
|  | 1047 | IF (ABS(STPC-STP) .GT. ABS(STPQ-STP)) THEN | 
|---|
|  | 1048 | STPF = STPC | 
|---|
|  | 1049 | ELSE | 
|---|
|  | 1050 | STPF = STPQ | 
|---|
|  | 1051 | END IF | 
|---|
|  | 1052 | BRACKT = .TRUE. | 
|---|
|  | 1053 | C | 
|---|
|  | 1054 | C     THIRD CASE. A LOWER FUNCTION VALUE, DERIVATIVES OF THE | 
|---|
|  | 1055 | C     SAME SIGN, AND THE MAGNITUDE OF THE DERIVATIVE DECREASES. | 
|---|
|  | 1056 | C     THE CUBIC STEP IS ONLY USED IF THE CUBIC TENDS TO INFINITY | 
|---|
|  | 1057 | C     IN THE DIRECTION OF THE STEP OR IF THE MINIMUM OF THE CUBIC | 
|---|
|  | 1058 | C     IS BEYOND STP. OTHERWISE THE CUBIC STEP IS DEFINED TO BE | 
|---|
|  | 1059 | C     EITHER STPMIN OR STPMAX. THE QUADRATIC (SECANT) STEP IS ALSO | 
|---|
|  | 1060 | C     COMPUTED AND IF THE MINIMUM IS BRACKETED THEN THE THE STEP | 
|---|
|  | 1061 | C     CLOSEST TO STX IS TAKEN, ELSE THE STEP FARTHEST AWAY IS TAKEN. | 
|---|
|  | 1062 | C | 
|---|
|  | 1063 | ELSE IF (ABS(DP) .LT. ABS(DX)) THEN | 
|---|
|  | 1064 | INFO = 3 | 
|---|
|  | 1065 | BOUND = .TRUE. | 
|---|
|  | 1066 | THETA = 3*(FX - FP)/(STP - STX) + DX + DP | 
|---|
|  | 1067 | S = MAX(ABS(THETA),ABS(DX),ABS(DP)) | 
|---|
|  | 1068 | C | 
|---|
|  | 1069 | C        THE CASE GAMMA = 0 ONLY ARISES IF THE CUBIC DOES NOT TEND | 
|---|
|  | 1070 | C        TO INFINITY IN THE DIRECTION OF THE STEP. | 
|---|
|  | 1071 | C | 
|---|
|  | 1072 | GAMMA = S*SQRT(MAX(0.0D0,(THETA/S)**2 - (DX/S)*(DP/S))) | 
|---|
|  | 1073 | IF (STP .GT. STX) GAMMA = -GAMMA | 
|---|
|  | 1074 | P = (GAMMA - DP) + THETA | 
|---|
|  | 1075 | Q = (GAMMA + (DX - DP)) + GAMMA | 
|---|
|  | 1076 | R = P/Q | 
|---|
|  | 1077 | IF (R .LT. 0.0 .AND. GAMMA .NE. 0.0) THEN | 
|---|
|  | 1078 | STPC = STP + R*(STX - STP) | 
|---|
|  | 1079 | ELSE IF (STP .GT. STX) THEN | 
|---|
|  | 1080 | STPC = STPMAX | 
|---|
|  | 1081 | ELSE | 
|---|
|  | 1082 | STPC = STPMIN | 
|---|
|  | 1083 | END IF | 
|---|
|  | 1084 | STPQ = STP + (DP/(DP-DX))*(STX - STP) | 
|---|
|  | 1085 | IF (BRACKT) THEN | 
|---|
|  | 1086 | IF (ABS(STP-STPC) .LT. ABS(STP-STPQ)) THEN | 
|---|
|  | 1087 | STPF = STPC | 
|---|
|  | 1088 | ELSE | 
|---|
|  | 1089 | STPF = STPQ | 
|---|
|  | 1090 | END IF | 
|---|
|  | 1091 | ELSE | 
|---|
|  | 1092 | IF (ABS(STP-STPC) .GT. ABS(STP-STPQ)) THEN | 
|---|
|  | 1093 | STPF = STPC | 
|---|
|  | 1094 | ELSE | 
|---|
|  | 1095 | STPF = STPQ | 
|---|
|  | 1096 | END IF | 
|---|
|  | 1097 | END IF | 
|---|
|  | 1098 | C | 
|---|
|  | 1099 | C     FOURTH CASE. A LOWER FUNCTION VALUE, DERIVATIVES OF THE | 
|---|
|  | 1100 | C     SAME SIGN, AND THE MAGNITUDE OF THE DERIVATIVE DOES | 
|---|
|  | 1101 | C     NOT DECREASE. IF THE MINIMUM IS NOT BRACKETED, THE STEP | 
|---|
|  | 1102 | C     IS EITHER STPMIN OR STPMAX, ELSE THE CUBIC STEP IS TAKEN. | 
|---|
|  | 1103 | C | 
|---|
|  | 1104 | ELSE | 
|---|
|  | 1105 | INFO = 4 | 
|---|
|  | 1106 | BOUND = .FALSE. | 
|---|
|  | 1107 | IF (BRACKT) THEN | 
|---|
|  | 1108 | THETA = 3*(FP - FY)/(STY - STP) + DY + DP | 
|---|
|  | 1109 | S = MAX(ABS(THETA),ABS(DY),ABS(DP)) | 
|---|
|  | 1110 | GAMMA = S*SQRT((THETA/S)**2 - (DY/S)*(DP/S)) | 
|---|
|  | 1111 | IF (STP .GT. STY) GAMMA = -GAMMA | 
|---|
|  | 1112 | P = (GAMMA - DP) + THETA | 
|---|
|  | 1113 | Q = ((GAMMA - DP) + GAMMA) + DY | 
|---|
|  | 1114 | R = P/Q | 
|---|
|  | 1115 | STPC = STP + R*(STY - STP) | 
|---|
|  | 1116 | STPF = STPC | 
|---|
|  | 1117 | ELSE IF (STP .GT. STX) THEN | 
|---|
|  | 1118 | STPF = STPMAX | 
|---|
|  | 1119 | ELSE | 
|---|
|  | 1120 | STPF = STPMIN | 
|---|
|  | 1121 | END IF | 
|---|
|  | 1122 | END IF | 
|---|
|  | 1123 | C | 
|---|
|  | 1124 | C     UPDATE THE INTERVAL OF UNCERTAINTY. THIS UPDATE DOES NOT | 
|---|
|  | 1125 | C     DEPEND ON THE NEW STEP OR THE CASE ANALYSIS ABOVE. | 
|---|
|  | 1126 | C | 
|---|
|  | 1127 | IF (FP .GT. FX) THEN | 
|---|
|  | 1128 | STY = STP | 
|---|
|  | 1129 | FY = FP | 
|---|
|  | 1130 | DY = DP | 
|---|
|  | 1131 | ELSE | 
|---|
|  | 1132 | IF (SGND .LT. 0.0) THEN | 
|---|
|  | 1133 | STY = STX | 
|---|
|  | 1134 | FY = FX | 
|---|
|  | 1135 | DY = DX | 
|---|
|  | 1136 | END IF | 
|---|
|  | 1137 | STX = STP | 
|---|
|  | 1138 | FX = FP | 
|---|
|  | 1139 | DX = DP | 
|---|
|  | 1140 | END IF | 
|---|
|  | 1141 | C | 
|---|
|  | 1142 | C     COMPUTE THE NEW STEP AND SAFEGUARD IT. | 
|---|
|  | 1143 | C | 
|---|
|  | 1144 | STPF = MIN(STPMAX,STPF) | 
|---|
|  | 1145 | STPF = MAX(STPMIN,STPF) | 
|---|
|  | 1146 | STP = STPF | 
|---|
|  | 1147 | IF (BRACKT .AND. BOUND) THEN | 
|---|
|  | 1148 | IF (STY .GT. STX) THEN | 
|---|
|  | 1149 | STP = MIN(STX+0.66*(STY-STX),STP) | 
|---|
|  | 1150 | ELSE | 
|---|
|  | 1151 | STP = MAX(STX+0.66*(STY-STX),STP) | 
|---|
|  | 1152 | END IF | 
|---|
|  | 1153 | END IF | 
|---|
|  | 1154 | RETURN | 
|---|
|  | 1155 | C | 
|---|
|  | 1156 | C     LAST LINE OF SUBROUTINE MCSTEP. | 
|---|
|  | 1157 | C | 
|---|
|  | 1158 | END | 
|---|
|  | 1159 |  | 
|---|