| [2403] | 1 | * | 
|---|
|  | 2 | * $Id: mnsimp.F,v 1.1.1.1 2003-06-11 14:18:29 cmv Exp $ | 
|---|
|  | 3 | * | 
|---|
|  | 4 | * $Log: not supported by cvs2svn $ | 
|---|
|  | 5 | * Revision 1.2  1996/03/15 18:02:54  james | 
|---|
|  | 6 | *     Modified Files: | 
|---|
|  | 7 | * mnderi.F eliminate possible division by zero | 
|---|
|  | 8 | * mnexcm.F suppress print on STOP when print flag=-1 | 
|---|
|  | 9 | *          set FVAL3 to flag if FCN already called with IFLAG=3 | 
|---|
|  | 10 | * mninit.F set version 96.03 | 
|---|
|  | 11 | * mnlims.F remove arguments, not needed | 
|---|
|  | 12 | * mnmigr.F VLEN -> LENV in debug print statement | 
|---|
|  | 13 | * mnparm.F move call to MNRSET to after NPAR redefined, to zero all | 
|---|
|  | 14 | * mnpsdf.F eliminate possible division by zero | 
|---|
|  | 15 | * mnscan.F suppress printout when print flag =-1 | 
|---|
|  | 16 | * mnset.F  remove arguments in call to MNLIMS | 
|---|
|  | 17 | * mnsimp.F fix CSTATU so status is PROGRESS only if new minimum | 
|---|
|  | 18 | * mnvert.F eliminate possible division by zero | 
|---|
|  | 19 | * | 
|---|
|  | 20 | * Revision 1.1.1.1  1996/03/07 14:31:31  mclareni | 
|---|
|  | 21 | * Minuit | 
|---|
|  | 22 | * | 
|---|
|  | 23 | * | 
|---|
|  | 24 | #include "minuit/pilot.h" | 
|---|
|  | 25 | SUBROUTINE MNSIMP(FCN,FUTIL) | 
|---|
|  | 26 | #include "minuit/d506dp.inc" | 
|---|
|  | 27 | CC        Performs a minimization using the simplex method of Nelder | 
|---|
|  | 28 | CC        and Mead (ref. -- Comp. J. 7,308 (1965)). | 
|---|
|  | 29 | CC | 
|---|
|  | 30 | #include "minuit/d506cm.inc" | 
|---|
|  | 31 | EXTERNAL FCN,FUTIL | 
|---|
|  | 32 | DIMENSION Y(MNI+1) | 
|---|
|  | 33 | DATA ALPHA,BETA,GAMMA,RHOMIN,RHOMAX / 1.0, 0.5, 2.0, 4.0, 8.0/ | 
|---|
|  | 34 | IF (NPAR .LE. 0)  RETURN | 
|---|
|  | 35 | IF (AMIN .EQ. UNDEFI)  CALL MNAMIN(FCN,FUTIL) | 
|---|
|  | 36 | CFROM = 'SIMPLEX ' | 
|---|
|  | 37 | NFCNFR = NFCN | 
|---|
|  | 38 | CSTATU= 'UNCHANGED ' | 
|---|
|  | 39 | NPFN=NFCN | 
|---|
|  | 40 | NPARP1=NPAR+1 | 
|---|
|  | 41 | NPARX = NPAR | 
|---|
|  | 42 | RHO1 = 1.0 + ALPHA | 
|---|
|  | 43 | RHO2 = RHO1 + ALPHA*GAMMA | 
|---|
|  | 44 | WG = 1.0/FLOAT(NPAR) | 
|---|
|  | 45 | IF (ISW(5) .GE. 0) WRITE(ISYSWR,100) EPSI | 
|---|
|  | 46 | 100 FORMAT(' START SIMPLEX MINIMIZATION.    CONVERGENCE WHEN EDM .LT.' | 
|---|
|  | 47 | +,E10.2 ) | 
|---|
|  | 48 | DO 2 I= 1, NPAR | 
|---|
|  | 49 | DIRIN(I) = WERR(I) | 
|---|
|  | 50 | CALL MNDXDI(X(I),I,DXDI) | 
|---|
|  | 51 | IF (DXDI .NE. ZERO) DIRIN(I)=WERR(I)/DXDI | 
|---|
|  | 52 | DMIN = EPSMA2*ABS(X(I)) | 
|---|
|  | 53 | IF (DIRIN(I) .LT. DMIN)  DIRIN(I)=DMIN | 
|---|
|  | 54 | 2    CONTINUE | 
|---|
|  | 55 | C**       choose the initial simplex using single-parameter searches | 
|---|
|  | 56 | 1 CONTINUE | 
|---|
|  | 57 | YNPP1 = AMIN | 
|---|
|  | 58 | JL = NPARP1 | 
|---|
|  | 59 | Y(NPARP1) = AMIN | 
|---|
|  | 60 | ABSMIN = AMIN | 
|---|
|  | 61 | DO 10 I= 1, NPAR | 
|---|
|  | 62 | AMING = AMIN | 
|---|
|  | 63 | PBAR(I) = X(I) | 
|---|
|  | 64 | BESTX = X(I) | 
|---|
|  | 65 | KG = 0 | 
|---|
|  | 66 | NS = 0 | 
|---|
|  | 67 | NF = 0 | 
|---|
|  | 68 | 4 X(I) = BESTX + DIRIN(I) | 
|---|
|  | 69 | CALL MNINEX(X) | 
|---|
|  | 70 | CALL FCN(NPARX,GIN, F, U, 4, FUTIL) | 
|---|
|  | 71 | NFCN = NFCN + 1 | 
|---|
|  | 72 | IF (F .LT. AMING)  GO TO 6 | 
|---|
|  | 73 | C         failure | 
|---|
|  | 74 | IF (KG .EQ. 1)  GO TO 8 | 
|---|
|  | 75 | KG = -1 | 
|---|
|  | 76 | NF = NF + 1 | 
|---|
|  | 77 | DIRIN(I) = DIRIN(I) * (-0.4) | 
|---|
|  | 78 | IF (NF .LT. 3)  GO TO 4 | 
|---|
|  | 79 | C         stop after three failures | 
|---|
|  | 80 | BESTX = X(I) | 
|---|
|  | 81 | DIRIN(I) = DIRIN(I) * 3.0 | 
|---|
|  | 82 | AMING = F | 
|---|
|  | 83 | GO TO 8 | 
|---|
|  | 84 | C | 
|---|
|  | 85 | C         success | 
|---|
|  | 86 | 6 BESTX = X(I) | 
|---|
|  | 87 | DIRIN(I) = DIRIN(I) * 3.0 | 
|---|
|  | 88 | AMING = F | 
|---|
|  | 89 | CSTATU= 'PROGRESS  ' | 
|---|
|  | 90 | KG = 1 | 
|---|
|  | 91 | NS = NS + 1 | 
|---|
|  | 92 | IF (NS .LT. 6)  GO TO 4 | 
|---|
|  | 93 | C | 
|---|
|  | 94 | C         3 failures or 6 successes or | 
|---|
|  | 95 | C         local minimum found in ith direction | 
|---|
|  | 96 | 8 Y(I) = AMING | 
|---|
|  | 97 | IF (AMING .LT. ABSMIN)  JL = I | 
|---|
|  | 98 | IF (AMING .LT. ABSMIN)  ABSMIN = AMING | 
|---|
|  | 99 | X(I) = BESTX | 
|---|
|  | 100 | DO 9 K= 1, NPAR | 
|---|
|  | 101 | 9 P(K,I) = X(K) | 
|---|
|  | 102 | 10 CONTINUE | 
|---|
|  | 103 | JH = NPARP1 | 
|---|
|  | 104 | AMIN=Y(JL) | 
|---|
|  | 105 | CALL MNRAZZ(YNPP1,PBAR,Y,JH,JL) | 
|---|
|  | 106 | DO 20 I= 1, NPAR | 
|---|
|  | 107 | 20 X(I) = P(I,JL) | 
|---|
|  | 108 | CALL MNINEX(X) | 
|---|
|  | 109 | IF (ISW(5) .GE. 1)  CALL MNPRIN(5,AMIN) | 
|---|
|  | 110 | EDM = BIGEDM | 
|---|
|  | 111 | SIG2 = EDM | 
|---|
|  | 112 | NCYCL=0 | 
|---|
|  | 113 | C                                        . . . . .  start main loop | 
|---|
|  | 114 | 50 CONTINUE | 
|---|
|  | 115 | IF (SIG2 .LT. EPSI .AND. EDM.LT.EPSI)     GO TO 76 | 
|---|
|  | 116 | SIG2 = EDM | 
|---|
|  | 117 | IF ((NFCN-NPFN) .GT. NFCNMX)  GO TO 78 | 
|---|
|  | 118 | C         calculate new point * by reflection | 
|---|
|  | 119 | DO 60 I= 1, NPAR | 
|---|
|  | 120 | PB = 0. | 
|---|
|  | 121 | DO 59 J= 1, NPARP1 | 
|---|
|  | 122 | 59 PB = PB + WG * P(I,J) | 
|---|
|  | 123 | PBAR(I) = PB - WG * P(I,JH) | 
|---|
|  | 124 | 60 PSTAR(I)=(1.+ALPHA)*PBAR(I)-ALPHA*P(I,JH) | 
|---|
|  | 125 | CALL MNINEX(PSTAR) | 
|---|
|  | 126 | CALL FCN(NPARX,GIN,YSTAR,U,4,FUTIL) | 
|---|
|  | 127 | NFCN=NFCN+1 | 
|---|
|  | 128 | IF(YSTAR.GE.AMIN) GO TO 70 | 
|---|
|  | 129 | C         point * better than jl, calculate new point ** | 
|---|
|  | 130 | CSTATU = 'PROGRESS  ' | 
|---|
|  | 131 | DO 61 I=1,NPAR | 
|---|
|  | 132 | 61 PSTST(I)=GAMMA*PSTAR(I)+(1.-GAMMA)*PBAR(I) | 
|---|
|  | 133 | CALL MNINEX(PSTST) | 
|---|
|  | 134 | CALL FCN(NPARX,GIN,YSTST,U,4,FUTIL) | 
|---|
|  | 135 | NFCN=NFCN+1 | 
|---|
|  | 136 | C         try a parabola through ph, pstar, pstst.  min = prho | 
|---|
|  | 137 | Y1 = (YSTAR-Y(JH)) * RHO2 | 
|---|
|  | 138 | Y2 = (YSTST-Y(JH)) * RHO1 | 
|---|
|  | 139 | RHO = 0.5 * (RHO2*Y1 -RHO1*Y2) / (Y1 -Y2) | 
|---|
|  | 140 | IF (RHO .LT. RHOMIN)  GO TO 66 | 
|---|
|  | 141 | IF (RHO .GT. RHOMAX)  RHO = RHOMAX | 
|---|
|  | 142 | DO 64 I= 1, NPAR | 
|---|
|  | 143 | 64 PRHO(I) = RHO*PBAR(I) + (1.0-RHO)*P(I,JH) | 
|---|
|  | 144 | CALL MNINEX(PRHO) | 
|---|
|  | 145 | CALL FCN(NPARX,GIN,YRHO, U,4,FUTIL) | 
|---|
|  | 146 | NFCN = NFCN + 1 | 
|---|
|  | 147 | IF (YRHO .LT. AMIN)     CSTATU = 'PROGRESS  ' | 
|---|
|  | 148 | IF (YRHO .LT. Y(JL) .AND. YRHO .LT. YSTST)  GO TO 65 | 
|---|
|  | 149 | IF (YSTST .LT. Y(JL))  GO TO 67 | 
|---|
|  | 150 | IF (YRHO .GT. Y(JL))  GO TO 66 | 
|---|
|  | 151 | C         accept minimum point of parabola, PRHO | 
|---|
|  | 152 | 65 CALL MNRAZZ (YRHO,PRHO,Y,JH,JL) | 
|---|
|  | 153 | GO TO 68 | 
|---|
|  | 154 | 66 IF (YSTST .LT. Y(JL))  GO TO 67 | 
|---|
|  | 155 | CALL MNRAZZ(YSTAR,PSTAR,Y,JH,JL) | 
|---|
|  | 156 | GO TO 68 | 
|---|
|  | 157 | 67 CALL MNRAZZ(YSTST,PSTST,Y,JH,JL) | 
|---|
|  | 158 | 68 NCYCL=NCYCL+1 | 
|---|
|  | 159 | IF (ISW(5) .LT. 2)  GO TO 50 | 
|---|
|  | 160 | IF (ISW(5) .GE. 3 .OR. MOD(NCYCL, 10) .EQ. 0) CALL MNPRIN(5,AMIN) | 
|---|
|  | 161 | GO TO 50 | 
|---|
|  | 162 | C         point * is not as good as jl | 
|---|
|  | 163 | 70 IF (YSTAR .GE. Y(JH))  GO TO 73 | 
|---|
|  | 164 | JHOLD = JH | 
|---|
|  | 165 | CALL MNRAZZ(YSTAR,PSTAR,Y,JH,JL) | 
|---|
|  | 166 | IF (JHOLD .NE. JH)  GO TO 50 | 
|---|
|  | 167 | C         calculate new point ** | 
|---|
|  | 168 | 73 DO 74 I=1,NPAR | 
|---|
|  | 169 | 74 PSTST(I)=BETA*P(I,JH)+(1.-BETA)*PBAR(I) | 
|---|
|  | 170 | CALL MNINEX (PSTST) | 
|---|
|  | 171 | CALL FCN(NPARX,GIN,YSTST,U,4,FUTIL) | 
|---|
|  | 172 | NFCN=NFCN+1 | 
|---|
|  | 173 | IF(YSTST.GT.Y(JH)) GO TO 1 | 
|---|
|  | 174 | C     point ** is better than jh | 
|---|
|  | 175 | IF (YSTST .LT. AMIN)     CSTATU = 'PROGRESS  ' | 
|---|
|  | 176 | IF (YSTST .LT. AMIN)  GO TO 67 | 
|---|
|  | 177 | CALL MNRAZZ(YSTST,PSTST,Y,JH,JL) | 
|---|
|  | 178 | GO TO 50 | 
|---|
|  | 179 | C                                        . . . . . .  end main loop | 
|---|
|  | 180 | 76 IF (ISW(5) .GE. 0)  WRITE(ISYSWR,'(A)') | 
|---|
|  | 181 | +                    ' SIMPLEX MINIMIZATION HAS CONVERGED.' | 
|---|
|  | 182 | ISW(4) = 1 | 
|---|
|  | 183 | GO TO 80 | 
|---|
|  | 184 | 78 IF (ISW(5) .GE. 0)  WRITE(ISYSWR,'(A)') | 
|---|
|  | 185 | +                    ' SIMPLEX TERMINATES WITHOUT CONVERGENCE.' | 
|---|
|  | 186 | CSTATU= 'CALL LIMIT' | 
|---|
|  | 187 | ISW(4) = -1 | 
|---|
|  | 188 | ISW(1) = 1 | 
|---|
|  | 189 | 80 DO 82 I=1,NPAR | 
|---|
|  | 190 | PB = 0. | 
|---|
|  | 191 | DO 81 J=1,NPARP1 | 
|---|
|  | 192 | 81 PB = PB + WG * P(I,J) | 
|---|
|  | 193 | 82 PBAR(I) = PB - WG * P(I,JH) | 
|---|
|  | 194 | CALL MNINEX(PBAR) | 
|---|
|  | 195 | CALL FCN(NPARX,GIN,YPBAR,U,4,FUTIL) | 
|---|
|  | 196 | NFCN=NFCN+1 | 
|---|
|  | 197 | IF (YPBAR .LT. AMIN)  CALL MNRAZZ(YPBAR,PBAR,Y,JH,JL) | 
|---|
|  | 198 | CALL MNINEX(X) | 
|---|
|  | 199 | IF (NFCNMX+NPFN-NFCN .LT. 3*NPAR)  GO TO 90 | 
|---|
|  | 200 | IF (EDM .GT. 2.0*EPSI)  GO TO 1 | 
|---|
|  | 201 | 90 IF (ISW(5) .GE. 0)  CALL MNPRIN(5, AMIN) | 
|---|
|  | 202 | RETURN | 
|---|
|  | 203 | END | 
|---|