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