C***********************************************************************
C     THIS SUBROUTINE PROVIDES VALUES FOR THE LOG-LIKELIHOOD EQUATIONS
C     AND THE PARTIALS OF THE LOG-LIKELIHOOD EQUATIONS WITH RESPECT TO
C     THE PARAMETERS FOR A VARIETY OF MODELS.
C
C     SUBROUTINES CALLED: NCNI
C***********************************************************************
      SUBROUTINE UMLE (ITIME)
C***********************************************************************
C     DECLARATIONS
C***********************************************************************
      INCLUDE 'PARMTR.INC'
      DOUBLE PRECISION SUM1, SUM2, R0, R1, R2, R4, R5, R6, PRA, PRB
      DOUBLE PRECISION PRAA, PRBB, PRAB, R0SQ, EXPW, DIF1, DIF2, DIF3
      DOUBLE PRECISION PRF0A, PRF0B, SUM3
      DOUBLE PRECISION E(600), Y(600), E0, VALUE, XX
      INTEGER CNT
      LOGICAL GRP, POOL, PEST, SEST, DESC, DEF, CUTP, TRUNC
      LOGICAL WARN, HELP
C***********************************************************************
C     COMMON STATEMENTS
C***********************************************************************
      DOUBLE PRECISION PAR, VCMAT, G, XLL
      COMMON /DPAR/ PAR(MAXPR2), VCMAT(MAXPAR,MAXPAR), G(MAXPAR),
     1    XLL, NPAR, INDEX
      COMMON /OPTION/ GRP, POOL, PEST, SEST, DESC, DEF, CUTP, TRUNC,
     1 HELP
      COMMON /TSINTG/ E, Y
      COMMON /INTEG/ R0, PRF0A, PRF0B
      COMMON /MEASUR/ X(MAXOBJ), AA(MAXOBJ,4)
      COMMON /NUM/ XL(MAXLIN), WIDTH, N, CNT, CONV(3), VARN, IDF, WARN
      COMMON /KEEP/ SUM, SSQ
      COMMON /ERROR/ IER(4), LER
      LOGICAL LER
C***********************************************************************
C     DATA STATEMENTS
C***********************************************************************
      DATA PI /3.1415926536/
C***********************************************************************
C     INITIALIZE VARIABLES
C***********************************************************************
      XN=FLOAT(CNT)
      MNUM=600
C***********************************************************************
C     EXPONENTIAL POWER SERIES ESTIMATOR
C***********************************************************************
      IF (INDEX.EQ.2) THEN
C***********************************************************************
C     CALCULATE SUMS USED IN LOG-LIKELIHOOD EQUATIONS AND PARTIALS.
C***********************************************************************
      SUM1=0.0
      SUM2=0.0
      SUM3=0.0
      DO 10 I=1,CNT
      XX=(DBLE(X(I))/PAR(1))**PAR(2)
      SUM1=SUM1+XX
      XAX=0.0
      IF (X(I).NE.0.0) XAX=ALOG(X(I))
      SUM2=SUM2+XX*XAX
      SUM3=SUM3 + XX*XAX*XAX
   10 CONTINUE
      SUM2=SUM2-DLOG(MAX(1.D-200,PAR(1)))*SUM1
C***********************************************************************
C     BREAK THE DOMAIN (0,WIDTH) INTO MNUM INTERVALS AND STORE THE
C     FUNCTION (XX/PAR(1))**PAR(2) IN Y(J),J=1,MNUM AND  IN E(J) A
C     FUNCTION OF THE Y(J).
C***********************************************************************
      DELTA=WIDTH/FLOAT(MNUM)
      DO 20 J=1,MNUM
      XX=FLOAT(J)*DELTA
      XX=(XX/PAR(1))**PAR(2)
      Y(J)=XX
   20 E(J)=DEXP(MAX(-460.D0,MIN(300.D0,-XX)))
      E0=1.0
