home *** CD-ROM | disk | FTP | other *** search
Text File | 1986-07-23 | 53.5 KB | 1,819 lines |
- C ALGORITHM 615, COLLECTED ALGORITHMS FROM ACM.
- C ALGORITHM APPEARED IN ACM-TRANS. MATH. SOFTWARE, VOL.10, NO. 2,
- C JUN., 1984, P. 202-206.
- C PROGRAM SUBL1 (INPUT,OUTPUT,TAPE5=INPUT,TAPE6=OUTPUT)
- C****************************************************************
- C *THIS CODE SOLVES THE L1 BEST SUBSET PROBLEM*
- C *SUBMITTED TO ACM TRANS.SPRING 1982*
- C *LAST REVISED MAR. 12, 1984*
- C****************************************************************
- DIMENSION X(300,20), Y(300)
- DIMENSION ZL(20), BVAL(210), IDEX(210), ISTAT(20)
- C
- COMMON /BLOCK/
- - ACU,BIG,BSAVE(210),LU(20,20),PIE(210),SAD,SADT,SAVTOT(210),
- -SIG(6000),SIGMA(300),ZLOW,ZSAVE(20),IBASE(20),IK,IK1,INCOL(20),
- -INDEX(20),INPROB(210),IPAR(20),LABEL(210),LEVEL,DIRECT,INTL
- C
- INTEGER I,IBASE,IDEX,IFAULT,IK,IK1,IMT,INCOL,INDEX,INPROB,IPAR
- INTEGER ISTAT,ITER,J,JMIN,K,L,LABEL,LEVEL,M,MININ,MMAX
- INTEGER N,NAME,NMAX,NPROB
- C
- DOUBLE PRECISION ACU,BIG,BSAVE,BVAL,LU,PIE,POPT,SAD,SADT,SAVTOT
- C++ REAL ACU,BIG,BSAVE,BVAL,LU,PIE,POPT,SAD,SADT,SAVTOT
- DOUBLE PRECISION SIG,SIGMA,X,Y,ZL,ZLOW,ZSAVE
- C++ REAL SIG,SIGMA,X,Y,ZL,ZLOW,ZSAVE
- C
- C
- LOGICAL DIRECT,INTL
- INTEGER UNITGO,UNITIN
- C
- C-----UNITIN IS THE INPUT UNIT NUMBER
- C-----UNITGO IS THE OUTPUT UNIT NUMBER
- C
- DIMENSION IMT(72), NAME(40)
- C
- C-----IMT IS USED TO STORE THE INPUT FORMAT
- C-----NAME SAVES THE PROBLEM NAME
- C
- UNITIN=5
- UNITGO=6
- NMAX=300
- MMAX=30
- NPROB=0
- C
- C-----K STORES THE NUMBER OF PARAMETERS IN THE FULL MODEL
- C
- 10 READ (UNITIN,50,END=45) K,NAME
- WRITE(UNITGO,50)K,NAME
- IF (K.EQ.0) STOP
- WRITE (UNITGO,60) NAME
- C
- C-----N STORES THE NUMBER OF OBSERVATIONS
- C-----MININ STORES THE MINIMUM NUMBER OF PARAMETERS CONSIDERED
- C-----POPT DEVIATION FROM OPTIMALITY ALLOWED
- C
- READ (UNITIN,130) N,MININ,POPT
- 51 FORMAT (4X,22HNUMBER OF OBSERVATION=,I5/4X,21HNUMBER OF PARAMETERS
- 1=,I5/4X,40HMINIMUM NUMBER OF PARAMETERS CONSIDERED=,I5/4X,45HPERCE
- 2NTAGE DEVIATION FROM OPTIMALITY ALLOWED=,F6.2/8X,2H**,
- 3 23HBEST SUBSET LAV PROGRAM)
- WRITE (UNITGO,51) N,K,MININ,POPT
- READ (UNITIN,150) IMT
- DO 20 I=1,N
- READ (UNITIN,IMT) Y(I), (X(I,J),J=1,K)
- C
- C WRITE (UNITGO,IMT) Y(I), (X(I,J),J=1,K)
- C
- 20 CONTINUE
- C
- READ (UNITIN,70) (ISTAT(I),I=1,K)
- C
- ITER=0
- C
- C******CALL THE ROUTINE TO FIND THE BEST SUBSETS
- C
- C
- CALL KBEST (X,Y,K,N,ITER,IFAULT,POPT,MININ,NMAX,MMAX,BVAL,IDEX,
- 1ISTAT,ZL)
- C
- WRITE (UNITGO,80) IFAULT
- C
- C WRITE THE FINAL BEST SUBSET SOLUTION
- C
- J=K*(K+1)/2
- JMIN=(MININ-1)*(MININ)/2
- J=J-JMIN
- DO 40 I=MININ,K
- WRITE (UNITGO,110) I
- WRITE (UNITGO,100) ZL(I)
- DO 30 L=1,I
- WRITE (UNITGO,90) IDEX(J),BVAL(J)
- J=J-1
- 30 CONTINUE
- 40 CONTINUE
- C
- NPROB=NPROB+1
- WRITE (UNITGO,160)ITER
- GO TO 10
- C
- 45 STOP
- C
- 50 FORMAT (I5,3X,40A1)
- 60 FORMAT (3X,5H ,14HPROBLEM TITLE ,2X,40A1)
- 70 FORMAT (10I2)
- 80 FORMAT (8H IFAULT=,I3)
- 90 FORMAT (3X/6H BETA(,I3,1H),F15.3)
- 100 FORMAT (4X,14(1H*),23HSUM OF ABSOLUTE VALUES=,F15.3)
- 110 FORMAT (//3X,36HBEST RESULTS FOR LAV SUBSET OF SIZE=,I3)
- 130 FORMAT (I5,I2,F6.2)
- 150 FORMAT (72A1)
- 160 FORMAT (//5X,16HITERATION COUNT=,I7)
- C
- END
- SUBROUTINE KBEST (X,Y,M,N,ITER,IFAULT,POPT,MININ,NMAX,MMAX,BVAL
- 1,IDEX,ISTAT,ZL)
- C
- C***********************************************************************
- C
- C
- C THE PURPOSE OF THIS PROGRAM IS TO DETERMINE THE BEST SUBSET OF
- C PARAMETERS TO FIT A LINEAR REGRESSION UNDER AN LEAST ABSOLUTE
- C VALUE CRITERION. THIS PROGRAM UTILIZES THE SIMPLEX METHOD OF
- C LINEAR PROGRAMMING WITHIN A BRANCH-AND-BOUND ALGORITHM TO
- C SOLVE THE BEST SUBSET PROBLEM.
- C
- C
- C THE ALGORITHM IS BASED ON THE PUBLICATION:
- C ARMSTRONG,R.D. AND M.T. KUNG "AN ALGORITHM TO SELECT THE BEST
- C SUBSET FOR A LEAST ABSOLUTE VALUE REGRESSION PROBLEM,"
- C OPTIMIZATION IN STATISTICS, TIMS STUDIES OF THE MANAGEMENT
- C SCIENCES.
- C
- C FORMAL PARAMETERS
- C
- C X REAL ARRAY INPUT: VALUES OF INDEPENDENT VARIABLES
- C (NMAX,MMAX) SUCH THAT EACH ROW CORREPSONDS TO
- C AN OBSERVATION
- C
- C Y REAL ARRAY INPUT: VALUES OF THE DEPENDENT VARIABLES
- C (NMAX)
- C
- C M INTEGER INPUT: NUMBER OF DEPENDENT VARIABLES
- C
- C N INTEGER INPUT: NUMBER OF OBSERVATIONS
- C
- C ITER INTEGER OUTPUT: NUMBER OF ITERATIONS
- C
- C IFAULT INTEGER OUTPUT: FAILURE INDICATOR
- C =0 NORMAL TERMINATION
- C =1 OBSERVATION MATRIX DOES NOT HAVE
- C FULL ROW RANK (RANK M)
- C =2 PROBLEM SIZE OUT OF RANGE
- C =3 NO PIVOT ELEMENT FOUND IMPLYING
- C NEAR SINGULAR BASIS
- C
- C POPT REAL INPUT: PERCENTAGE DEVIATION FROM
- C OPTIMALITY ALLOWED
- C
- C MININ INTEGER INPUT: MINIMUM NUMBER OF PARAMETERS IN THE
- C MODEL. BEST SUBSET OF SIZE MININ T
- C M IS OBTAINED.
- C
- C NMAX INTEGER INPUT: DIMENSION OF ROWS IN X (ALSO Y)
- C
- C MMAX INTEGER INPUT: DIMENSION OF COLUMNS IN X
- C
- C BVAL REAL ARRAY OUTPUT: ARRAY OF OPTIMAL BETA VALUES FOR
- C EACH SUBSET. THE BETA VALUES FOR
- C THE SUBSET OF SIZE M ARE STORED
- C IN POSITIONS BVAL(1),BVAL(2),...,
- C BVAL(M), FOR THE SUBSET OF SIZE
- C M-1 THE VALUES ARE STORED IN
- C POSITIONS BVAL(M+1),BVAL(M+2),...,
- C BVAL(2M-1). IN GENERAL, THE BETA
- C VALUES FOR THE OPTIMAL SUBSET OF
- C SIZE K ARE STORED IN POSITIONS
- C BVAL(L),...,BVAL(L-K+1) WHERE
- C L=(M*(M+1)-K*(K+1))/2 + 1
- C
- C IDEX INTEGER ARRAY OUTPUT: BETA INDEX SET FOR THE OPTIMAL
- C (((MMAX+1)*MMAX)/2) SUBSET. THIS ARRAY IS A PARALLEL
- C ARRAY FOR BVAL; I.E., IF BVAL(J)=2.
- C AND IDEX(J)=7 THEN BETA(7)=2.7 IN
- C THE ASSOCIATED OPTIMAL SUBSET.
- C
- C ISTAT INTEGER ARRAY INPUT: PARAMETER STATUS ARRAY.
- C (MMAX)
- C
- C 1 IF BETA(J) IS REQUIRED
- C IN EVERY MODEL
- C ISTAT(J)=
- C
- C 0 OTHERWISE
- C
- C ZL REAL ARRAY OUTPUT: BEST OBJECTIVE VALUE FOR EACH SUBSE
- C (MMAX)
- C ZL(J) GIVES THE BEST OBJECTIVE VALU
- C FOR THE SUBSET WITH M-J+1 PARAMETER
- C***********************************************************************
- C
- C IMPLEMENTATION NOTES:
- C
- C 1. THE ROUTINE USES TWO MACHINE DEPENDENT VALUES ACU AND BIG.
- C (THESE ARE SET AT THE BEGINNING OF THIS SUBROUTINE)
- C A) ACU IS USED TO TEST FOR "ZERO". ACU SHOULD BE SET TO
- C APPROXIMATELY 100 * THE RELATIVE MACHINE ACCURACY OF THE
- C SYSTEM IN USE.
- C B) BIG IS USED TO INITIALIZE THE ARRAY ZL (DESCRIBED ABOVE).
- C BIG SHOULD BE SET TO THE LARGEST FLOATING POINT VALUE
- C ASSIGNABLE.
- C
- C 2. BOTH SINGLE AND DOUBLE PRECISION VERSIONS ARE SUPPLIED. THIS
- C VERSION IS IN DOUBLE PRECISION. TO GET A SINGLE PRECISION CO
- C ALL STATEMENTS HAVING A "C++" IN COLUMNS 1-3 SHOULD BE MODIF
- C BY DELETING THE "C++". THE CORRESPONDING DOUBLE PRECISION
- C STATEMENTS SHOULD BE EITHER DELETED OR COMMENTED OUT.
- C
- C 3. ARRAY DIMENSIONS
- C THE CODE IS CURRENTLY DIMENSIONED TO SOLVE PROBLEMS WITH UP
- C 20 PARAMETERS AND 300 OBSERVATIONS. THE DIMENSION SIZES ARE
- C DETERMINED AS FOLLOWS
- C 20 MMAX
- C 300 NMAX
- C 210 (NMAX+1)*MMAX/2
- C 6000 NMAX*MMAX
- C 10 MAXIMUM VALUE OF IK .
- C
- C IF THE DIMENSION SIZES ARE CHANGED THE COMMON AND DIMENSION
- C STATEMENTS WILL NEED TO BE MODIFIED IN EACH SUBROUTINE.
- C
- C
- C***********************************************************************
- C
- C SUBROUTINES:
- C
- C CALBET - BACK-SOLVES A SYSYTEM OF EQUATIONS
- C
- C CALCPI - FORWARD-SOLVES A SYSYTEM OF EQUATIONS
- C
- C KBEST - THE DRIVER
- C
- C L1NORM - SOLVES THE INITIAL REGRESSION PROBLEM WITH ALL
- C PARAMETERS INCLUDED IN THE MODEL
- C
- C PHASE2 - SOLVES THE CURRENT REGRESSION PROBLEM WITH A PRIMAL
- C ALGORITHM
- C
- C SETUP - DETERMINES THE FORM OF THE CURRENT PROBLEM BY
- C CHOOSING THE PARAMETER TO LEAVE BASED ON A PENALTY
- C
- C UPDATE - UPDATES LU DECOMPOSITION MATRIX
- C
- C
- C***********************************************************************
- C
- C
- C DESCRIPTION OF VARIABLES:
- C
- C IK:LENGTH OF CANDIDATE LIST
- C BETA:ESTIMATES TO THE CURRENT SUBPROBLEM
- C SAD:THE MINIMUM TOTAL ABSOLUTE DEVIATION
- C IBASE:THE INDEX ARRAY OF COLUMNS OF THE BASIS
- C
- C N,M,NMAX,MMAX,X,Y, ARE NOT CHANGED IN THE SUBROUTINE;
- C SAD IS UPDATED AT EACH ITERATION
- C
- C LU:THE LU DECOMPOSITION OF THE CURRENT BASIS
- C INDEX:THE INDEX ARRAY OF ROWS OF LU
- C TOT:THE CURRENT RHS OF THE DUAL PROBLEM
- C SIGMA:INDICATOR ARRAY TO SPECIFY WHETHER A NONBASIC DUAL VARIABLE
- C IS AT UPPER OR LOWER BOUND(+1 IMPLIES UPPER;-1 IMPLIES
- C LOWER)
- C INEXT:A LOCAL ARRAY FOR THE SORT ROUTINE
- C RHS: A LOCAL ARRAY FOR THE CALBET ROUTINE
- C
- C IPAR(I)=-K IF THE K-TH PARAMETER (BETA) IS OUT OF MODEL AT LEVEL I
- C = K IF THE K-TH PARAMETER IS IN
- C
- C LABEL(I) SAVES THE INDICES OF THE BASIC OBSERVATIONS IN THE
- C PREDECESSOR PATH
- C ZSAVE(I) SAVES THE OBJECTIVE VALUES ON THE PREDECESSOR PATH
- C
- C**********************************************************************
- C
- DIMENSION X(300,20), Y(300), ZL(20), BVAL(210), IDEX(210), ISTAT(2
- 10)
- C
- DIMENSION BETA(20), TOT(20), PI(20), REPP(20)
- C
- COMMON /BLOCK/
- - ACU,BIG,BSAVE(210),LU(20,20),PIE(210),SAD,SADT,SAVTOT(210),
- -SIG(6000),SIGMA(300),ZLOW,ZSAVE(20),IBASE(20),IK,IK1,INCOL(20),
- -INDEX(20),INPROB(210),IPAR(20),LABEL(210),LEVEL,DIRECT,INTL
- C
- INTEGER I,IBASE,IDEX,IFAULT,IK,IK1,INCOL,INDEX,INPROB,IPAR
- INTEGER ISTAT,ITER,J,JINM,K2,K3,KKK1,L,LABEL,LEVEL,M,MININ
- INTEGER MMAX,N,NFREE,NMAX,NUMIN
- C
- DOUBLE PRECISION ACU,BETA,BIG,BSAVE,BVAL,LU,PI,PIE,POPT,POPT1
- C++ REAL ACU,BETA,BIG,BSAVE,BVAL,LU,PI,PIE,POPT,POPT1
- DOUBLE PRECISION REPP,SAD,SADT,SAVTOT,SIG,SIGMA,TOT,X,Y
- C++ REAL REPP,SAD,SADT,SAVTOT,SIG,SIGMA,TOT,X,Y
- DOUBLE PRECISION ZERO,ZL,ZLOW,ZSAVE
- C++ REAL ZERO,ZL,ZLOW,ZSAVE
- C
- LOGICAL DIRECT,INTL
- C
- DATA ZERO/0.0D0/
- C++ DATA ZERO/0.0E0/
- C
- C ASSIGN VALUES TO MACHINE DEPENDENT CONSTANTS
- C SEE - FOX, P.A., A.D. HALL AND N.L. SCHRYER, "FRAMEWORK FOR
- C A PORTABLE LIBRARY: ALGORITHM 528," ACM TRANSACTIONS
- C ON MATHEMATICAL SOFTWARE, VOL 4, NO 2, JUNE 1978.
- C
- ACU = D1MACH(1)
- ACU = 1000.*ACU
- BIG = D1MACH(2)
- C++ ACU = R1MACH(1)
- C++ ACU = 100.*ACU
- C++ BIG = R1MACH(2)
- C
- C
- IFAULT=0
- IK=5
- IK1=IK-1
- POPT1=(100.-POPT)/100.
- C
- C TEST PROBLEM SIZE
- C
- IF (N.LE.NMAX.AND.M.LE.MMAX) GO TO 10
- IFAULT=2
- RETURN
- 10 CONTINUE
- DO 20 I=1,M
- INDEX(I)=I
- TOT(I)=ZERO
- 20 INCOL(I)=I
- CALL L1NORM (X,Y,N,M,IFAULT,ITER,BETA,PI,TOT)
- IF (IFAULT.GT.0) RETURN
- C
- C INITIALIZATION
- C
- C SAVE THE INITIAL SOLUTION
- C
- JINM=0
- DO 30 I=1,M
- BSAVE(I)=BETA(I)
- BVAL(I)=BETA(I)
- PIE(I)=PI(I)
- LABEL(I)=IBASE(I)
- IDEX(I)=I
- INPROB(I)=I
- SAVTOT(I)=TOT(I)
- ZL(I)=BIG
- JINM=JINM+ISTAT(I)
- 30 CONTINUE
- DO 40 I=1,N
- SIG(I)=SIGMA(I)
- 40 CONTINUE
- C
- LEVEL=0
- DIRECT=.TRUE.
- C
- IF (JINM.GT.MININ) MININ=JINM
- C
- C INITIALIZE NUMBER OF FREE PARAMETERS IN MODEL
- C
- NFREE=M-JINM
- C
- ZL(M)=SAD
- ZSAVE(M)=SAD
- C
- IF (MININ.EQ.M) RETURN
- C
- C NUMIN GIVES THE NUMBER OF PARAMETERS IN THE MODEL
- C
- NUMIN=M
- C
- C START THE MAIN LOOP
- C
- 50 NUMIN=NUMIN-1
- LEVEL=LEVEL+1
- IF (NUMIN.LT.MININ.OR.NFREE.EQ.0) GO TO 120
- K2=(M*(M+1)-(NUMIN+1)*(NUMIN+2))/2
- KKK1=NUMIN+1
- ZLOW=ZL(NUMIN)*POPT1
- IF (DIRECT) GO TO 80
- DO 60 I=1,KKK1
- J=K2+I
- INDEX(I)=I
- IBASE(I)=LABEL(J)
- INCOL(I)=INPROB(J)
- PI(I)=PIE(J)
- BETA(I)=BSAVE(J)
- TOT(I)=SAVTOT(J)
- 60 CONTINUE
- C
- C LOAD IN THE BOUNDS FROM THE IMMEDIATE PREDECESSOR
- C
- K3=(M-KKK1)*N
- DO 70 I=1,N
- K3=K3+1
- SIGMA(I)=SIG(K3)
- 70 CONTINUE
- SAD=ZSAVE(KKK1)
- C
- C SET UP A NEW PROBLEM
- C
- 80 CALL SETUP (X,KKK1,IFAULT,ISTAT,BETA,TOT,PI,REPP)
- IF (IFAULT.GT.0) RETURN
- NFREE=NFREE-1
- C
- C CALL PRIMAL L.P. CODE
- C
- CALL PHASE2 (X,Y,NUMIN,N,ITER,IFAULT,BETA,TOT,PI,REPP)
- C
- C SAVE THE SOLUTION DATA FOR LATER RECALL
- C
- K2=K2+KKK1+1
- J=K2
- DO 90 I=1,NUMIN
- L=K2+I
- PIE(L)=PI(I)
- LABEL(L)=IBASE(I)
- BSAVE(L)=BETA(I)
- INPROB(L)=INCOL(I)
- SAVTOT(L)=TOT(I)
- 90 CONTINUE
- C
- C SAVE THE OBJECTIVE VALUE
- C
- ZSAVE(NUMIN)=SAD
- C
- C SAVE THE NONBASIC BOUNDS
- C
- K3=(M-NUMIN)*N
- DO 100 I=1,N
- K3=K3+1
- SIG(K3)=SIGMA(I)
- 100 CONTINUE
- C
- DIRECT=.TRUE.
- C
- C CHECK FOR A BETTER SOLUTION
- C
- IF (SADT.GE.ZLOW) GO TO 50
- C
- C SAVE THE BETTER SOLUTION
- C
- ZL(NUMIN)=SAD
- K2=J
- DO 110 I=1,NUMIN
- L=K2+I
- IDEX(L)=INCOL(I)
- BVAL(L)=BETA(I)
- 110 CONTINUE
- C
- C GO TO TOP OF LOOP
- C
- GO TO 50
- 120 NUMIN=NUMIN+1
- C
- DIRECT=.FALSE.
- C
- C MUST WORK BACK UP THE TREE
- C
- LEVEL=LEVEL-1
- 130 IF (IPAR(LEVEL).GT.0) GO TO 140
- IPAR(LEVEL)=-IPAR(LEVEL)
- J=IPAR(LEVEL)
- ISTAT(J)=1
- NUMIN=NUMIN+1
- GO TO 50
- 140 J=IPAR(LEVEL)
- ISTAT(J)=0
- NFREE=NFREE+1
- LEVEL=LEVEL-1
- IF (LEVEL.GT.0) GO TO 130
- RETURN
- C
- END
- SUBROUTINE SETUP (X,M,IFAULT,ISTAT,BETA,TOT,PI,REPP)
- C
- C THIS SUBROUTINE DETERMINES THE FORM OF THE CURRENT SUBPROBLEM
- C
- DIMENSION X(300,20), ISTAT(20), RHS(20), BETA(20), TOT(20), PI(20)
- 1, REPP(20)
- C
- COMMON /BLOCK/
- - ACU,BIG,BSAVE(210),LU(20,20),PIE(210),SAD,SADT,SAVTOT(210),
- -SIG(6000),SIGMA(300),ZLOW,ZSAVE(20),IBASE(20),IK,IK1,INCOL(20),
- -INDEX(20),INPROB(210),IPAR(20),LABEL(210),LEVEL,DIRECT,INTL
- C
- INTEGER I,IBASE,IFAULT,IFIXI,II,IK,IK1,INCOL,INDEX,INPROB
- INTEGER IOUT,IPAR,ISAVE,ISTAT,KKK,L,LABEL,LEAVE,LEVEL,LL,M
- C
- DOUBLE PRECISION ACU,BESIDE,BETA,BIG,BSAVE,LU,ONE,PENALT,PI,PIE
- C++ REAL ACU,BESIDE,BETA,BIG,BSAVE,LU,ONE,PENALT,PI,PIE
- DOUBLE PRECISION RATIO,REPP,RHO,RHS,SAD,SADT,SAVTOT,SIDE,SIG
- C++ REAL RATIO,REPP,RHO,RHS,SAD,SADT,SAVTOT,SIDE,SIG
- DOUBLE PRECISION SIGMA,SREPP,TEST,TOT,X,ZERO,ZLOW,ZSAVE
- C++ REAL SIGMA,SREPP,TEST,TOT,X,ZERO,ZLOW,ZSAVE
- C
- LOGICAL DIRECT,INTL
- C
- DATA ONE/1.0D0/,ZERO/0.0D0/
- C++ DATA ONE/1.0E0/,ZERO/0.0E0/
- C
- C IF THE IMMEDIATE PREDECESSOR IS IN MEMORY GO ON
- C
- IF (DIRECT) GO TO 10
- C
- C RECONSTRUCT THE LU DECOMPOSITION
- C
- KKK=1
- CALL UPDATE (KKK,IFAULT,X,1,M)
- IF (IFAULT.GT.0) RETURN
- C
- C RECALCULATE THE BASIC PI VALUES
- C
- KKK=0
- C
- CALL CALCPI (KKK,PI,TOT,M)
- C
- C DETERMINE PARAMETER TO LEAVE BASED ON PENALTY
- C
- 10 PENALT=BIG
- KKK=0
- DO 20 L=1,M
- RHS(L)=ZERO
- 20 CONTINUE
- C
- DO 40 I=1,M
- II=INDEX(I)
- LL=INCOL(II)
- IF (ISTAT(LL).EQ.1) GO TO 40
- C++ RHO=SIGN(1.,BETA(II))
- RHO=DSIGN(1.D0,BETA(II))
- RHS(II)=ONE
- KKK=I-1
- CALL CALCPI (KKK,REPP,RHS,M)
- RHS(II)=ZERO
- TEST=BIG
- DO 30 L=1,M
- C++ IF ( ABS(REPP(L)).LE.ACU) GO TO 30
- IF (DABS(REPP(L)).LE.ACU) GO TO 30
- C++ SREPP=SIGN(1.,REPP(L))
- SREPP=DSIGN(1.D0,REPP(L))
- C++ RATIO=ABS((1.-RHO*SREPP*PI(L))/REPP(L))
- RATIO=DABS((1.-RHO*SREPP*PI(L))/REPP(L))
- IF (RATIO.GE.TEST) GO TO 30
- SIDE=RHO*SREPP
- TEST=RATIO
- IOUT=L
- 30 CONTINUE
- C
- C SEE IF THE PENALTY IS LESS
- C
- C++ IF (TEST*ABS(BETA(II)).GE.PENALT) GO TO 40
- IF (TEST*DABS(BETA(II)).GE.PENALT) GO TO 40
- LEAVE=IOUT
- IFIXI=II
- BESIDE=SIDE
- C++ PENALT=TEST*ABS(BETA(II))
- PENALT=TEST*DABS(BETA(II))
- 40 CONTINUE
- C
- C UPDATE THE OBJECTIVE VALUE
- C
- SAD=SAD+PENALT
- C
- C PARAMETER INCOL(IFIXI) WILL LEAVE THE MODEL
- C PI(IBASE(LEAVE)) WILL LEAVE THE BASIS AND GO TO BOUND
- C
- C SWITCH UNWANTED PARAMETER AND PI TO THE END OF LIST
- C
- ISAVE=INCOL(IFIXI)
- INCOL(IFIXI)=INCOL(M)
- INCOL(M)=ISAVE
- TOT(IFIXI)=TOT(M)
- C
- C LABEL THIS NODE AND FLAG THE OUTGOING PARAMETER
- C
- IPAR(LEVEL)=-ISAVE
- ISTAT(ISAVE)=-1
- C
- ISAVE=IBASE(LEAVE)
- IBASE(LEAVE)=IBASE(M)
- IBASE(M)=ISAVE
- C
- C PLACE THE OUTGOING PI AT THE CORRECT BOUND
- C
- SIGMA(ISAVE)=BESIDE
- C
- C FORM A NEW BASIS
- C
- M=M-1
- C
- DO 50 I=1,M
- 50 INDEX(I)=I
- C
- KKK=1
- CALL UPDATE (KKK,IFAULT,X,1,M)
- IF (IFAULT.GT.0) RETURN
- C
- C UPDATE THE TOT ARRAY
- C
- DO 60 I=1,M
- LL=INCOL(I)
- TOT(I)=TOT(I)-BESIDE*X(ISAVE,LL)
- 60 CONTINUE
- C
- RETURN
- C
- END
- SUBROUTINE PHASE2 (X,Y,M,N,ITER,IFAULT,BETA,TOT,PI,REPP)
- C
- C SOLVES LP WITH PRIMAL ALGORITHM
- C
- DIMENSION X(300,20), Y(300), BETA(20), TOT(20), PI(20), REPP(20),
- 1RHS(20),Z(10),KAN(10)
- C
- COMMON /BLOCK/
- - ACU,BIG,BSAVE(210),LU(20,20),PIE(210),SAD,SADT,SAVTOT(210),
- -SIG(6000),SIGMA(300),ZLOW,ZSAVE(20),IBASE(20),IK,IK1,INCOL(20),
- -INDEX(20),INPROB(210),IPAR(20),LABEL(210),LEVEL,DIRECT,INTL
- C
- INTEGER I,IBASE,IFAULT,IIN,IK,IK1,INCOL,INDEX,INPROB,IOUT,IPAR
- INTEGER ITER,J,K,KAN,KKK,KROW,L,LABEL,LEVEL,LL,M,N
- C
- DOUBLE PRECISION ACU,BEST,BETA,BIG,BSAVE,LU,ONE,PI,PIE,RATIO,REPP
- C++ REAL ACU,BEST,BETA,BIG,BSAVE,LU,ONE,PI,PIE,RATIO,REPP
- DOUBLE PRECISION RHO,RHS,SAD,SADT,SAVTOT,SIG,SIGMA,SREPP,TEST
- C++ REAL RHO,RHS,SAD,SADT,SAVTOT,SIG,SIGMA,SREPP,TEST
- DOUBLE PRECISION TOT,X,XTWO,Y,Z,ZERO,ZC,ZLOW,ZSAVE,ZZ
- C++ REAL TOT,X,XTWO,Y,Z,ZERO,ZC,ZLOW,ZSAVE,ZZ
- C
- LOGICAL DIRECT,INTL
- C
- DATA ZERO/0.0D0/,ONE/1.0D0/
- C++ DATA ZERO/0.0E0/,ONE/1.0E0/
- C
- C Z(I) STORES THE REDUCED COST VALUES ON THE LIST
- C KAN(I) STORES THE ROW NUMBER ON THE LIST
- C IK IS THE LENGTH OF THE LIST
- C
- C CALCULATE THE SIMPLEX MULTIPLIERS
- C
- DO 10 I=1,M
- K=IBASE(I)
- 10 PI(I)=Y(K)
- KKK=0
- CALL CALBET (KKK,BETA,PI,M)
- C
- C RECALCULATE THE BASIC PI VALUES
- C
- KKK=0
- CALL CALCPI (KKK,PI,TOT,M)
- C
- C STORE THE OBJECTIVE VALUE USED FOR TERMINATION CHECK
- C
- SADT=SAD
- IF (SAD.GE.ZLOW) RETURN
- C
- C GENERATE THE CANDIDATE LIST
- C
- 20 DO 30 I=1,IK
- Z(I)=ACU
- 30 CONTINUE
- C
- C CALCULATE THE REDUCED COSTS
- C
- DO 70 J=1,N
- IF (SIGMA(J).EQ.ZERO) GO TO 70
- ZC=ZERO
- DO 40 I=1,M
- LL=INCOL(I)
- 40 ZC=ZC+BETA(I)*X(J,LL)
- ZZ=(ZC-Y(J))*SIGMA(J)
- IF (ZZ.LE.Z(IK)) GO TO 70
- C
- C RANK THE VALUES IN Z(I), IN DESCENDING ORDER
- C
- DO 60 K=1,IK1
- IF (ZZ.LE.Z(K)) GO TO 60
- I=IK
- 50 Z(I)=Z(I-1)
- KAN(I)=KAN(I-1)
- I=I-1
- IF (I.GT.K) GO TO 50
- Z(K)=ZZ
- KAN(K)=J
- GO TO 70
- 60 CONTINUE
- Z(IK)=ZZ
- KAN(IK)=J
- 70 CONTINUE
- IF (Z(1).LE.ACU) RETURN
- KROW=1
- ZZ=Z(1)
- IIN=KAN(1)
- ZC=ZZ*SIGMA(IIN)
- GO TO 100
- 80 KROW=KROW+1
- IF (KROW.GT.IK) GO TO 20
- IF (Z(KROW).LE.ACU) GO TO 20
- C
- C DETERMINE THE ENTERING VARIABLE FROM THE CANDIDATE LIST
- C
- IIN=KAN(KROW)
- ZC=ZERO
- DO 90 I=1,M
- LL=INCOL(I)
- 90 ZC=ZC+BETA(I)*X(IIN,LL)
- ZC=ZC-Y(IIN)
- ZZ=ZC*SIGMA(IIN)
- IF (ZZ.LE.ACU) GO TO 80
- 100 BEST=ZZ
- RHO=SIGMA(IIN)
- C
- C RHO: SIGN OF THE INCOMING REDUCED COST
- C IIN: INCOMING CANDIDATE
- C
- C FIND THE REPRESENTATION OF THE ENTERING VARIABLE
- C
- DO 110 I=1,M
- LL=INCOL(I)
- RHS(I)=X(IIN,LL)
- 110 CONTINUE
- KKK=0
- CALL CALCPI (KKK,REPP,RHS,M)
- C
- C CALCULATE THE MIN RATIO TEST TO DETERMINE THE LEAVING VARIABLE
- C
- TEST=2.0
- DO 120 I=1,M
- C++ IF (ABS(REPP(I)).LE.ACU) GO TO 120
- IF (DABS(REPP(I)).LE.ACU) GO TO 120
- C++ SREPP=SIGN(1.0,REPP(I))
- SREPP=DSIGN(1.0D0,REPP(I))
- C++ RATIO=ABS((1.-RHO*SREPP*PI(I))/REPP(I))
- RATIO=DABS((1.-RHO*SREPP*PI(I))/REPP(I))
- IF (RATIO.GE.TEST) GO TO 120
- TEST=RATIO
- IOUT=I
- 120 CONTINUE
- C
- C PERFORM FATHOMING TEST BEFORE PIVOT
- C
- SADT=SAD+TEST*ZZ
- IF (SADT.GE.ZLOW) RETURN
- SAD=SADT
- C
- DO 130 I=1,M
- 130 PI(I)=PI(I)+TEST*REPP(I)*RHO
- IF (TEST.LT.2.0) GO TO 150
- C
- SIGMA(IIN)=-SIGMA(IIN)
- XTWO=SIGMA(IIN)+SIGMA(IIN)
- DO 140 I=1,M
- LL=INCOL(I)
- TOT(I)=TOT(I)-XTWO*X(IIN,LL)
- 140 CONTINUE
- GO TO 80
- 150 K=IBASE(IOUT)
- C++ SIGMA(K)=SIGN(1.0,PI(IOUT))
- SIGMA(K)=DSIGN(1.0D0,PI(IOUT))
- PI(IOUT)=SIGMA(IIN)*(1.0-TEST)
- IBASE(IOUT)=IIN
- C
- DO 160 I=1,M
- LL=INCOL(I)
- TOT(I)=TOT(I)+SIGMA(IIN)*X(IIN,LL)-SIGMA(K)*X(K,LL)
- 160 CONTINUE
- C
- KKK=IOUT
- CALL UPDATE (IOUT,IFAULT,X,1,M)
- C
- DO 170 I=1,M
- RHS(I)=ZERO
- 170 CONTINUE
- RHS(KKK)=ONE
- KKK=KKK-1
- CALL CALBET (KKK,REPP,RHS,M)
- DO 180 L=1,M
- 180 BETA(L)=BETA(L)-ZC*REPP(L)
- SIGMA(IIN)=ZERO
- ITER=ITER+1
- GO TO 80
- C
- END
- SUBROUTINE L1NORM (X,Y,N,M,IFAULT,ITER,BETA,PI,TOT)
- C
- C THIS ROUTINE SOLVES THE INITIAL REGRESSION PROBLEM WITH ALL
- C THE PARAMETERS INCLUDED IN THE MODEL
- C
- DIMENSION X(300,20), Y(300), D(300), DELTA(300), INEXT(300), PRICE
- 1(300), RHS(20), BETA(20), TOT(20), PI(20)
- C
- C
- COMMON /BLOCK/
- - ACU,BIG,BSAVE(210),LU(20,20),PIE(210),SAD,SADT,SAVTOT(210),
- -SIG(6000),SIGMA(300),ZLOW,ZSAVE(20),IBASE(20),IK,IK1,INCOL(20),
- -INDEX(20),INPROB(210),IPAR(20),LABEL(210),LEVEL,DIRECT,INTL
- C
- INTEGER I,IBASE,IFAULT,IIN,IK,IK1,INCOL,INEXT,INPROB,IOUT,IPAR
- INTEGER INDEX,IPT,ITER,J,K,K1,KKK,KOUNT,L,LABEL,LEVEL,M,M1,N
- C
- DOUBLE PRECISION ACU,AHALF,AONE,BETA,BIG,BONE,BSAVE,D,DELTA,LU
- C++ REAL ACU,AHALF,AONE,BETA,BIG,BONE,BSAVE,D,DELTA,LU
- DOUBLE PRECISION ONE,PI,PIE,PRICE,RATIO,RHO,RHS,SAD,SADT,SAVTOT
- C++ REAL ONE,PI,PIE,PRICE,RATIO,RHO,RHS,SAD,SADT,SAVTOT
- DOUBLE PRECISION SIG,SIGMA,SUBT,SUM,T,TEST,TOT,VAL,X,Y,ZERO,ZLOW
- C++ REAL SIG,SIGMA,SUBT,SUM,T,TEST,TOT,VAL,X,Y,ZERO,ZLOW
- DOUBLE PRECISION ZSAVE,ZZZ
- C++ REAL ZSAVE,ZZZ
- C
- LOGICAL DIRECT,INTL
- C
- DATA ONE/1.0D0/,ZERO/0.0D0/
- C++ DATA ONE/1.0E0/,ZERO/0.0E0/
- C
- C INITIAL SETTINGS
- C
- ITER=0
- AONE=ONE+ACU
- AHALF=.5+ACU
- BONE=ONE-ACU
- M1=M-1
- C
- C SET UP INITIAL LU DECOMPOSITION
- C
- INTL=.TRUE.
- K=1
- CALL UPDATE (K,IFAULT,X,N,M)
- IF (IFAULT.NE.0) RETURN
- INTL=.FALSE.
- DO 10 I=1,M
- K1=IBASE(I)
- RHS(I)=Y(K1)
- 10 CONTINUE
- KKK=0
- CALL CALBET (KKK,BETA,RHS,M)
- C
- C CALCULATE INITIAL D, TOT AND SIGMA VECTORS
- C
- DO 30 J=1,N
- VAL=ZERO
- DO 20 I=1,M
- VAL=VAL+BETA(I)*X(J,I)
- 20 CONTINUE
- D(J)=Y(J)-VAL
- C++ SIGMA(J)=SIGN(1.,D(J))
- SIGMA(J)=DSIGN(1.D0,D(J))
- 30 CONTINUE
- DO 40 J=1,M
- RHS(J)=ZERO
- KKK=IBASE(J)
- SIGMA(KKK)=ZERO
- 40 CONTINUE
- DO 60 J=1,N
- DO 50 I=1,M
- 50 TOT(I)=TOT(I)-SIGMA(J)*X(J,I)
- 60 CONTINUE
- C
- C MAIN ITERATIVE LOOP BEGINS
- C
- 70 CONTINUE
- C
- KKK=0
- CALL CALCPI (KKK,PI,TOT,M)
- C
- T=AONE
- K=0
- DO 80 J=1,M
- C++ IF (ABS(PI(J)).LT.T) GO TO 80
- IF (DABS(PI(J)).LT.T) GO TO 80
- K=J
- C++ T=ABS(PI(J))
- T=DABS(PI(J))
- C++ RHO=-SIGN(1.,PI(J))
- RHO=-DSIGN(1.D0,PI(J))
- 80 CONTINUE
- IF (K.EQ.0) GO TO 220
- KKK=K-1
- RHS(K)=ONE
- CALL CALBET (KKK,BETA,RHS,M)
- RHS(K)=ZERO
- DO 100 I=1,N
- DELTA(I)=ZERO
- IF (SIGMA(I).EQ.ZERO) GO TO 100
- DO 90 J=1,M
- DELTA(I)=DELTA(I)+BETA(J)*X(I,J)
- 90 CONTINUE
- DELTA(I)=RHO*DELTA(I)
- 100 CONTINUE
- C
- C PERFORM PARTIAL SORT OF RATIOS
- C
- T=T*.5
- KOUNT=0
- RATIO=BIG
- SUM=AHALF
- SUBT=ZERO
- DO 160 I=1,N
- IF (DELTA(I)*SIGMA(I).LE.ACU) GO TO 160
- TEST=D(I)/DELTA(I)
- IF (TEST.GE.RATIO) GO TO 160
- C++ SUM=SUM+ABS(DELTA(I))
- SUM=SUM+DABS(DELTA(I))
- IF (SUM-SUBT.GE.T) GO TO 110
- C
- C INSERT I IN LIST
- C
- KOUNT=KOUNT+1
- PRICE(KOUNT)=TEST
- INEXT(KOUNT)=I
- GO TO 160
- C
- C UPDATE SUM AND KICK IIN OUT OF THE LIST
- C
- 110 SUM=SUM-SUBT
- RATIO=TEST
- IPT=0
- KKK=0
- C
- C IDENTIFY A NEW IIN
- C
- 120 KKK=KKK+1
- IF (KKK.GT.KOUNT) GO TO 130
- IF (PRICE(KKK).LE.RATIO) GO TO 120
- RATIO=PRICE(KKK)
- IPT=KKK
- GO TO 120
- 130 IF (IPT.EQ.0) GO TO 150
- C
- C SWITCH VALUES
- C
- KKK=INEXT(IPT)
- C++ SUBT=ABS(DELTA(KKK))
- SUBT=DABS(DELTA(KKK))
- IF (SUM-SUBT.LT.T) GO TO 140
- PRICE(IPT)=PRICE(KOUNT)
- INEXT(IPT)=INEXT(KOUNT)
- KOUNT=KOUNT-1
- GO TO 110
- 140 IIN=INEXT(IPT)
- INEXT(IPT)=I
- PRICE(IPT)=TEST
- GO TO 160
- 150 IIN=I
- C++ SUBT=ABS(DELTA(I))
- SUBT=DABS(DELTA(I))
- 160 CONTINUE
- C
- C UPDATE BASIC INDICATORS
- C
- IF (KOUNT.EQ.0) GO TO 190
- DO 180 J=1,KOUNT
- KKK=INEXT(J)
- ZZZ=SIGMA(KKK)
- DO 170 L=1,M
- SUBT=ZZZ*X(KKK,L)
- TOT(L)=TOT(L)+SUBT+SUBT
- 170 CONTINUE
- SIGMA(KKK)=-SIGMA(KKK)
- 180 CONTINUE
- 190 CONTINUE
- IOUT=IBASE(K)
- DELTA(IOUT)=RHO
- DO 200 L=1,M
- 200 TOT(L)=TOT(L)+RHO*X(IOUT,L)+SIGMA(IIN)*X(IIN,L)
- SIGMA(IOUT)=-RHO
- IBASE(K)=IIN
- CALL UPDATE (K,IFAULT,X,1,M)
- DO 210 J=1,N
- 210 D(J)=D(J)-RATIO*DELTA(J)
- SIGMA(IIN)=ZERO
- ITER=ITER+1
- GO TO 70
- C
- C CALCULATE OPTIMAL BETA AND SUM OF ABSOLUTE DEVIATIONS
- C
- 220 DO 230 I=1,M
- K1=IBASE(I)
- RHS(I)=Y(K1)
- 230 CONTINUE
- KKK=0
- CALL CALBET (KKK,BETA,RHS,M)
- SAD=ZERO
- DO 240 J=1,N
- C++ 240 SAD=SAD+ABS(D(J))
- 240 SAD=SAD+DABS(D(J))
- RETURN
- C
- END
- SUBROUTINE CALBET (KKK,BETA,RHS,M)
- C
- C SUBROUTINE CALBET FOR BACK-SOLVING SYSTEM OF EQUATIONS
- C
- DIMENSION BETA(20), RHS(20)
- C
- COMMON /BLOCK/
- - ACU,BIG,BSAVE(210),LU(20,20),PIE(210),SAD,SADT,SAVTOT(210),
- -SIG(6000),SIGMA(300),ZLOW,ZSAVE(20),IBASE(20),IK,IK1,INCOL(20),
- -INDEX(20),INPROB(210),IPAR(20),LABEL(210),LEVEL,DIRECT,INTL
- C
- INTEGER I,IBASE,II,II1,IK,IK1,INCOL,INDEX,INPROB,IPAR,K,K1,K2
- INTEGER KK,KKK,KKK1,LABEL,LEVEL,M,M1
- C
- DOUBLE PRECISION ACU,BETA,BIG,BSAVE,LU,PIE,RHS,SAD,SADT,SAVTOT
- C++ REAL ACU,BETA,BIG,BSAVE,LU,PIE,RHS,SAD,SADT,SAVTOT
- DOUBLE PRECISION SIG,SIGMA,ZERO,ZLOW,ZSAVE
- C++ REAL SIG,SIGMA,ZERO,ZLOW,ZSAVE
- C
- LOGICAL DIRECT,INTL
- C
- DATA ZERO/0.0D0/
- C++ DATA ZERO/0.0E0/
- C
- IF (M.GT.1) GO TO 10
- K=INDEX(1)
- BETA(K)=RHS(1)/LU(K,1)
- RETURN
- 10 CONTINUE
- M1=M-1
- IF (KKK.EQ.0) GO TO 30
- DO 20 I=1,KKK
- K=INDEX(I)
- BETA(K)=ZERO
- 20 CONTINUE
- 30 KKK=KKK+1
- K=INDEX(KKK)
- BETA(K)=RHS(KKK)/LU(K,KKK)
- IF (KKK.EQ.M) GO TO 60
- KKK1=KKK+1
- DO 50 II=KKK1,M
- K=INDEX(II)
- BETA(K)=RHS(II)
- II1=II-1
- DO 40 I=KKK,II1
- KK=INDEX(I)
- BETA(K)=BETA(K)-LU(KK,II)*BETA(KK)
- 40 CONTINUE
- BETA(K)=BETA(K)/LU(K,II)
- 50 CONTINUE
- 60 CONTINUE
- DO 70 II=1,M1
- K1=M-II
- K=INDEX(K1)
- DO 70 I=1,II
- KK=M-I+1
- K2=INDEX(KK)
- BETA(K)=BETA(K)-LU(K2,K1)*BETA(K2)
- 70 CONTINUE
- RETURN
- C
- END
- SUBROUTINE UPDATE (KKK,IFAULT,X,N,M)
- C
- C SUBROUTINE UPDATE FOR UPDATING LU DECOMPOSITION MATRIX
- C
- COMMON /BLOCK/
- - ACU,BIG,BSAVE(210),LU(20,20),PIE(210),SAD,SADT,SAVTOT(210),
- -SIG(6000),SIGMA(300),ZLOW,ZSAVE(20),IBASE(20),IK,IK1,INCOL(20),
- -INDEX(20),INPROB(210),IPAR(20),LABEL(210),LEVEL,DIRECT,INTL
- C
- INTEGER I,IBASE,ICOL,IFAULT,II,II1,IK,IK1,INCOL,INDEX,INPROB
- INTEGER IPAR,IROW,ISAVE,J,K,KK,KKK,LABEL,LEVEL,LL,M,N
- C
- DOUBLE PRECISION ACU,BIG,BSAVE,LU,PIE,PIVOT,SAD,SADT,SAVTOT
- C++ REAL ACU,BIG,BSAVE,LU,PIE,PIVOT,SAD,SADT,SAVTOT
- DOUBLE PRECISION SIG,SIGMA,SUBT,X,ZLOW,ZSAVE
- C++ REAL SIG,SIGMA,SUBT,X,ZLOW,ZSAVE
- C
- LOGICAL DIRECT,INTL
- C
- DIMENSION X(300,20)
- C
- IROW=0
- DO 90 II=KKK,M
- IF (INTL) GO TO 10
- IROW=IBASE(II)
- GO TO 20
- 10 IROW=IROW+1
- IBASE(II)=IROW
- IF (IROW.GT.N) IFAULT=1
- IF (IFAULT.NE.0) RETURN
- 20 DO 30 I=1,M
- LL=INCOL(I)
- LU(I,II)=X(IROW,LL)
- 30 CONTINUE
- C
- C SET UP REPRESENTATION OF INCOMING ROW
- C
- IF (II.EQ.1) GO TO 60
- II1=II-1
- DO 50 ICOL=1,II1
- K=INDEX(ICOL)
- SUBT=LU(K,II)
- J=ICOL+1
- DO 40 I=J,M
- K=INDEX(I)
- LU(K,II)=LU(K,II)-SUBT*LU(K,ICOL)
- 40 CONTINUE
- 50 CONTINUE
- C
- C FIND MAXIMUM ENTRY
- C
- 60 PIVOT=ACU
- KK=0
- DO 70 I=II,M
- K=INDEX(I)
- IF (DABS(LU(K,II)).LE.PIVOT) GO TO 70
- C++ IF (ABS(LU(K,II)).LE.PIVOT) GO TO 70
- C++ PIVOT=ABS(LU(K,II))
- PIVOT=DABS(LU(K,II))
- KK=I
- 70 CONTINUE
- IF (KK.EQ.0) GO TO 10
- C
- C SWITCH ORDER
- C
- ISAVE=INDEX(KK)
- INDEX(KK)=INDEX(II)
- INDEX(II)=ISAVE
- C
- C PUT IN COLUMNS OF LU ONE AT A TIME
- C
- IF (II.EQ.M) GO TO 90
- J=II+1
- DO 80 I=J,M
- K=INDEX(I)
- LU(K,II)=LU(K,II)/LU(ISAVE,II)
- 80 CONTINUE
- 90 CONTINUE
- KKK=IROW
- RETURN
- C
- END
- SUBROUTINE CALCPI (KKK,PI,TOT,M)
- C
- C THIS ROUTINE FORWARD SOLVES A LINEAR SYSTEM
- C
- DIMENSION TOT(20), PI(20)
- C
- COMMON /BLOCK/
- - ACU,BIG,BSAVE(210),LU(20,20),PIE(210),SAD,SADT,SAVTOT(210),
- -SIG(6000),SIGMA(300),ZLOW,ZSAVE(20),IBASE(20),IK,IK1,INCOL(20),
- -INDEX(20),INPROB(210),IPAR(20),LABEL(210),LEVEL,DIRECT,INTL
- C
- INTEGER I,IBASE,II,II1,IK,IK1,INCOL,INDEX,INPROB,IPAR,K,K1,K2,KKK
- INTEGER KKK1,LABEL,LEVEL,M,M1
- C
- DOUBLE PRECISION ACU,BIG,BSAVE,LU,PI,PIE,SAD,SADT,SAVTOT,SIG
- C++ REAL ACU,BIG,BSAVE,LU,PI,PIE,SAD,SADT,SAVTOT,SIG
- DOUBLE PRECISION SIGMA,TOT,ZERO,ZLOW,ZSAVE
- C++ REAL SIGMA,TOT,ZERO,ZLOW,ZSAVE
- C
- LOGICAL DIRECT,INTL
- C
- C++ DATA ZERO/0.0E0/
- DATA ZERO/0.0D0/
- M1=M-1
- C
- IF (M.GT.1) GO TO 10
- K=INDEX(M)
- PI(M)=TOT(K)/LU(K,M)
- RETURN
- 10 IF (KKK.EQ.0) GO TO 30
- DO 20 I=1,KKK
- PI(I)=ZERO
- 20 CONTINUE
- 30 CONTINUE
- KKK=KKK+1
- K=INDEX(KKK)
- PI(KKK)=TOT(K)
- IF (KKK.EQ.M) GO TO 60
- KKK1=KKK+1
- DO 50 II=KKK1,M
- K=INDEX(II)
- PI(II)=TOT(K)
- II1=II-1
- DO 40 I=KKK,II1
- 40 PI(II)=PI(II)-LU(K,I)*PI(I)
- 50 CONTINUE
- 60 CONTINUE
- K=INDEX(M)
- PI(M)=PI(M)/LU(K,M)
- DO 80 II=1,M1
- K1=M-II
- K=INDEX(K1)
- DO 70 I=1,II
- K2=M-I+1
- PI(K1)=PI(K1)-LU(K,K2)*PI(K2)
- 70 CONTINUE
- PI(K1)=PI(K1)/LU(K,K1)
- 80 CONTINUE
- RETURN
- END
- DOUBLE PRECISION FUNCTION D1MACH(I)
- C***BEGIN PROLOGUE D1MACH
- C***DATE WRITTEN 750101 (YYMMDD)
- C***REVISION DATE 820801 (YYMMDD)
- C***CATEGORY NO. R1
- C***KEYWORDS MACHINE CONSTANTS
- C***AUTHOR FOX, P. A., (BELL LABS)
- C HALL, A. D., (BELL LABS)
- C SCHRYER, N. L., (BELL LABS)
- C***PURPOSE RETURNS DOUBLE PRECISION MACHINE DEPENDENT CONSTANTS
- C***DESCRIPTION
- C D1MACH CAN BE USED TO OBTAIN MACHINE-DEPENDENT PARAMETERS
- C FOR THE LOCAL MACHINE ENVIRONMENT. IT IS A FUNCTION
- C SUBPROGRAM WITH ONE (INPUT) ARGUMENT, AND CAN BE CALLED
- C AS FOLLOWS, FOR EXAMPLE
- C
- C D = D1MACH(I)
- C
- C WHERE I=1,...,5. THE (OUTPUT) VALUE OF D ABOVE IS
- C DETERMINED BY THE (INPUT) VALUE OF I. THE RESULTS FOR
- C VARIOUS VALUES OF I ARE DISCUSSED BELOW.
- C
- C DOUBLE-PRECISION MACHINE CONSTANTS
- C D1MACH( 1) = B**(EMIN-1), THE SMALLEST POSITIVE MAGNITUDE.
- C D1MACH( 2) = B**EMAX*(1 - B**(-T)), THE LARGEST MAGNITUDE.
- C D1MACH( 3) = B**(-T), THE SMALLEST RELATIVE SPACING.
- C D1MACH( 4) = B**(1-T), THE LARGEST RELATIVE SPACING.
- C D1MACH( 5) = LOG10(B)
- C***REFERENCES FOX P.A., HALL A.D., SCHRYER N.L.,*FRAMEWORK FOR A
- C PORTABLE LIBRARY*, ACM TRANSACTIONS ON MATHEMATICAL
- C SOFTWARE, VOL. 4, NO. 2, JUNE 1978, PP. 177-188.
- C***ROUTINES CALLED XERROR
- C***END PROLOGUE D1MACH
- C
- INTEGER SMALL(4)
- INTEGER LARGE(4)
- INTEGER RIGHT(4)
- INTEGER DIVER(4)
- INTEGER LOG10(4)
- C
- DOUBLE PRECISION DMACH(5)
- C
- EQUIVALENCE (DMACH(1),SMALL(1))
- EQUIVALENCE (DMACH(2),LARGE(1))
- EQUIVALENCE (DMACH(3),RIGHT(1))
- EQUIVALENCE (DMACH(4),DIVER(1))
- EQUIVALENCE (DMACH(5),LOG10(1))
- C
- C MACHINE CONSTANTS FOR THE BURROUGHS 1700 SYSTEM.
- C
- C DATA SMALL(1) / ZC00800000 /
- C DATA SMALL(2) / Z000000000 /
- C
- C DATA LARGE(1) / ZDFFFFFFFF /
- C DATA LARGE(2) / ZFFFFFFFFF /
- C
- C DATA RIGHT(1) / ZCC5800000 /
- C DATA RIGHT(2) / Z000000000 /
- C
- C DATA DIVER(1) / ZCC6800000 /
- C DATA DIVER(2) / Z000000000 /
- C
- C DATA LOG10(1) / ZD00E730E7 /
- C DATA LOG10(2) / ZC77800DC0 /
- C
- C MACHINE CONSTANTS FOR THE BURROUGHS 5700 SYSTEM.
- C
- C DATA SMALL(1) / O1771000000000000 /
- C DATA SMALL(2) / O0000000000000000 /
- C
- C DATA LARGE(1) / O0777777777777777 /
- C DATA LARGE(2) / O0007777777777777 /
- C
- C DATA RIGHT(1) / O1461000000000000 /
- C DATA RIGHT(2) / O0000000000000000 /
- C
- C DATA DIVER(1) / O1451000000000000 /
- C DATA DIVER(2) / O0000000000000000 /
- C
- C DATA LOG10(1) / O1157163034761674 /
- C DATA LOG10(2) / O0006677466732724 /
- C
- C MACHINE CONSTANTS FOR THE BURROUGHS 6700/7700 SYSTEMS.
- C
- C DATA SMALL(1) / O1771000000000000 /
- C DATA SMALL(2) / O7770000000000000 /
- C
- C DATA LARGE(1) / O0777777777777777 /
- C DATA LARGE(2) / O7777777777777777 /
- C
- C DATA RIGHT(1) / O1461000000000000 /
- C DATA RIGHT(2) / O0000000000000000 /
- C
- C DATA DIVER(1) / O1451000000000000 /
- C DATA DIVER(2) / O0000000000000000 /
- C
- C DATA LOG10(1) / O1157163034761674 /
- C DATA LOG10(2) / O0006677466732724 /
- C
- C MACHINE CONSTANTS FOR THE CDC 6000/7000 SERIES.
- C
- C DATA SMALL(1) / 00604000000000000000B /
- C DATA SMALL(2) / 00000000000000000000B /
- C
- C DATA LARGE(1) / 37767777777777777777B /
- C DATA LARGE(2) / 37167777777777777777B /
- C
- C DATA RIGHT(1) / 15604000000000000000B /
- C DATA RIGHT(2) / 15000000000000000000B /
- C
- C DATA DIVER(1) / 15614000000000000000B /
- C DATA DIVER(2) / 15010000000000000000B /
- C
- C DATA LOG10(1) / 17164642023241175717B /
- C DATA LOG10(2) / 16367571421742254654B /
- C
- C MACHINE CONSTANTS FOR THE CRAY 1
- C
- C DATA SMALL(1) / 200004000000000000000B /
- C DATA SMALL(2) / 00000000000000000000B /
- C
- C DATA LARGE(1) / 577777777777777777777B /
- C DATA LARGE(2) / 000007777777777777777B /
- C
- C DATA RIGHT(1) / 377214000000000000000B /
- C DATA RIGHT(2) / 000000000000000000000B /
- C
- C DATA DIVER(1) / 377224000000000000000B /
- C DATA DIVER(2) / 000000000000000000000B /
- C
- C DATA LOG10(1) / 377774642023241175717B /
- C DATA LOG10(2) / 000007571421742254654B /
- C
- C MACHINE CONSTANTS FOR THE DATA GENERAL ECLIPSE S/200
- C
- C NOTE - IT MAY BE APPROPRIATE TO INCLUDE THE FOLLOWING CARD -
- C STATIC DMACH(5)
- C
- C DATA SMALL/20K,3*0/,LARGE/77777K,3*177777K/
- C DATA RIGHT/31420K,3*0/,DIVER/32020K,3*0/
- C DATA LOG10/40423K,42023K,50237K,74776K/
- C
- C MACHINE CONSTANTS FOR THE HARRIS 220
- C
- C DATA SMALL(1),SMALL(2) / [20000000, [00000201 /
- C DATA LARGE(1),LARGE(2) / [37777777, [37777577 /
- C DATA RIGHT(1),RIGHT(2) / [20000000, [00000333 /
- C DATA DIVER(1),DIVER(2) / [20000000, [00000334 /
- C DATA LOG10(1),LOG10(2) / [23210115, [10237777 /
- C
- C MACHINE CONSTANTS FOR THE HONEYWELL 600/6000 SERIES.
- C
- C DATA SMALL(1),SMALL(2) / O402400000000, O000000000000 /
- C DATA LARGE(1),LARGE(2) / O376777777777, O777777777777 /
- C DATA RIGHT(1),RIGHT(2) / O604400000000, O000000000000 /
- C DATA DIVER(1),DIVER(2) / O606400000000, O000000000000 /
- C DATA LOG10(1),LOG10(2) / O776464202324, O117571775714 /
- C
- C MACHINE CONSTANTS FOR THE HP 2100
- C THREE WORD DOUBLE PRECISION OPTION WITH FTN4
- C
- C DATA SMALL(1), SMALL(2), SMALL(3) / 40000B, 0, 1 /
- C DATA LARGE(1), LARGE(2), LARGE(3) / 77777B, 177777B, 177776B /
- C DATA RIGHT(1), RIGHT(2), RIGHT(3) / 40000B, 0, 265B /
- C DATA DIVER(1), DIVER(2), DIVER(3) / 40000B, 0, 276B /
- C DATA LOG10(1), LOG10(2), LOG10(3) / 46420B, 46502B, 77777B /
- C
- C
- C MACHINE CONSTANTS FOR THE HP 2100
- C FOUR WORD DOUBLE PRECISION OPTION WITH FTN4
- C
- C DATA SMALL(1), SMALL(2) / 40000B, 0 /
- C DATA SMALL(3), SMALL(4) / 0, 1 /
- C DATA LARGE(1), LARGE(2) / 77777B, 177777B /
- C DATA LARGE(3), LARGE(4) / 177777B, 177776B /
- C DATA RIGHT(1), RIGHT(2) / 40000B, 0 /
- C DATA RIGHT(3), RIGHT(4) / 0, 225B /
- C DATA DIVER(1), DIVER(2) / 40000B, 0 /
- C DATA DIVER(3), DIVER(4) / 0, 227B /
- C DATA LOG10(1), LOG10(2) / 46420B, 46502B /
- C DATA LOG10(3), LOG10(4) / 76747B, 176377B /
- C
- C
- C MACHINE CONSTANTS FOR THE IBM 360/370 SERIES,
- C THE XEROX SIGMA 5/7/9, THE SEL SYSTEMS 85/86, AND
- C THE PERKIN ELMER (INTERDATA) 7/32.
- C
- C DATA SMALL(1),SMALL(2) / Z00100000, Z00000000 /
- C DATA LARGE(1),LARGE(2) / Z7FFFFFFF, ZFFFFFFFF /
- C DATA RIGHT(1),RIGHT(2) / Z33100000, Z00000000 /
- C DATA DIVER(1),DIVER(2) / Z34100000, Z00000000 /
- C DATA LOG10(1),LOG10(2) / Z41134413, Z509F79FF /
- C
- C MACHINE CONSTANTS FOR THE PDP-10 (KA PROCESSOR).
- C
- C DATA SMALL(1),SMALL(2) / "033400000000, "000000000000 /
- C DATA LARGE(1),LARGE(2) / "377777777777, "344777777777 /
- C DATA RIGHT(1),RIGHT(2) / "113400000000, "000000000000 /
- C DATA DIVER(1),DIVER(2) / "114400000000, "000000000000 /
- C DATA LOG10(1),LOG10(2) / "177464202324, "144117571776 /
- C
- C MACHINE CONSTANTS FOR THE PDP-10 (KI PROCESSOR).
- C
- C DATA SMALL(1),SMALL(2) / "000400000000, "000000000000 /
- C DATA LARGE(1),LARGE(2) / "377777777777, "377777777777 /
- C DATA RIGHT(1),RIGHT(2) / "103400000000, "000000000000 /
- C DATA DIVER(1),DIVER(2) / "104400000000, "000000000000 /
- C DATA LOG10(1),LOG10(2) / "177464202324, "476747767461 /
- C
- C MACHINE CONSTANTS FOR PDP-11 FORTRAN SUPPORTING
- C 32-BIT INTEGERS (EXPRESSED IN INTEGER AND OCTAL).
- C
- C DATA SMALL(1),SMALL(2) / 8388608, 0 /
- C DATA LARGE(1),LARGE(2) / 2147483647, -1 /
- C DATA RIGHT(1),RIGHT(2) / 612368384, 0 /
- C DATA DIVER(1),DIVER(2) / 620756992, 0 /
- C DATA LOG10(1),LOG10(2) / 1067065498, -2063872008 /
- C
- C DATA SMALL(1),SMALL(2) / O00040000000, O00000000000 /
- C DATA LARGE(1),LARGE(2) / O17777777777, O37777777777 /
- C DATA RIGHT(1),RIGHT(2) / O04440000000, O00000000000 /
- C DATA DIVER(1),DIVER(2) / O04500000000, O00000000000 /
- C DATA LOG10(1),LOG10(2) / O07746420232, O20476747770 /
- C
- C MACHINE CONSTANTS FOR PDP-11 FORTRAN SUPPORTING
- C 16-BIT INTEGERS (EXPRESSED IN INTEGER AND OCTAL).
- C
- C DATA SMALL(1),SMALL(2) / 128, 0 /
- C DATA SMALL(3),SMALL(4) / 0, 0 /
- C
- C DATA LARGE(1),LARGE(2) / 32767, -1 /
- C DATA LARGE(3),LARGE(4) / -1, -1 /
- C
- C DATA RIGHT(1),RIGHT(2) / 9344, 0 /
- C DATA RIGHT(3),RIGHT(4) / 0, 0 /
- C
- C DATA DIVER(1),DIVER(2) / 9472, 0 /
- C DATA DIVER(3),DIVER(4) / 0, 0 /
- C
- C DATA LOG10(1),LOG10(2) / 16282, 8346 /
- C DATA LOG10(3),LOG10(4) / -31493, -12296 /
- C
- C DATA SMALL(1),SMALL(2) / O000200, O000000 /
- C DATA SMALL(3),SMALL(4) / O000000, O000000 /
- C
- C DATA LARGE(1),LARGE(2) / O077777, O177777 /
- C DATA LARGE(3),LARGE(4) / O177777, O177777 /
- C
- C DATA RIGHT(1),RIGHT(2) / O022200, O000000 /
- C DATA RIGHT(3),RIGHT(4) / O000000, O000000 /
- C
- C DATA DIVER(1),DIVER(2) / O022400, O000000 /
- C DATA DIVER(3),DIVER(4) / O000000, O000000 /
- C
- C DATA LOG10(1),LOG10(2) / O037632, O020232 /
- C DATA LOG10(3),LOG10(4) / O102373, O147770 /
- C
- C MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES. FTN COMPILER
- C
- C DATA SMALL(1),SMALL(2) / O000040000000, O000000000000 /
- C DATA LARGE(1),LARGE(2) / O377777777777, O777777777777 /
- C DATA RIGHT(1),RIGHT(2) / O170540000000, O000000000000 /
- C DATA DIVER(1),DIVER(2) / O170640000000, O000000000000 /
- C DATA LOG10(1),LOG10(2) / O177746420232, O411757177572 /
- C
- C MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES. FOR COMPILER
- C
- C DATA SMALL(1), SMALL(2) / O000040000000, O000000000000 /
- C DATA LARGE(1), LARGE(2) / O377777777777, O777777777777 /
- C DATA RIGHT(1), RIGHT(2) / O170540000000, O000000000000 /
- C DATA DIVER(1), DIVER(2) / O170640000000, O000000000000 /
- C DATA LOG10(1), LOG10(2) / O177746420232, O411757177572/
- C
- C
- C MACHINE CONSTANTS FOR VAX 11/780
- C (EXPRESSED IN INTEGER AND HEXADECIMAL)
- C ***THE HEX FORMAT BELOW MAY NOT BE SUITABLE FOR UNIX SYSYEMS***
- C *** THE INTEGER FORMAT SHOULD BE OK FOR UNIX SYSTEMS***
- C
- C DATA SMALL(1), SMALL(2) / 128, 0 /
- C DATA LARGE(1), LARGE(2) / -32769, -1 /
- C DATA RIGHT(1), RIGHT(2) / 9344, 0 /
- C DATA DIVER(1), DIVER(2) / 9472, 0 /
- C DATA LOG10(1), LOG10(2) / 546979738, -805665541 /
- C
- C DATA SMALL(1), SMALL(2) / Z00000080, Z00000000 /
- C DATA LARGE(1), LARGE(2) / ZFFFF7FFF, ZFFFFFFFF /
- C DATA RIGHT(1), RIGHT(2) / Z00002480, Z00000000 /
- C DATA DIVER(1), DIVER(2) / Z00002500, Z00000000 /
- C DATA LOG10(1), LOG10(2) / Z209A3F9A, ZCFFA84FB /
- C
- C***FIRST EXECUTABLE STATEMENT D1MACH
- C
- D1MACH = DMACH(I)
- RETURN
- C
- END
- REAL FUNCTION R1MACH(I)
- C***BEGIN PROLOGUE R1MACH
- C***DATE WRITTEN 790101 (YYMMDD)
- C***REVISION DATE 820801 (YYMMDD)
- C***CATEGORY NO. R1
- C***KEYWORDS MACHINE CONSTANTS
- C***AUTHOR FOX, P. A., (BELL LABS)
- C HALL, A. D., (BELL LABS)
- C SCHRYER, N. L., (BELL LABS)
- C***PURPOSE RETURNS SINGLE PRECISION MACHINE DEPENDENT CONSTANTS
- C***DESCRIPTION
- C R1MACH CAN BE USED TO OBTAIN MACHINE-DEPENDENT PARAMETERS
- C FOR THE LOCAL MACHINE ENVIRONMENT. IT IS A FUNCTION
- C SUBROUTINE WITH ONE (INPUT) ARGUMENT, AND CAN BE CALLED
- C AS FOLLOWS, FOR EXAMPLE
- C
- C A = R1MACH(I)
- C
- C WHERE I=1,...,5. THE (OUTPUT) VALUE OF A ABOVE IS
- C DETERMINED BY THE (INPUT) VALUE OF I. THE RESULTS FOR
- C VARIOUS VALUES OF I ARE DISCUSSED BELOW.
- C
- C SINGLE-PRECISION MACHINE CONSTANTS
- C R1MACH(1) = B**(EMIN-1), THE SMALLEST POSITIVE MAGNITUDE.
- C R1MACH(2) = B**EMAX*(1 - B**(-T)), THE LARGEST MAGNITUDE.
- C R1MACH(3) = B**(-T), THE SMALLEST RELATIVE SPACING.
- C R1MACH(4) = B**(1-T), THE LARGEST RELATIVE SPACING.
- C R1MACH(5) = LOG10(B)
- C***REFERENCES FOX, P.A., HALL, A.D., SCHRYER, N.L, *FRAMEWORK FOR
- C A PORTABLE LIBRARY*, ACM TRANSACTIONS ON MATHE-
- C MATICAL SOFTWARE, VOL. 4, NO. 2, JUNE 1978,
- C PP. 177-188.
- C***ROUTINES CALLED XERROR
- C***END PROLOGUE R1MACH
- C
- INTEGER SMALL(2)
- INTEGER LARGE(2)
- INTEGER RIGHT(2)
- INTEGER DIVER(2)
- INTEGER LOG10(2)
- C
- REAL RMACH(5)
- C
- EQUIVALENCE (RMACH(1),SMALL(1))
- EQUIVALENCE (RMACH(2),LARGE(1))
- EQUIVALENCE (RMACH(3),RIGHT(1))
- EQUIVALENCE (RMACH(4),DIVER(1))
- EQUIVALENCE (RMACH(5),LOG10(1))
- C
- C MACHINE CONSTANTS FOR THE BURROUGHS 1700 SYSTEM.
- C
- C DATA RMACH(1) / Z400800000 /
- C DATA RMACH(2) / Z5FFFFFFFF /
- C DATA RMACH(3) / Z4E9800000 /
- C DATA RMACH(4) / Z4EA800000 /
- C DATA RMACH(5) / Z500E730E8 /
- C
- C MACHINE CONSTANTS FOR THE BURROUGHS 5700/6700/7700 SYSTEMS.
- C
- C DATA RMACH(1) / O1771000000000000 /
- C DATA RMACH(2) / O0777777777777777 /
- C DATA RMACH(3) / O1311000000000000 /
- C DATA RMACH(4) / O1301000000000000 /
- C DATA RMACH(5) / O1157163034761675 /
- C
- C MACHINE CONSTANTS FOR THE CDC 6000/7000 SERIES.
- C
- C DATA RMACH(1) / 00014000000000000000B /
- C DATA RMACH(2) / 37767777777777777777B /
- C DATA RMACH(3) / 16404000000000000000B /
- C DATA RMACH(4) / 16414000000000000000B /
- C DATA RMACH(5) / 17164642023241175720B /
- C
- C MACHINE CONSTANTS FOR THE CRAY 1
- C
- C DATA RMACH(1) / 200004000000000000000B /
- C DATA RMACH(2) / 577777777777777777777B /
- C DATA RMACH(3) / 377214000000000000000B /
- C DATA RMACH(4) / 377224000000000000000B /
- C DATA RMACH(5) / 377774642023241175720B /
- C
- C MACHINE CONSTANTS FOR THE DATA GENERAL ECLIPSE S/200
- C
- C NOTE - IT MAY BE APPROPRIATE TO INCLUDE THE FOLLOWING CARD -
- C STATIC RMACH(5)
- C
- C DATA SMALL/20K,0/,LARGE/77777K,177777K/
- C DATA RIGHT/35420K,0/,DIVER/36020K,0/
- C DATA LOG10/40423K,42023K/
- C
- C MACHINE CONSTANTS FOR THE HARRIS 220
- C
- C DATA SMALL(1),SMALL(2) / [20000000, [00000201 /
- C DATA LARGE(1),LARGE(2) / [37777777, [00000177 /
- C DATA RIGHT(1),RIGHT(2) / [20000000, [00000352 /
- C DATA DIVER(1),DIVER(2) / [20000000, [00000353 /
- C DATA LOG10(1),LOG10(2) / [23210115, [00000377 /
- C
- C MACHINE CONSTANTS FOR THE HONEYWELL 600/6000 SERIES.
- C
- C DATA RMACH(1) / O402400000000 /
- C DATA RMACH(2) / O376777777777 /
- C DATA RMACH(3) / O714400000000 /
- C DATA RMACH(4) / O716400000000 /
- C DATA RMACH(5) / O776464202324 /
- C
- C MACHINE CONSTANTS FOR THE HP 2100
- C
- C 3 WORD DOUBLE PRECISION WITH FTN4
- C
- C DATA SMALL(1), SMALL(2) / 40000B, 1 /
- C DATA LARGE(1), LARGE(2) / 77777B, 177776B /
- C DATA RIGHT(1), RIGHT(2) / 40000B, 325B /
- C DATA DIVER(1), DIVER(2) / 40000B, 327B /
- C DATA LOG10(1), LOG10(2) / 46420B, 46777B /
- C
- C MACHINE CONSTANTS FOR THE HP 2100
- C 4 WORD DOUBLE PRECISION WITH FTN4
- C
- C DATA SMALL(1), SMALL(2) / 40000B, 1 /
- C DATA LARGE91), LARGE(2) / 77777B, 177776B /
- C DATA RIGHT(1), RIGHT(2) / 40000B, 325B /
- C DATA DIVER(1), DIVER(2) / 40000B, 327B /
- C DATA LOG10(1), LOG10(2) / 46420B, 46777B /
- C
- C MACHINE CONSTANTS FOR THE IBM 360/370 SERIES,
- C THE XEROX SIGMA 5/7/9, THE SEL SYSTEMS 85/86 AND
- C THE PERKIN ELMER (INTERDATA) 7/32.
- C
- C DATA RMACH(1) / Z00100000 /
- C DATA RMACH(2) / Z7FFFFFFF /
- C DATA RMACH(3) / Z3B100000 /
- C DATA RMACH(4) / Z3C100000 /
- C DATA RMACH(5) / Z41134413 /
- C
- C MACHINE CONSTANTS FOR THE PDP-10 (KA OR KI PROCESSOR).
- C
- C DATA RMACH(1) / "000400000000 /
- C DATA RMACH(2) / "377777777777 /
- C DATA RMACH(3) / "146400000000 /
- C DATA RMACH(4) / "147400000000 /
- C DATA RMACH(5) / "177464202324 /
- C
- C MACHINE CONSTANTS FOR PDP-11 FORTRAN SUPPORTING
- C 32-BIT INTEGERS (EXPRESSED IN INTEGER AND OCTAL).
- C
- C DATA SMALL(1) / 8388608 /
- C DATA LARGE(1) / 2147483647 /
- C DATA RIGHT(1) / 880803840 /
- C DATA DIVER(1) / 889192448 /
- C DATA LOG10(1) / 1067065499 /
- C
- C DATA RMACH(1) / O00040000000 /
- C DATA RMACH(2) / O17777777777 /
- C DATA RMACH(3) / O06440000000 /
- C DATA RMACH(4) / O06500000000 /
- C DATA RMACH(5) / O07746420233 /
- C
- C MACHINE CONSTANTS FOR PDP-11 FORTRAN SUPPORTING
- C 16-BIT INTEGERS (EXPRESSED IN INTEGER AND OCTAL).
- C
- C DATA SMALL(1),SMALL(2) / 128, 0 /
- C DATA LARGE(1),LARGE(2) / 32767, -1 /
- C DATA RIGHT(1),RIGHT(2) / 13440, 0 /
- C DATA DIVER(1),DIVER(2) / 13568, 0 /
- C DATA LOG10(1),LOG10(2) / 16282, 8347 /
- C
- C DATA SMALL(1),SMALL(2) / O000200, O000000 /
- C DATA LARGE(1),LARGE(2) / O077777, O177777 /
- C DATA RIGHT(1),RIGHT(2) / O032200, O000000 /
- C DATA DIVER(1),DIVER(2) / O032400, O000000 /
- C DATA LOG10(1),LOG10(2) / O037632, O020233 /
- C
- C MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES.
- C
- C DATA RMACH(1) / O000400000000 /
- C DATA RMACH(2) / O377777777777 /
- C DATA RMACH(3) / O146400000000 /
- C DATA RMACH(4) / O147400000000 /
- C DATA RMACH(5) / O177464202324 /
- C
- C MACHINE CONSTANTS FOR THE VAX 11/780
- C (EXPRESSED IN INTEGER AND HEXADECIMAL)
- C ***THE HEX FORMAT BELOW MAY NOT BE SUITABLE FOR UNIX SYSTEMS***
- C *** THE INTEGER FORMAT SHOULD BE OK FOR UNIX SYSTEMS***
- C
- C DATA SMALL(1) / 128 /
- C DATA LARGE(1) / -32769 /
- C DATA RIGHT(1) / 13440 /
- C DATA DIVER(1) / 13568 /
- C DATA LOG10(1) / 547045274 /
- C
- C DATA SMALL(1) / Z00000080 /
- C DATA LARGE(1) / ZFFFF7FFF /
- C DATA RIGHT(1) / Z00003480 /
- C DATA DIVER(1) / Z00003500 /
- C DATA LOG10(1) / Z209B3F9A /
- C
- C***FIRST EXECUTABLE STATEMENT R1MACH
- C
- R1MACH = RMACH(I)
- RETURN
- C
- END
- 3 DL1BL3= BLISS VOL II P.294... ALL DATA
- 60 1 5.0
- (1X,F6.3,F3.0,2F6.3)
- 125 1 300 402
- 164 1 156 258
- -065 1 401 503
- 120 1 137 239
- 034 1 214 316
- 010 1 084 186
- -079 1 137 239
- -533 1 031 133 X
- -611 1 227 329 X
- 076 1 092 194
- 319 1 427 228
- 465 1 487 288
- 313 1 487 288
- 193 1 487 288
- 129 1 589 390
- 209 1 571 372
- 284 1 446 247
- 173 1 570 371
- 264 1 472 273
- 132 1 476 277
- 324 1 696 321
- 367 1 729 354
- 321 1 509 134
- 375 1 559 184
- 345 1 679 304
- 341 1 583 208
- 327 1 742 367
- 256 1 781 406
- 256 1 739 364
- 214 1 865 490
- 501 1 723 223
- 318 1 940 440
- 317 1 903 403
- 349 1 910 410
- 402 1 684 184
- 374 1 904 404
- 340 1 887 387
- 598 1 593 093
- 444 1 640 140
- 543 1 512 012
- 559 1 832 156
- 705 1 817 141
- 585 1 881 205
- 588 1 848 172
- 532 1 857 181
- 593 1 808 132
- 593 1 829 153
- 559 1 872 196
- 611 1 805 129
- 561 1 904 228
- 561 1 1047 246
- 733 1 942 141
- 553 1 1194 393
- 593 1 1090 289
- 525 1 1000 199
- 580 1 1054 253
- 711 1 956 155
- 546 1 1101 300
- 632 1 1060 259
- 733 1 893 092
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 3 DL1BL3= BLISS VOL II P.294... ALL DATA
- PROBLEM TITLE DL1BL3= BLISS VOL II P.294... ALL DATA
- NUMBER OF OBSERVATION= 60
- NUMBER OF PARAMETERS= 3
- MINIMUM NUMBER OF PARAMETERS CONSIDERED= 1
- PERCENTAGE DEVIATION FROM OPTIMALITY ALLOWED= 5.00
- **BEST SUBSET LAV PROGRAM
- IFAULT= 0
-
-
- BEST RESULTS FOR LAV SUBSET OF SIZE= 1
- **************SUM OF ABSOLUTE VALUES= 7.659
-
- BETA( 2) .550
-
-
- BEST RESULTS FOR LAV SUBSET OF SIZE= 2
- **************SUM OF ABSOLUTE VALUES= 5.407
-
- BETA( 2) .818
-
- BETA( 3) -.782
-
-
- BEST RESULTS FOR LAV SUBSET OF SIZE= 3
- **************SUM OF ABSOLUTE VALUES= 3.877
-
- BETA( 3) -1.116
-
- BETA( 2) .628
-
- BETA( 1) .235
-
-
- ITERATION COUNT= 106
- 0
-