-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathminuit.F
144 lines (144 loc) · 5.98 KB
/
minuit.F
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
*
* $Id: minuit.F,v 1.1.1.1 2000/06/08 11:19:18 andras Exp $
*
* $Log: minuit.F,v $
* Revision 1.1.1.1 2000/06/08 11:19:18 andras
* import of MINUIT from CERNlib 2000
*
* Revision 1.1.1.1 1996/03/07 14:31:28 mclareni
* Minuit
*
*
#include "minuit/pilot.h"
SUBROUTINE MINUIT(FCN,FUTIL)
#include "minuit/d506dp.inc"
#include "minuit/d506cm.inc"
C
C CPNAM Parameter name (10 characters)
C U External (visible to user in FCN) value of parameter
C ALIM, BLIM Lower and upper parameter limits. If both zero, no limits.
C ERP,ERN Positive and negative MINOS errors, if calculated.
C WERR External parameter error (standard deviation, defined by UP)
C GLOBCC Global Correlation Coefficient
C NVARL =-1 if parameter undefined, =0 if constant,
C = 1 if variable without limits, =4 if variable with limits
C (Note that if parameter has been fixed, NVARL=1 or =4, and NIOFEX=0)
C NIOFEX Internal parameter number, or zero if not currently variable
C NEXOFI External parameter number for currently variable parameters
C X, XT Internal parameter values (X are sometimes saved in XT)
C DIRIN (Internal) step sizes for current step
C variables with names ending in ..S are saved values for fixed params
C VHMAT (Internal) error matrix stored as Half MATrix, since
C it is symmetric
C VTHMAT VHMAT is sometimes saved in VTHMAT, especially in MNMNOT
C
C ISW definitions:
C ISW(1) =0 normally, =1 means CALL LIMIT EXCEEDED
C ISW(2) =0 means no error matrix
C =1 means only approximate error matrix
C =2 means full error matrix, but forced pos-def.
C =3 means good normal full error matrix exists
C ISW(3) =0 if Minuit is calculating the first derivatives
C =1 if first derivatives calculated inside FCN
C ISW(4) =-1 if most recent minimization did not converge.
C = 0 if problem redefined since most recent minimization.
C =+1 if most recent minimization did converge.
C ISW(5) is the PRInt level. See SHO PRIntlevel
C ISW(6) = 0 for batch mode, =1 for interactive mode
C =-1 for originally interactive temporarily batch
C
C LWARN is true if warning messges are to be put out (default=true)
C SET WARN turns it on, set NOWarn turns it off
C LREPOR is true if exceptional conditions are put out (default=false)
C SET DEBUG turns it on, SET NODebug turns it off
C LIMSET is true if a parameter is up against limits (for MINOS)
C LNOLIM is true if there are no limits on any parameters (not yet used)
C LNEWMN is true if the previous process has unexpectedly improved FCN
C LPHEAD is true if a heading should be put out for the next parameter
C definition, false if a parameter has just been defined
C
EXTERNAL FCN,FUTIL
CHARACTER*40 CWHYXT
DATA CWHYXT/'FOR UNKNOWN REASONS '/
DATA JSYSRD,JSYSWR,JSYSSA/5,6,7/
C . . . . . . . . . . initialize minuit
WRITE (JSYSWR,'(1X,75(1H*))')
CALL MNINIT (JSYSRD,JSYSWR,JSYSSA)
C . . . . initialize new data block
100 CONTINUE
WRITE (ISYSWR,'(1X,75(1H*))')
NBLOCK = NBLOCK + 1
WRITE (ISYSWR,'(26X,A,I4)') 'MINUIT DATA BLOCK NO.',NBLOCK
WRITE (ISYSWR,'(1X,75(1H*))')
C . . . . . . . . . . . set parameter lists to undefined
CALL MNCLER
C . . . . . . . . read title
CALL MNREAD(FCN,1,IFLGUT,FUTIL)
IF (IFLGUT .EQ. 2) GO TO 500
IF (IFLGUT .EQ. 3) GO TO 600
C . . . . . . . . read parameters
CALL MNREAD(FCN,2,IFLGUT,FUTIL)
IF (IFLGUT .EQ. 2) GO TO 500
IF (IFLGUT .EQ. 3) GO TO 600
IF (IFLGUT .EQ. 4) GO TO 700
C . . . . . . verify FCN not time-dependent
WRITE (ISYSWR,'(/A,A)') ' MINUIT: FIRST CALL TO USER FUNCTION,',
+ ' WITH IFLAG=1'
NPARX = NPAR
CALL MNINEX(X)
FZERO = UNDEFI
CALL FCN(NPARX,GIN,FZERO,U,1,FUTIL)
FIRST = UNDEFI
CALL FCN(NPARX,GIN,FIRST,U,4,FUTIL)
NFCN = 2
IF (FZERO.EQ.UNDEFI .AND. FIRST.EQ.UNDEFI) THEN
CWHYXT = 'BY ERROR IN USER FUNCTION. '
WRITE (ISYSWR,'(/A,A/)') ' USER HAS NOT CALCULATED FUNCTION',
+ ' VALUE WHEN IFLAG=1 OR 4'
GO TO 800
ENDIF
AMIN = FIRST
IF (FIRST .EQ. UNDEFI) AMIN=FZERO
CALL MNPRIN(1,AMIN)
NFCN = 2
IF (FIRST .EQ. FZERO) GO TO 300
FNEW = 0.0
CALL FCN(NPARX,GIN,FNEW,U,4,FUTIL)
IF (FNEW .NE. AMIN) WRITE (ISYSWR,280) AMIN, FNEW
280 FORMAT (/' MINUIT WARNING: PROBABLE ERROR IN USER FUNCTION.'/
+ ' FOR FIXED VALUES OF PARAMETERS, FCN IS TIME-DEPENDENT'/
+ ' F =',E22.14,' FOR FIRST CALL'/
+ ' F =',E22.14,' FOR SECOND CALL.'/)
NFCN = 3
300 FVAL3 = 2.0*AMIN+1.0
C . . . . . . . . . . . read commands
CALL MNREAD(FCN,3,IFLGUT,FUTIL)
IF (IFLGUT .EQ. 2) GO TO 500
IF (IFLGUT .EQ. 3) GO TO 600
IF (IFLGUT .EQ. 4) GO TO 700
CWHYXT = 'BY MINUIT COMMAND: '//CWORD
IF (INDEX(CWORD,'STOP').GT. 0) GO TO 800
IF (INDEX(CWORD,'EXI') .GT. 0) GO TO 800
IF (INDEX(CWORD,'RET') .EQ. 0) GO TO 100
CWHYXT = 'AND RETURNS TO USER PROGRAM. '
WRITE (ISYSWR,'(A,A)') ' ..........MINUIT TERMINATED ',CWHYXT
RETURN
C . . . . . . stop conditions
500 CONTINUE
CWHYXT = 'BY END-OF-DATA ON PRIMARY INPUT FILE. '
GO TO 800
600 CONTINUE
CWHYXT = 'BY UNRECOVERABLE READ ERROR ON INPUT. '
GO TO 800
700 CONTINUE
CWHYXT = ': FATAL ERROR IN PARAMETER DEFINITIONS. '
800 WRITE (ISYSWR,'(A,A)') ' ..........MINUIT TERMINATED ',CWHYXT
STOP
C
C ......................entry to set unit numbers - - - - - - - - - -
ENTRY MINTIO(I1,I2,I3)
JSYSRD = I1
JSYSWR = I2
JSYSSA = I3
RETURN
END