C***********************************************************************
C     CALCULATE THE NORMALIZING CONSTANT WHICH IS THE INTEGRAL OF G(X)
C     FROM 0 TO WIDTH.  THE INTEGRAL OF EXP(-Y(J)).
C***********************************************************************
      CALL NCNI (MNUM,E,E0,WIDTH,VALUE,IDIG)
      IF (IDIG.LT.6) IER(1)=-1
      R0=VALUE
C***********************************************************************
C     CALCULATE THE LOG-LIKELIHOOD VALUE.
C***********************************************************************
      XLL=-SUM1-XN*DLOG(MAX(1.D-200,R0))
      IF (ITIME.EQ.2) RETURN
C***********************************************************************
C     CALCULATE THE INTEGRAL FOR Y(J)*EXP(-Y(J))
C***********************************************************************
      DO 30 J=1,MNUM
   30 E(J)=Y(J)*E(J)
      E0=0.0
      CALL NCNI (MNUM,E,E0,WIDTH,VALUE,IDIG)
      IF (IDIG.LT.6) IER(1)=-1
      R1=VALUE
C***********************************************************************
C     CALCULATE THE INTEGRAL FOR Y(J)*Y(J)*EXP(-Y(J)).
C***********************************************************************
      DO 40 J=1,MNUM
   40 E(J)=E(J)*Y(J)
      E0=0.0
      CALL NCNI (MNUM,E,E0,WIDTH,VALUE,IDIG)
      IF (IDIG.LT.6) IER(1)=-1
      R5=VALUE
C***********************************************************************
C     CALCULATE THE INTEGRAL FOR LOG(Y(J))*Y(J)*EXP(-Y(J))/PAR(2).
C***********************************************************************
      DO 50 J=1,MNUM
   50 E(J)=E(J)*DLOG(MAX(1.D-200,Y(J)))/Y(J)
      E0=0.0
      CALL NCNI (MNUM,E,E0,WIDTH,VALUE,IDIG)
      IF (IDIG.LT.6) IER(1)=-1
      R2=VALUE/PAR(2)
C***********************************************************************
C     CALCULATE THE INTEGRAL FOR LOG(Y(J))*Y(J)*Y(J)*EXP(-Y(J))/PAR(2).
C***********************************************************************
      DO 60 J=1,MNUM
   60 E(J)=E(J)*Y(J)
      E0=0.0
      CALL NCNI (MNUM,E,E0,WIDTH,VALUE,IDIG)
      IF (IDIG.LT.6) IER(1)=-1
      R6=VALUE/PAR(2)
C***********************************************************************
C    CALCULATE THE INTEGRAL FOR LOG(Y(J))*LOG(Y(J))*Y(J)*Y(J)*EXP(-Y(J))
C     /(PAR(2)*PAR(2)).
C***********************************************************************
      DO 70 J=1,MNUM
   70 E(J)=E(J)*DLOG(MAX(1.D-200,Y(J)))
      E0=0.0
      CALL NCNI (MNUM,E,E0,WIDTH,VALUE,IDIG)
      IF (IDIG.LT.6) IER(1)=-1
      R4=VALUE/(PAR(2)*PAR(2))
C***********************************************************************
C     CALCULATE THE INTEGRAL FOR Y(J)*(LOG(Y(J))**2)*EXP(-Y(J))/
C     (PAR(2)*PAR(2)).
C***********************************************************************
      DO 75 J=1,MNUM
  75  E(J)=E(J)/Y(J)
      E0=0.0
      CALL NCNI(MNUM,E,E0,WIDTH,VALUE,IDIG)
      IF(IDIG.LT.6) IER(1)=-1
      R3=VALUE/(PAR(2)*PAR(2))
