📄 lbfgs.f90
字号:
!
NPT=POINT*N
DO 175 I=1,N
W(ISPT+NPT+I)= STP*W(ISPT+NPT+I)
175 W(IYPT+NPT+I)= G(I)-W(I)
POINT=POINT+1
IF (POINT.EQ.M)POINT=0
!
! TERMINATION TEST
! ----------------
!
GNORM= DSQRT(DDOT(N,G,1,G,1))
XNORM= DSQRT(DDOT(N,X,1,X,1))
XNORM= DMAX1(1.0D0,XNORM)
IF (GNORM/XNORM .LE. EPS) FINISH=.TRUE.
!
IF(IPRINT(1).GE.0) CALL LB1(IPRINT,ITER,NFUN, &
GNORM,N,M,X,F,G,STP,FINISH)
! We've completed a line search. Cache the current solution vector.
!
! At the end of searching, the solution cache is different from
! the current solution if the search is terminated in the
! middle of a line search. That is the case if, for example,
! the number of function evaluations is the criterion to stop
! the search instead of the number of line searches or convergence
! to a prescribed tolerance.
DO 177 I=1,N
SCACHE(I) = X(I)
177 CONTINUE
IF (FINISH) THEN
IFLAG=0
RETURN
ENDIF
GO TO 80
!
! ------------------------------------------------------------
! END OF MAIN ITERATION LOOP. ERROR EXITS.
! ------------------------------------------------------------
!
190 IFLAG=-1
IF(LP.GT.0) WRITE(LP,200) INFO
RETURN
195 IFLAG=-2
IF(LP.GT.0) WRITE(LP,235) I
RETURN
196 IFLAG= -3
IF(LP.GT.0) WRITE(LP,240)
!
! FORMATS
! -------
!
200 FORMAT(/' IFLAG= -1 ',/' LINE SEARCH FAILED. SEE', &
' DOCUMENTATION OF ROUTINE MCSRCH',/' ERROR RETURN', &
' OF LINE SEARCH: INFO= ',I2,/ &
' POSSIBLE CAUSES: FUNCTION OR GRADIENT ARE INCORRECT',/ &
' OR INCORRECT TOLERANCES')
235 FORMAT(/' IFLAG= -2',/' THE',I5,'-TH DIAGONAL ELEMENT OF THE',/, &
' INVERSE HESSIAN APPROXIMATION IS NOT POSITIVE')
240 FORMAT(/' IFLAG= -3',/' IMPROPER INPUT PARAMETERS (N OR M', &
' ARE NOT POSITIVE)')
245 FORMAT(/' GTOL IS LESS THAN OR EQUAL TO 1.D-04', &
/ ' IT HAS BEEN RESET TO 9.D-01')
RETURN
END
!
! LAST LINE OF SUBROUTINE LBFGS
!
!
SUBROUTINE LB1(IPRINT,ITER,NFUN, &
GNORM,N,M,X,F,G,STP,FINISH)
!
! -------------------------------------------------------------
! THIS ROUTINE PRINTS MONITORING INFORMATION. THE FREQUENCY AND
! AMOUNT OF OUTPUT ARE CONTROLLED BY IPRINT.
! -------------------------------------------------------------
!
INTEGER IPRINT(2),ITER,NFUN,LP,MP,N,M
DOUBLE PRECISION X(N),G(N),F,GNORM,STP,GTOL,STPMIN,STPMAX
LOGICAL FINISH
COMMON /LB3/MP,LP,GTOL,STPMIN,STPMAX
!
IF (ITER.EQ.0)THEN
WRITE(MP,10)
WRITE(MP,20) N,M
WRITE(MP,30)F,GNORM
IF (IPRINT(2).GE.1)THEN
WRITE(MP,40)
WRITE(MP,50) (X(I),I=1,N)
WRITE(MP,60)
WRITE(MP,50) (G(I),I=1,N)
ENDIF
WRITE(MP,10)
WRITE(MP,70)
ELSE
IF ((IPRINT(1).EQ.0).AND.(ITER.NE.1.AND..NOT.FINISH))RETURN
IF (IPRINT(1).NE.0)THEN
IF(MOD(ITER-1,IPRINT(1)).EQ.0.OR.FINISH)THEN
IF(IPRINT(2).GT.1.AND.ITER.GT.1) WRITE(MP,70)
WRITE(MP,80)ITER,NFUN,F,GNORM,STP
ELSE
RETURN
ENDIF
ELSE
IF( IPRINT(2).GT.1.AND.FINISH) WRITE(MP,70)
WRITE(MP,80)ITER,NFUN,F,GNORM,STP
ENDIF
IF (IPRINT(2).EQ.2.OR.IPRINT(2).EQ.3)THEN
IF (FINISH)THEN
WRITE(MP,90)
ELSE
WRITE(MP,40)
ENDIF
WRITE(MP,50)(X(I),I=1,N)
IF (IPRINT(2).EQ.3)THEN
WRITE(MP,60)
WRITE(MP,50)(G(I),I=1,N)
ENDIF
ENDIF
IF (FINISH) WRITE(MP,100)
ENDIF
!
10 FORMAT('*************************************************')
20 FORMAT(' N=',I5,' NUMBER OF CORRECTIONS=',I2, &
/, ' INITIAL VALUES')
30 FORMAT(' F= ',1PD22.15,' GNORM= ',1PD22.15)
40 FORMAT(' VECTOR X= ')
50 FORMAT(4(2X,1PD22.15))
60 FORMAT(' GRADIENT VECTOR G= ')
70 FORMAT(/' I NFN',5X,'FUNC',20X,'GNORM',19X,'STEPLENGTH'/)
80 FORMAT(2(I4,1X),3X,3(1PD22.15,2X))
90 FORMAT(' FINAL POINT X= ')
100 FORMAT(/' THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.', &
/' IFLAG = 0')
!
RETURN
END
! ******
!
!
! ----------------------------------------------------------
! DATA
! ----------------------------------------------------------
!
BLOCK DATA LB2
INTEGER LP,MP
DOUBLE PRECISION GTOL,STPMIN,STPMAX
COMMON /LB3/MP,LP,GTOL,STPMIN,STPMAX
DATA MP,LP,GTOL,STPMIN,STPMAX/6,6,9.0D-01,1.0D-20,1.0D+20/
END
!
!
! ----------------------------------------------------------
!
subroutine daxpy(n,da,dx,incx,dy,incy)
!
! constant times a vector plus a vector.
! uses unrolled loops for increments equal to one.
! jack dongarra, linpack, 3/11/78.
!
double precision dx(1),dy(1),da
integer i,incx,incy,ix,iy,m,mp1,n
!
if(n.le.0)return
if (da .eq. 0.0d0) return
if(incx.eq.1.and.incy.eq.1)go to 20
!
! code for unequal increments or equal increments
! not equal to 1
!
ix = 1
iy = 1
if(incx.lt.0)ix = (-n+1)*incx + 1
if(incy.lt.0)iy = (-n+1)*incy + 1
do 10 i = 1,n
dy(iy) = dy(iy) + da*dx(ix)
ix = ix + incx
iy = iy + incy
10 continue
return
!
! code for both increments equal to 1
!
!
! clean-up loop
!
20 m = mod(n,4)
if( m .eq. 0 ) go to 40
do 30 i = 1,m
dy(i) = dy(i) + da*dx(i)
30 continue
if( n .lt. 4 ) return
40 mp1 = m + 1
do 50 i = mp1,n,4
dy(i) = dy(i) + da*dx(i)
dy(i + 1) = dy(i + 1) + da*dx(i + 1)
dy(i + 2) = dy(i + 2) + da*dx(i + 2)
dy(i + 3) = dy(i + 3) + da*dx(i + 3)
50 continue
return
end
!
!
! ----------------------------------------------------------
!
double precision function ddot(n,dx,incx,dy,incy)
!
! forms the dot product of two vectors.
! uses unrolled loops for increments equal to one.
! jack dongarra, linpack, 3/11/78.
!
double precision dx(1),dy(1),dtemp
integer i,incx,incy,ix,iy,m,mp1,n
!
ddot = 0.0d0
dtemp = 0.0d0
if(n.le.0)return
if(incx.eq.1.and.incy.eq.1)go to 20
!
! code for unequal increments or equal increments
! not equal to 1
!
ix = 1
iy = 1
if(incx.lt.0)ix = (-n+1)*incx + 1
if(incy.lt.0)iy = (-n+1)*incy + 1
do 10 i = 1,n
dtemp = dtemp + dx(ix)*dy(iy)
ix = ix + incx
iy = iy + incy
10 continue
ddot = dtemp
return
!
! code for both increments equal to 1
!
!
! clean-up loop
!
20 m = mod(n,5)
if( m .eq. 0 ) go to 40
do 30 i = 1,m
dtemp = dtemp + dx(i)*dy(i)
30 continue
if( n .lt. 5 ) go to 60
40 mp1 = m + 1
do 50 i = mp1,n,5
dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) + &
dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4)
50 continue
60 ddot = dtemp
return
end
! ------------------------------------------------------------------
!
! **************************
! LINE SEARCH ROUTINE MCSRCH
! **************************
!
SUBROUTINE MCSRCH(N,X,F,G,S,STP,FTOL,XTOL,MAXFEV,INFO,NFEV,WA)
INTEGER N,MAXFEV,INFO,NFEV
DOUBLE PRECISION F,STP,FTOL,GTOL,XTOL,STPMIN,STPMAX
DOUBLE PRECISION X(N),G(N),S(N),WA(N)
COMMON /LB3/MP,LP,GTOL,STPMIN,STPMAX
SAVE
!
! SUBROUTINE MCSRCH
!
! A slight modification of the subroutine CSRCH of More' and Thuente.
! The changes are to allow reverse communication, and do not affect
! the performance of the routine.
!
! THE PURPOSE OF MCSRCH IS TO FIND A STEP WHICH SATISFIES
! A SUFFICIENT DECREASE CONDITION AND A CURVATURE CONDITION.
!
! AT EACH STAGE THE SUBROUTINE UPDATES AN INTERVAL OF
! UNCERTAINTY WITH ENDPOINTS STX AND STY. THE INTERVAL OF
! UNCERTAINTY IS INITIALLY CHOSEN SO THAT IT CONTAINS A
! MINIMIZER OF THE MODIFIED FUNCTION
!
! F(X+STP*S) - F(X) - FTOL*STP*(GRADF(X)'S).
!
! IF A STEP IS OBTAINED FOR WHICH THE MODIFIED FUNCTION
! HAS A NONPOSITIVE FUNCTION VALUE AND NONNEGATIVE DERIVATIVE,
! THEN THE INTERVAL OF UNCERTAINTY IS CHOSEN SO THAT IT
! CONTAINS A MINIMIZER OF F(X+STP*S).
!
! THE ALGORITHM IS DESIGNED TO FIND A STEP WHICH SATISFIES
! THE SUFFICIENT DECREASE CONDITION
!
! F(X+STP*S) .LE. F(X) + FTOL*STP*(GRADF(X)'S),
!
! AND THE CURVATURE CONDITION
!
! ABS(GRADF(X+STP*S)'S)) .LE. GTOL*ABS(GRADF(X)'S).
!
! IF FTOL IS LESS THAN GTOL AND IF, FOR EXAMPLE, THE FUNCTION
! IS BOUNDED BELOW, THEN THERE IS ALWAYS A STEP WHICH SATISFIES
! BOTH CONDITIONS. IF NO STEP CAN BE FOUND WHICH SATISFIES BOTH
! CONDITIONS, THEN THE ALGORITHM USUALLY STOPS WHEN ROUNDING
! ERRORS PREVENT FURTHER PROGRESS. IN THIS CASE STP ONLY
! SATISFIES THE SUFFICIENT DECREASE CONDITION.
!
! THE SUBROUTINE STATEMENT IS
!
! SUBROUTINE MCSRCH(N,X,F,G,S,STP,FTOL,XTOL, MAXFEV,INFO,NFEV,WA)
! WHERE
!
! N IS A POSITIVE INTEGER INPUT VARIABLE SET TO THE NUMBER
! OF VARIABLES.
!
! X IS AN ARRAY OF LENGTH N. ON INPUT IT MUST CONTAIN THE
! BASE POINT FOR THE LINE SEARCH. ON OUTPUT IT CONTAINS
! X + STP*S.
!
! F IS A VARIABLE. ON INPUT IT MUST CONTAIN THE VALUE OF F
! AT X. ON OUTPUT IT CONTAINS THE VALUE OF F AT X + STP*S.
!
! G IS AN ARRAY OF LENGTH N. ON INPUT IT MUST CONTAIN THE
! GRADIENT OF F AT X. ON OUTPUT IT CONTAINS THE GRADIENT
! OF F AT X + STP*S.
!
! S IS AN INPUT ARRAY OF LENGTH N WHICH SPECIFIES THE
! SEARCH DIRECTION.
!
! STP IS A NONNEGATIVE VARIABLE. ON INPUT STP CONTAINS AN
! INITIAL ESTIMATE OF A SATISFACTORY STEP. ON OUTPUT
! STP CONTAINS THE FINAL ESTIMATE.
!
! FTOL AND GTOL ARE NONNEGATIVE INPUT VARIABLES. (In this reverse
! communication implementation GTOL is defined in a COMMON
! statement.) TERMINATION OCCURS WHEN THE SUFFICIENT DECREASE
! CONDITION AND THE DIRECTIONAL DERIVATIVE CONDITION ARE
! SATISFIED.
!
! XTOL IS A NONNEGATIVE INPUT VARIABLE. TERMINATION OCCURS
! WHEN THE RELATIVE WIDTH OF THE INTERVAL OF UNCERTAINTY
! IS AT MOST XTOL.
!
! STPMIN AND STPMAX ARE NONNEGATIVE INPUT VARIABLES WHICH
! SPECIFY LOWER AND UPPER BOUNDS FOR THE STEP. (In this reverse
! communication implementatin they are defined in a COMMON
! statement).
!
! MAXFEV IS A POSITIVE INTEGER INPUT VARIABLE. TERMINATION
! OCCURS WHEN THE NUMBER OF CALLS TO FCN IS AT LEAST
! MAXFEV BY THE END OF AN ITERATION.
!
! INFO IS AN INTEGER OUTPUT VARIABLE SET AS FOLLOWS:
!
! INFO = 0 IMPROPER INPUT PARAMETERS.
!
! INFO =-1 A RETURN IS MADE TO COMPUTE THE FUNCTION AND GRADIENT.
!
! INFO = 1 THE SUFFICIENT DECREASE CONDITION AND THE
! DIRECTIONAL DERIVATIVE CONDITION HOLD.
!
! INFO = 2 RELATIVE WIDTH OF THE INTERVAL OF UNCERTAINTY
! IS AT MOST XTOL.
!
! INFO = 3 NUMBER OF CALLS TO FCN HAS REACHED MAXFEV.
!
! INFO = 4 THE STEP IS AT THE LOWER BOUND STPMIN.
!
! INFO = 5 THE STEP IS AT THE UPPER BOUND STPMAX.
!
! 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.
!
! NFEV IS AN INTEGER OUTPUT VARIABLE SET TO THE NUMBER OF
! CALLS TO FCN.
!
! WA IS A WORK ARRAY OF LENGTH N.
!
! SUBPROGRAMS CALLED
!
! MCSTEP
!
! FORTRAN-SUPPLIED...ABS,MAX,MIN
!
! ARGONNE NATIONAL LABORATORY. MINPACK PROJECT. JUNE 1983
! JORGE J. MORE', DAVID J. THUENTE
!
! **********
INTEGER INFOC,J
LOGICAL BRACKT,STAGE1
DOUBLE PRECISION DG,DGM,DGINIT,DGTEST,DGX,DGXM,DGY,DGYM, &
FINIT,FTEST1,FM,FX,FXM,FY,FYM,P5,P66,STX,STY, &
STMIN,STMAX,WIDTH,WIDTH1,XTRAPF,ZERO
DATA P5,P66,XTRAPF,ZERO /0.5D0,0.66D0,4.0D0,0.0D0/
IF(INFO.EQ.-1) GO TO 45
INFOC = 1
!
! CHECK THE INPUT PARAMETERS FOR ERRORS.
!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -