📄 lbfgs.f90
字号:
! Modification of lbfgs.f as retrieved 1997/03/29 from
! ftp://ftp.netlib.org/opt/lbfgs_um.shar
!
! This version copyright 2006 by Robert Dodier and released
! under the terms of the GNU General Public License, version 2.
!
! ---------------- Message from the author ----------------
! From: Jorge Nocedal [mailto:nocedal@dario.ece.nwu.edu]
! Sent: Friday, August 17, 2001 9:09 AM
! To: Robert Dodier
! Subject: Re: Commercial licensing terms for LBFGS?
!
! Robert:
! The code L-BFGS (for unconstrained problems) is in the public domain.
! It can be used in any commercial application.
!
! The code L-BFGS-B (for bound constrained problems) belongs to
! ACM. You need to contact them for a commercial license. It is
! algorithm 778.
!
! Jorge
! --------------------- End of message --------------------
! ----------------------------------------------------------------------
! This file contains the LBFGS algorithm and supporting routines
!
! ****************
! LBFGS SUBROUTINE
! ****************
!
SUBROUTINE LBFGS(N,M,X,F,G,DIAGCO,DIAG,IPRINT,EPS,XTOL,W,IFLAG &
,SCACHE)
!
INTEGER N,M,IPRINT(2),IFLAG
DOUBLE PRECISION X(N),G(N),DIAG(N),W(N*(2*M+1)+2*M),SCACHE(N)
DOUBLE PRECISION F,EPS,XTOL
LOGICAL DIAGCO
!
! LIMITED MEMORY BFGS METHOD FOR LARGE SCALE OPTIMIZATION
! JORGE NOCEDAL
! *** July 1990 ***
!
!
! This subroutine solves the unconstrained minimization problem
!
! min F(x), x= (x1,x2,...,xN),
!
! using the limited memory BFGS method. The routine is especially
! effective on problems involving a large number of variables. In
! a typical iteration of this method an approximation Hk to the
! inverse of the Hessian is obtained by applying M BFGS updates to
! a diagonal matrix Hk0, using information from the previous M steps.
! The user specifies the number M, which determines the amount of
! storage required by the routine. The user may also provide the
! diagonal matrices Hk0 if not satisfied with the default choice.
! The algorithm is described in "On the limited memory BFGS method
! for large scale optimization", by D. Liu and J. Nocedal,
! Mathematical Programming B 45 (1989) 503-528.
!
! The user is required to calculate the function value F and its
! gradient G. In order to allow the user complete control over
! these computations, reverse communication is used. The routine
! must be called repeatedly under the control of the parameter
! IFLAG.
!
! The steplength is determined at each iteration by means of the
! line search routine MCVSRCH, which is a slight modification of
! the routine CSRCH written by More' and Thuente.
!
! The calling statement is
!
! CALL LBFGS(N,M,X,F,G,DIAGCO,DIAG,IPRINT,EPS,XTOL,W,IFLAG)
!
! where
!
! N is an INTEGER variable that must be set by the user to the
! number of variables. It is not altered by the routine.
! Restriction: N>0.
!
! M is an INTEGER variable that must be set by the user to
! the number of corrections used in the BFGS update. It
! is not altered by the routine. Values of M less than 3 are
! not recommended; large values of M will result in excessive
! computing time. 3<= M <=7 is recommended. Restriction: M>0.
!
! X is a DOUBLE PRECISION array of length N. On initial entry
! it must be set by the user to the values of the initial
! estimate of the solution vector. On exit with IFLAG=0, it
! contains the values of the variables at the best point
! found (usually a solution).
!
! F is a DOUBLE PRECISION variable. Before initial entry and on
! a re-entry with IFLAG=1, it must be set by the user to
! contain the value of the function F at the point X.
!
! G is a DOUBLE PRECISION array of length N. Before initial
! entry and on a re-entry with IFLAG=1, it must be set by
! the user to contain the components of the gradient G at
! the point X.
!
! DIAGCO is a LOGICAL variable that must be set to .TRUE. if the
! user wishes to provide the diagonal matrix Hk0 at each
! iteration. Otherwise it should be set to .FALSE., in which
! case LBFGS will use a default value described below. If
! DIAGCO is set to .TRUE. the routine will return at each
! iteration of the algorithm with IFLAG=2, and the diagonal
! matrix Hk0 must be provided in the array DIAG.
!
!
! DIAG is a DOUBLE PRECISION array of length N. If DIAGCO=.TRUE.,
! then on initial entry or on re-entry with IFLAG=2, DIAG
! it must be set by the user to contain the values of the
! diagonal matrix Hk0. Restriction: all elements of DIAG
! must be positive.
!
! IPRINT is an INTEGER array of length two which must be set by the
! user.
!
! IPRINT(1) specifies the frequency of the output:
! IPRINT(1) < 0 : no output is generated,
! IPRINT(1) = 0 : output only at first and last iteration,
! IPRINT(1) > 0 : output every IPRINT(1) iterations.
!
! IPRINT(2) specifies the type of output generated:
! IPRINT(2) = 0 : iteration count, number of function
! evaluations, function value, norm of the
! gradient, and steplength,
! IPRINT(2) = 1 : same as IPRINT(2)=0, plus vector of
! variables and gradient vector at the
! initial point,
! IPRINT(2) = 2 : same as IPRINT(2)=1, plus vector of
! variables,
! IPRINT(2) = 3 : same as IPRINT(2)=2, plus gradient vector.
!
!
! EPS is a positive DOUBLE PRECISION variable that must be set by
! the user, and determines the accuracy with which the solution
! is to be found. The subroutine terminates when
!
! ||G|| < EPS max(1,||X||),
!
! where ||.|| denotes the Euclidean norm.
!
! XTOL is a positive DOUBLE PRECISION variable that must be set by
! the user to an estimate of the machine precision (e.g.
! 10**(-16) on a SUN station 3/60). The line search routine will
! terminate if the relative width of the interval of uncertainty
! is less than XTOL.
!
! W is a DOUBLE PRECISION array of length N(2M+1)+2M used as
! workspace for LBFGS. This array must not be altered by the
! user.
!
! IFLAG is an INTEGER variable that must be set to 0 on initial entry
! to the subroutine. A return with IFLAG<0 indicates an error,
! and IFLAG=0 indicates that the routine has terminated without
! detecting errors. On a return with IFLAG=1, the user must
! evaluate the function F and gradient G. On a return with
! IFLAG=2, the user must provide the diagonal matrix Hk0.
!
! The following negative values of IFLAG, detecting an error,
! are possible:
!
! IFLAG=-1 The line search routine MCSRCH failed. The
! parameter INFO provides more detailed information
! (see also the documentation of MCSRCH):
!
! INFO = 0 IMPROPER INPUT PARAMETERS.
!
! INFO = 2 RELATIVE WIDTH OF THE INTERVAL OF
! UNCERTAINTY IS AT MOST XTOL.
!
! INFO = 3 MORE THAN 20 FUNCTION EVALUATIONS WERE
! REQUIRED AT THE PRESENT ITERATION.
!
! INFO = 4 THE STEP IS TOO SMALL.
!
! INFO = 5 THE STEP IS TOO LARGE.
!
! INFO = 6 ROUNDING ERRORS PREVENT FURTHER PROGRESS.
! THERE MAY NOT BE A STEP WHICH SATISFIES
! THE SUFFICIENT DECREASE AND CURVATURE
! CONDITIONS. TOLERANCES MAY BE TOO SMALL.
!
!
! IFLAG=-2 The i-th diagonal element of the diagonal inverse
! Hessian approximation, given in DIAG, is not
! positive.
!
! IFLAG=-3 Improper input parameters for LBFGS (N or M are
! not positive).
!
!
!
! ON THE DRIVER:
!
! The program that calls LBFGS must contain the declaration:
!
! EXTERNAL LB2
!
! LB2 is a BLOCK DATA that defines the default values of several
! parameters described in the COMMON section.
!
!
!
! COMMON:
!
! The subroutine contains one common area, which the user may wish to
! reference:
!
COMMON /LB3/MP,LP,GTOL,STPMIN,STPMAX
!
! MP is an INTEGER variable with default value 6. It is used as the
! unit number for the printing of the monitoring information
! controlled by IPRINT.
!
! LP is an INTEGER variable with default value 6. It is used as the
! unit number for the printing of error messages. This printing
! may be suppressed by setting LP to a non-positive value.
!
! GTOL is a DOUBLE PRECISION variable with default value 0.9, which
! controls the accuracy of the line search routine MCSRCH. If the
! function and gradient evaluations are inexpensive with respect
! to the cost of the iteration (which is sometimes the case when
! solving very large problems) it may be advantageous to set GTOL
! to a small value. A typical small value is 0.1. Restriction:
! GTOL should be greater than 1.D-04.
!
! STPMIN and STPMAX are non-negative DOUBLE PRECISION variables which
! specify lower and uper bounds for the step in the line search.
! Their default values are 1.D-20 and 1.D+20, respectively. These
! values need not be modified unless the exponents are too large
! for the machine being used, or unless the problem is extremely
! badly scaled (in which case the exponents should be increased).
!
!
! MACHINE DEPENDENCIES
!
! The only variables that are machine-dependent are XTOL,
! STPMIN and STPMAX.
!
!
! GENERAL INFORMATION
!
! Other routines called directly: DAXPY, DDOT, LB1, MCSRCH
!
! Input/Output : No input; diagnostic messages on unit MP and
! error messages on unit LP.
!
!
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
!
DOUBLE PRECISION GTOL,ONE,ZERO,GNORM,DDOT,STP1,FTOL,STPMIN, &
STPMAX,STP,YS,YY,SQ,YR,BETA,XNORM
INTEGER MP,LP,ITER,NFUN,POINT,ISPT,IYPT,MAXFEV,INFO, &
BOUND,NPT,CP,I,NFEV,INMC,IYCN,ISCN
LOGICAL FINISH
!
SAVE
DATA ONE,ZERO/1.0D+0,0.0D+0/
!
! INITIALIZE
! ----------
!
IF(IFLAG.EQ.0) GO TO 10
GO TO (172,100) IFLAG
10 ITER= 0
IF(N.LE.0.OR.M.LE.0) GO TO 196
IF(GTOL.LE.1.D-04) THEN
IF(LP.GT.0) WRITE(LP,245)
GTOL=9.D-01
ENDIF
NFUN= 1
POINT= 0
FINISH= .FALSE.
IF(DIAGCO) THEN
DO 30 I=1,N
30 IF (DIAG(I).LE.ZERO) GO TO 195
ELSE
DO 40 I=1,N
40 DIAG(I)= 1.0D0
ENDIF
!
! THE WORK VECTOR W IS DIVIDED AS FOLLOWS:
! ---------------------------------------
! THE FIRST N LOCATIONS ARE USED TO STORE THE GRADIENT AND
! OTHER TEMPORARY INFORMATION.
! LOCATIONS (N+1)...(N+M) STORE THE SCALARS RHO.
! LOCATIONS (N+M+1)...(N+2M) STORE THE NUMBERS ALPHA USED
! IN THE FORMULA THAT COMPUTES H*G.
! LOCATIONS (N+2M+1)...(N+2M+NM) STORE THE LAST M SEARCH
! STEPS.
! LOCATIONS (N+2M+NM+1)...(N+2M+2NM) STORE THE LAST M
! GRADIENT DIFFERENCES.
!
! THE SEARCH STEPS AND GRADIENT DIFFERENCES ARE STORED IN A
! CIRCULAR ORDER CONTROLLED BY THE PARAMETER POINT.
!
ISPT= N+2*M
IYPT= ISPT+N*M
DO 50 I=1,N
50 W(ISPT+I)= -G(I)*DIAG(I)
GNORM= DSQRT(DDOT(N,G,1,G,1))
STP1= ONE/GNORM
!
! PARAMETERS FOR LINE SEARCH ROUTINE
!
FTOL= 1.0D-4
MAXFEV= 20
!
IF(IPRINT(1).GE.0) CALL LB1(IPRINT,ITER,NFUN, &
GNORM,N,M,X,F,G,STP,FINISH)
!
! --------------------
! MAIN ITERATION LOOP
! --------------------
!
80 ITER= ITER+1
INFO=0
BOUND=ITER-1
IF(ITER.EQ.1) GO TO 165
IF (ITER .GT. M)BOUND=M
!
YS= DDOT(N,W(IYPT+NPT+1),1,W(ISPT+NPT+1),1)
IF(.NOT.DIAGCO) THEN
YY= DDOT(N,W(IYPT+NPT+1),1,W(IYPT+NPT+1),1)
DO 90 I=1,N
90 DIAG(I)= YS/YY
ELSE
IFLAG=2
RETURN
ENDIF
100 CONTINUE
IF(DIAGCO) THEN
DO 110 I=1,N
110 IF (DIAG(I).LE.ZERO) GO TO 195
ENDIF
!
! COMPUTE -H*G USING THE FORMULA GIVEN IN: Nocedal, J. 1980,
! "Updating quasi-Newton matrices with limited storage",
! Mathematics of Computation, Vol.24, No.151, pp. 773-782.
! ---------------------------------------------------------
!
CP= POINT
IF (POINT.EQ.0) CP=M
W(N+CP)= ONE/YS
DO 112 I=1,N
112 W(I)= -G(I)
CP= POINT
DO 125 I= 1,BOUND
CP=CP-1
IF (CP.EQ. -1)CP=M-1
SQ= DDOT(N,W(ISPT+CP*N+1),1,W,1)
INMC=N+M+CP+1
IYCN=IYPT+CP*N
W(INMC)= W(N+CP+1)*SQ
CALL DAXPY(N,-W(INMC),W(IYCN+1),1,W,1)
125 CONTINUE
!
DO 130 I=1,N
130 W(I)=DIAG(I)*W(I)
!
DO 145 I=1,BOUND
YR= DDOT(N,W(IYPT+CP*N+1),1,W,1)
BETA= W(N+CP+1)*YR
INMC=N+M+CP+1
BETA= W(INMC)-BETA
ISCN=ISPT+CP*N
CALL DAXPY(N,BETA,W(ISCN+1),1,W,1)
CP=CP+1
IF (CP.EQ.M)CP=0
145 CONTINUE
!
! STORE THE NEW SEARCH DIRECTION
! ------------------------------
!
DO 160 I=1,N
160 W(ISPT+POINT*N+I)= W(I)
!
! OBTAIN THE ONE-DIMENSIONAL MINIMIZER OF THE FUNCTION
! BY USING THE LINE SEARCH ROUTINE MCSRCH
! ----------------------------------------------------
165 NFEV=0
STP=ONE
IF (ITER.EQ.1) STP=STP1
DO 170 I=1,N
170 W(I)=G(I)
172 CONTINUE
CALL MCSRCH(N,X,F,G,W(ISPT+POINT*N+1),STP,FTOL, &
XTOL,MAXFEV,INFO,NFEV,DIAG)
IF (INFO .EQ. -1) THEN
IFLAG=1
RETURN
ENDIF
IF (INFO .NE. 1) GO TO 190
NFUN= NFUN + NFEV
!
! COMPUTE THE NEW STEP AND GRADIENT CHANGE
! -----------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -