| [2403] | 1 | *
 | 
|---|
 | 2 | * $Id: mnseek.F,v 1.1.1.1 2003-06-11 14:18:29 cmv Exp $
 | 
|---|
 | 3 | *
 | 
|---|
 | 4 | * $Log: not supported by cvs2svn $
 | 
|---|
 | 5 | * Revision 1.1.1.1  1996/03/07 14:31:31  mclareni
 | 
|---|
 | 6 | * Minuit
 | 
|---|
 | 7 | *
 | 
|---|
 | 8 | *
 | 
|---|
 | 9 | #include "minuit/pilot.h"
 | 
|---|
 | 10 |       SUBROUTINE MNSEEK(FCN,FUTIL)
 | 
|---|
 | 11 | #include "minuit/d506dp.inc"
 | 
|---|
 | 12 | CC   Performs a rough (but global) minimization by monte carlo search.
 | 
|---|
 | 13 | CC        Each time a new minimum is found, the search area is shifted
 | 
|---|
 | 14 | CC        to be centered at the best value.  Random points are chosen
 | 
|---|
 | 15 | CC        uniformly over a hypercube determined by current step sizes.
 | 
|---|
 | 16 | CC   The Metropolis algorithm accepts a worse point with probability
 | 
|---|
 | 17 | CC      exp(-d/UP), where d is the degradation.  Improved points
 | 
|---|
 | 18 | CC      are of course always accepted.  Actual steps are random
 | 
|---|
 | 19 | CC      multiples of the nominal steps (DIRIN).
 | 
|---|
 | 20 | CC
 | 
|---|
 | 21 | #include "minuit/d506cm.inc"
 | 
|---|
 | 22 |       EXTERNAL FCN,FUTIL
 | 
|---|
 | 23 |       PARAMETER (TWOPI=2.0*3.141593)
 | 
|---|
 | 24 |       DIMENSION  XBEST(MNI), XMID(MNI)
 | 
|---|
 | 25 |       MXFAIL = WORD7(1)
 | 
|---|
 | 26 |       IF (MXFAIL .LE. 0)  MXFAIL=100+20*NPAR
 | 
|---|
 | 27 |       MXSTEP = 10*MXFAIL
 | 
|---|
 | 28 |       IF (AMIN .EQ. UNDEFI)  CALL MNAMIN(FCN,FUTIL)
 | 
|---|
 | 29 |       ALPHA = WORD7(2)
 | 
|---|
 | 30 |       IF (ALPHA .LE. ZERO)  ALPHA=3.
 | 
|---|
 | 31 |       IF (ISW(5) .GE. 1)  WRITE (ISYSWR, 3) MXFAIL,MXSTEP,ALPHA
 | 
|---|
 | 32 |     3 FORMAT (' MNSEEK: MONTE CARLO MINIMIZATION USING METROPOLIS',
 | 
|---|
 | 33 |      + ' ALGORITHM'/' TO STOP AFTER',I6,' SUCCESSIVE FAILURES, OR',
 | 
|---|
 | 34 |      + I7,' STEPS'/' MAXIMUM STEP SIZE IS',F9.3,' ERROR BARS.')
 | 
|---|
 | 35 |       CSTATU= 'INITIAL  '
 | 
|---|
 | 36 |       IF (ISW(5) .GE. 2)  CALL MNPRIN(2,AMIN)
 | 
|---|
 | 37 |       CSTATU = 'UNCHANGED '
 | 
|---|
 | 38 |       IFAIL = 0
 | 
|---|
 | 39 |       RNUM = ZERO
 | 
|---|
 | 40 |       RNUM1 = ZERO
 | 
|---|
 | 41 |       RNUM2 = ZERO
 | 
|---|
 | 42 |       NPARX = NPAR
 | 
|---|
 | 43 |       FLAST = AMIN
 | 
|---|
 | 44 | C              set up step sizes, starting values
 | 
|---|
 | 45 |       DO 10 IPAR =  1, NPAR
 | 
|---|
 | 46 |       IEXT = NEXOFI(IPAR)
 | 
|---|
 | 47 |       DIRIN(IPAR) = 2.0*ALPHA*WERR(IPAR)
 | 
|---|
 | 48 |       IF (NVARL(IEXT) .GT. 1)  THEN
 | 
|---|
 | 49 | C              parameter with limits
 | 