C***********************************************************************
C     CALCULATE THE LOG-LIKELIHOOD EQUATIONS AND THE PARTIALS OF THE
C     LOG-LIKELIHOOD EQUATIONS AND THE PARTIALS OF THE PARAMETERS WITH
C     RESPECT TO F(0).
C***********************************************************************
      PRA=-PAR(2)*R1/PAR(1)
      PRB=R2
      PRAA=PAR(2)*PAR(2)*R5/(PAR(1)*PAR(1))
      PRBB=R4
      PRAB=-PAR(2)*R6/PAR(1)
      R0SQ=R0*R0
      VCMAT(1,1)=XN*(PRAA*R0-PRA*PRA)/R0SQ
      VCMAT(1,2)=XN*(PRAB*R0-PRA*PRB)/R0SQ
      VCMAT(2,2)=XN*(PRBB*R0-PRB*PRB)/R0SQ
      DIF1=PAR(2)*(PAR(2)+1.)*(SUM1-XN*(R1/R0))/(PAR(1)*PAR(1))
      DIF2=SUM3-2.*DLOG(MAX(1.D-200,PAR(1)))*SUM2
     1   -(DLOG(MAX(1.D-200,PAR(1)))**2)*SUM1-XN*(R3/R0)
      DIF3=(-SUM1-PAR(2)*SUM2+XN*(R1/R0)+XN*PAR(2)*(R2/R0))/PAR(1)
      VCMAT(1,1)=VCMAT(1,1) + DIF1
      VCMAT(2,2)=VCMAT(2,2) + DIF2
      VCMAT(1,2)=VCMAT(1,2) + DIF3
      VCMAT(2,1)=VCMAT(1,2)
      G(1)=PAR(2)*SUM1/PAR(1)-XN*PAR(2)*R1/(PAR(1)*R0)
      G(2)=-SUM2+XN*R2/R0
      PRF0A=PRA
      PRF0B=PRB
C***********************************************************************
C     EXPONENTIAL POLYNOMIAL ESTIMATOR
C***********************************************************************
      ELSE IF (INDEX.EQ.3) THEN
      IF (TRUNC) THEN
C***********************************************************************
C     CALCULATE THE MORMALIZING CONSTANT FOR THE TRUNCATED SITUATION.
C***********************************************************************
         DELTA=WIDTH/FLOAT(MNUM)
         DO 100 J=1,MNUM
         XX=FLOAT(J)*DELTA
  100    E(J)=DEXP(MAX(-460.D0,MIN(300.D0,-PAR(1)*XX-PAR(2)*XX*XX)))
         E0=1.0
         CALL NCNI (MNUM,E,E0,WIDTH,VALUE,IDIG)
         IF (IDIG.LT.6) IER(1)=-1
         R0=VALUE
      ELSE
C***********************************************************************
C     CALCULATE THE NORMALIZING CONSTANT FOR THE UNTRUNCATED SITUATION.
C***********************************************************************
         RWID=PAR(1)/(2.*PAR(2))
         DELTA=RWID/FLOAT(MNUM)
         E0=1.0
         DO 120 J=1,MNUM
         XX=-PAR(1)/(2.*PAR(2))+FLOAT(J)*DELTA
  120    E(J)=DEXP(MAX(-460.D0,MIN(300.D0,
     1      -PAR(2)*(XX+PAR(1)/(2.*PAR(2)))**2)))
         CALL NCNI (MNUM,E,E0,RWID,VALUE,IDIG)
         IF (IDIG.LT.6) IER(1)=-1
         R0=DEXP(MAX(-460.D0,MIN(300.D0,
     1      PAR(1)*PAR(1)/(4.*PAR(2)))))*SQRT(PI)/DSQRT(PAR(2))
         R0=R0*(.5-VALUE*DSQRT(PAR(2))/SQRT(PI))
      ENDIF
C***********************************************************************
C     CALCULATE THE LOG-LIKELIHOOD VALUE.
C***********************************************************************
      XLL=-PAR(1)*SUM-PAR(2)*SSQ-XN*DLOG(MAX(1.D-200,R0))
      IF (ITIME.EQ.2) RETURN
