| 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 | 
|---|