|---|
 | 50 |          CALL MNDXDI(X(IPAR),IPAR,DXDI)
 | 
|---|
 | 51 |          IF (DXDI .EQ. ZERO)  DXDI=1.
 | 
|---|
 | 52 |          DIRIN(IPAR) = 2.0*ALPHA*WERR(IPAR)/DXDI
 | 
|---|
 | 53 |          IF (ABS(DIRIN(IPAR)).GT.TWOPI)  DIRIN(IPAR)=TWOPI
 | 
|---|
 | 54 |          ENDIF
 | 
|---|
 | 55 |       XMID(IPAR) = X(IPAR)
 | 
|---|
 | 56 |    10 XBEST(IPAR) = X(IPAR)
 | 
|---|
 | 57 | C                              search loop
 | 
|---|
 | 58 |       DO 500 ISTEP= 1, MXSTEP
 | 
|---|
 | 59 |       IF (IFAIL .GE. MXFAIL)  GO TO 600
 | 
|---|
 | 60 |         DO 100 IPAR= 1, NPAR
 | 
|---|
 | 61 |         CALL MNRN15(RNUM1,ISEED)
 | 
|---|
 | 62 |         CALL MNRN15(RNUM2,ISEED)
 | 
|---|
 | 63 |   100   X(IPAR) = XMID(IPAR) + 0.5*(RNUM1+RNUM2-1.)*DIRIN(IPAR)
 | 
|---|
 | 64 |       CALL MNINEX(X)
 | 
|---|
 | 65 |       CALL FCN(NPARX,GIN,FTRY,U,4,FUTIL)
 | 
|---|
 | 66 |       NFCN = NFCN + 1
 | 
|---|
 | 67 |       IF (FTRY .LT. FLAST)  THEN
 | 
|---|
 | 68 |          IF (FTRY .LT. AMIN)  THEN
 | 
|---|
 | 69 |             CSTATU = 'IMPROVEMNT'
 | 
|---|
 | 70 |             AMIN = FTRY
 | 
|---|
 | 71 |             DO 200 IB= 1, NPAR
 | 
|---|
 | 72 |   200       XBEST(IB) = X(IB)
 | 
|---|
 | 73 |             IFAIL = 0
 | 
|---|
 | 74 |             IF (ISW(5) .GE. 2) CALL MNPRIN(2,AMIN)
 | 
|---|
 | 75 |             ENDIF
 | 
|---|
 | 76 |          GO TO 300
 | 
|---|
 | 77 |       ELSE
 | 
|---|
 | 78 |          IFAIL = IFAIL + 1
 | 
|---|
 | 79 | C                   Metropolis algorithm
 | 
|---|
 | 80 |          BAR = (AMIN-FTRY)/UP
 | 
|---|
 | 81 |          CALL MNRN15(RNUM,ISEED)
 | 
|---|
 | 82 |          IF (BAR .LT. LOG(RNUM))  GO TO 500
 | 
|---|
 | 83 |       ENDIF
 | 
|---|
 | 84 | C                    Accept new point, move there
 | 
|---|
 | 85 |   300 CONTINUE
 | 
|---|
 | 86 |       DO 350 J= 1, NPAR
 | 
|---|
 | 87 |       XMID(J) = X(J)
 | 
|---|
 | 88 |   350 CONTINUE
 | 
|---|
 | 89 |       FLAST = FTRY
 | 
|---|
 | 90 |   500 CONTINUE
 | 
|---|
 | 91 | C                               end search loop
 | 
|---|
 | 92 |   600 CONTINUE
 | 
|---|
 | 93 |       IF (ISW(5) .GT. 1) WRITE (ISYSWR,601) IFAIL
 | 
|---|
 | 94 |   601 FORMAT(' MNSEEK:',I5,' SUCCESSIVE UNSUCCESSFUL TRIALS.')
 | 
|---|
 | 95 |       DO 700 IB= 1, NPAR
 | 
|---|
 | 96 |   700 X(IB) = XBEST(IB)
 | 
|---|
 | 97 |       CALL MNINEX(X)
 | 
|---|
 | 98 |       IF (ISW(5) .GE. 1)  CALL MNPRIN(2,AMIN)
 | 
|---|
 | 99 |       IF (ISW(5) .EQ. 0)  CALL MNPRIN(0,AMIN)
 | 
|---|
 | 100 |       RETURN
 | 
|---|
 | 101 |       END
 | 
|---|