C***********************************************************************
C     CALCULATE THE NECESSARY INTEGRALS WHICH HAVE BEEN DERIVED ANALYT-
C     ICALLY AFTER CALCULATING THE NORMALIZING CONSTANT NUMERICALLY.
C***********************************************************************
      EXPW=DEXP(MAX(-460.D0,MIN(300.D0,
     1    -PAR(1)*WIDTH-PAR(2)*WIDTH*WIDTH)))
      IF (.NOT.TRUNC) EXPW=0.0
      R1=(1.-EXPW-PAR(1)*R0)/(2.*PAR(2))
      R2=(-WIDTH*EXPW+R0-PAR(1)*R1)/(2.*PAR(2))
      R3=(-WIDTH*WIDTH*EXPW+2.*R1-PAR(1)*R2)/(2.*PAR(2))
      R4=(-(WIDTH**3)*EXPW+3.*R2-PAR(1)*R3)/(2.*PAR(2))
      R0SQ=R0*R0
C***********************************************************************
C     CALCULATE THE LOG-LIKELIHOOD EQUATIONS AND THEIR PARTIALS.
C***********************************************************************
      G(1)=-SUM+XN*R1/R0
      G(2)=-SSQ+XN*R2/R0
      VCMAT(1,1)=XN*(R2*R0-R1*R1)/R0SQ
      VCMAT(1,2)=XN*(R3*R0-R1*R2)/R0SQ
      VCMAT(2,1)=VCMAT(1,2)
      VCMAT(2,2)=XN*(R4*R0-R2*R2)/R0SQ
      PRF0A=-R1
      PRF0B=-R2
C***********************************************************************
C     NEGATIVE EXPONENTIAL ESTIMATOR
C***********************************************************************
      ELSE IF (INDEX.EQ.4) THEN
C***********************************************************************
C     CALCULATE THE NORMALIZING CONSTANT R0 AND THE LOG-LIKELIHOOD VALUE
C***********************************************************************
      EXPW=DEXP(MAX(-460.D0,MIN(300.D0,-PAR(1)*WIDTH)))
      R0=(1.-EXPW)/PAR(1)
      XLL=-XN*DLOG(MAX(1.D-200,R0))-PAR(1)*SUM
      IF (ITIME.EQ.2) RETURN
C***********************************************************************
C     CALCULATE THE LOG-LIKELIHOOD EQUATIONS AND THEIR PARTIALS.
C***********************************************************************
      G(1)=XN/PAR(1)-XN*WIDTH*EXPW/(1.-EXPW)-SUM
      VCMAT(1,1)=XN*(1./(PAR(1)*PAR(1))-WIDTH*WIDTH*EXPW/((1.-EXPW)**2))
      PRF0A=-(1.-EXPW-PAR(1)*WIDTH*EXPW)/(PAR(1)*PAR(1))
C***********************************************************************
C     HALF-NORMAL ESTIMATOR
C***********************************************************************
      ELSE IF (INDEX.EQ.5) THEN
C***********************************************************************
C     CALCULATE THE NOMALIZING CONSTANT
C***********************************************************************
      EXPW=DEXP(MAX(-460.D0,MIN(300.D0,-PAR(1)*WIDTH*WIDTH)))
      DELTA=WIDTH/FLOAT(MNUM)
      DO 170 J=1,MNUM
      XX=FLOAT(J)*DELTA
  170 E(J)=DEXP(MAX(-460.D0,MIN(300.D0,-PAR(1)*XX*XX)))
      E0=1.0
      CALL NCNI (MNUM,E,E0,WIDTH,VALUE,IDIG)
      IF (IDIG.LT.6) IER(1)=-1
      R0=VALUE
C***********************************************************************
C     CALCULATE THE LOG-LIKELIHOOD VALUE
C***********************************************************************
      XLL=-PAR(1)*SSQ-XN*DLOG(MAX(1.D-200,R0))
      IF (ITIME.EQ.2) RETURN
C***********************************************************************
C     CALCULATE THE LOG-LIKELIHOOD EQUATIONS AND THEIR PARTIALS.
C***********************************************************************
      R1=(R0-WIDTH*EXPW)/(2.*PAR(1))
      G(1)=XN*R1/R0-SSQ
      R2=(3.*R1-(WIDTH**3)*EXPW)/(2.*PAR(1))
      VCMAT(1,1)=XN*(R2*R0-R1*R1)/(R0*R0)
      PRF0A=R1
      ENDIF
      RETURN
      END
