123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379 |
- *DECK DPOPT
- SUBROUTINE DPOPT (PRGOPT, MRELAS, NVARS, INFO, CSC, IBASIS, ROPT,
- + INTOPT, LOPT)
- C***BEGIN PROLOGUE DPOPT
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to DSPLP
- C***LIBRARY SLATEC
- C***TYPE DOUBLE PRECISION (SPOPT-S, DPOPT-D)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C THE EDITING REQUIRED TO CONVERT THIS SUBROUTINE FROM SINGLE TO
- C DOUBLE PRECISION INVOLVES THE FOLLOWING CHARACTER STRING CHANGES.
- C
- C USE AN EDITING COMMAND (CHANGE) /STRING-1/(TO)STRING-2/.
- C /REAL (12 BLANKS)/DOUBLE PRECISION/,/R1MACH/D1MACH/,/E0/D0/
- C
- C REVISED 821122-1045
- C REVISED YYMMDD-HHMM
- C
- C THIS SUBROUTINE PROCESSES THE OPTION VECTOR, PRGOPT(*),
- C AND VALIDATES ANY MODIFIED DATA.
- C
- C***SEE ALSO DSPLP
- C***ROUTINES CALLED D1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 811215 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890605 Removed unreferenced labels. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
- C 900328 Added TYPE section. (WRB)
- C 900510 Fixed an error message. (RWC)
- C***END PROLOGUE DPOPT
- DOUBLE PRECISION ABIG,ASMALL,COSTSC,CSC(*),EPS,ONE,PRGOPT(*),
- * ROPT(07),TOLLS,TUNE,ZERO,D1MACH,TOLABS
- INTEGER IBASIS(*),INTOPT(08)
- LOGICAL CONTIN,USRBAS,SIZEUP,SAVEDT,COLSCP,CSTSCP,MINPRB,
- * STPEDG,LOPT(8)
- C
- C***FIRST EXECUTABLE STATEMENT DPOPT
- IOPT=1
- ZERO=0.D0
- ONE=1.D0
- GO TO 30001
- 20002 CONTINUE
- GO TO 30002
- C
- 20003 LOPT(1)=CONTIN
- LOPT(2)=USRBAS
- LOPT(3)=SIZEUP
- LOPT(4)=SAVEDT
- LOPT(5)=COLSCP
- LOPT(6)=CSTSCP
- LOPT(7)=MINPRB
- LOPT(8)=STPEDG
- C
- INTOPT(1)=IDG
- INTOPT(2)=IPAGEF
- INTOPT(3)=ISAVE
- INTOPT(4)=MXITLP
- INTOPT(5)=KPRINT
- INTOPT(6)=ITBRC
- INTOPT(7)=NPP
- INTOPT(8)=LPRG
- C
- ROPT(1)=EPS
- ROPT(2)=ASMALL
- ROPT(3)=ABIG
- ROPT(4)=COSTSC
- ROPT(5)=TOLLS
- ROPT(6)=TUNE
- ROPT(7)=TOLABS
- RETURN
- C
- C
- C PROCEDURE (INITIALIZE PARAMETERS AND PROCESS USER OPTIONS)
- 30001 CONTIN = .FALSE.
- USRBAS = .FALSE.
- SIZEUP = .FALSE.
- SAVEDT = .FALSE.
- COLSCP = .FALSE.
- CSTSCP = .FALSE.
- MINPRB = .TRUE.
- STPEDG = .TRUE.
- C
- C GET THE MACHINE REL. FLOATING POINT ACCURACY VALUE FROM THE
- C LIBRARY SUBPROGRAM, D1MACH( ).
- EPS=D1MACH(4)
- TOLLS=D1MACH(4)
- TUNE=ONE
- TOLABS=ZERO
- C
- C DEFINE NOMINAL FILE NUMBERS FOR MATRIX PAGES AND DATA SAVING.
- IPAGEF=1
- ISAVE=2
- ITBRC=10
- MXITLP=3*(NVARS+MRELAS)
- KPRINT=0
- IDG=-4
- NPP=NVARS
- LPRG=0
- C
- LAST = 1
- IADBIG=10000
- ICTMAX=1000
- ICTOPT= 0
- 20004 NEXT=PRGOPT(LAST)
- IF (.NOT.(NEXT.LE.0 .OR. NEXT.GT.IADBIG)) GO TO 20006
- C
- C THE CHECKS FOR SMALL OR LARGE VALUES OF NEXT ARE TO PREVENT
- C WORKING WITH UNDEFINED DATA.
- NERR=14
- CALL XERMSG ('SLATEC', 'DPOPT',
- + 'IN DSPLP, THE USER OPTION ARRAY HAS UNDEFINED DATA.', NERR,
- + IOPT)
- INFO=-NERR
- RETURN
- 20006 IF (.NOT.(NEXT.EQ.1)) GO TO 10001
- GO TO 20005
- 10001 IF (.NOT.(ICTOPT.GT.ICTMAX)) GO TO 10002
- NERR=15
- CALL XERMSG ('SLATEC', 'DPOPT',
- + 'IN DSPLP, OPTION ARRAY PROCESSING IS CYCLING.', NERR, IOPT)
- INFO=-NERR
- RETURN
- 10002 CONTINUE
- KEY = PRGOPT(LAST+1)
- C
- C IF KEY = 50, THIS IS TO BE A MAXIMIZATION PROBLEM
- C INSTEAD OF A MINIMIZATION PROBLEM.
- IF (.NOT.(KEY.EQ.50)) GO TO 20010
- MINPRB = PRGOPT(LAST+2).EQ.ZERO
- LDS=3
- GO TO 20009
- 20010 CONTINUE
- C
- C IF KEY = 51, THE LEVEL OF OUTPUT IS BEING MODIFIED.
- C KPRINT = 0, NO OUTPUT
- C = 1, SUMMARY OUTPUT
- C = 2, LOTS OF OUTPUT
- C = 3, EVEN MORE OUTPUT
- IF (.NOT.(KEY.EQ.51)) GO TO 20013
- KPRINT=PRGOPT(LAST+2)
- LDS=3
- GO TO 20009
- 20013 CONTINUE
- C
- C IF KEY = 52, REDEFINE THE FORMAT AND PRECISION USED
- C IN THE OUTPUT.
- IF (.NOT.(KEY.EQ.52)) GO TO 20016
- IF (PRGOPT(LAST+2).NE.ZERO) IDG=PRGOPT(LAST+3)
- LDS=4
- GO TO 20009
- 20016 CONTINUE
- C
- C IF KEY = 53, THE ALLOTTED SPACE FOR THE SPARSE MATRIX
- C STORAGE AND/OR SPARSE EQUATION SOLVING HAS BEEN CHANGED.
- C (PROCESSED IN DSPLP(). THIS IS TO COMPUTE THE LENGTH OF PRGOPT(*).)
- IF (.NOT.(KEY.EQ.53)) GO TO 20019
- LDS=5
- GO TO 20009
- 20019 CONTINUE
- C
- C IF KEY = 54, REDEFINE THE FILE NUMBER WHERE THE PAGES
- C FOR THE SPARSE MATRIX ARE STORED.
- IF (.NOT.(KEY.EQ.54)) GO TO 20022
- IF(PRGOPT(LAST+2).NE.ZERO) IPAGEF = PRGOPT(LAST+3)
- LDS=4
- GO TO 20009
- 20022 CONTINUE
- C
- C IF KEY = 55, A CONTINUATION FOR A PROBLEM MAY BE REQUESTED.
- IF (.NOT.(KEY .EQ. 55)) GO TO 20025
- CONTIN = PRGOPT(LAST+2).NE.ZERO
- LDS=3
- GO TO 20009
- 20025 CONTINUE
- C
- C IF KEY = 56, REDEFINE THE FILE NUMBER WHERE THE SAVED DATA
- C WILL BE STORED.
- IF (.NOT.(KEY.EQ.56)) GO TO 20028
- IF(PRGOPT(LAST+2).NE.ZERO) ISAVE = PRGOPT(LAST+3)
- LDS=4
- GO TO 20009
- 20028 CONTINUE
- C
- C IF KEY = 57, SAVE DATA (ON EXTERNAL FILE) AT MXITLP ITERATIONS OR
- C THE OPTIMUM, WHICHEVER COMES FIRST.
- IF (.NOT.(KEY.EQ.57)) GO TO 20031
- SAVEDT=PRGOPT(LAST+2).NE.ZERO
- LDS=3
- GO TO 20009
- 20031 CONTINUE
- C
- C IF KEY = 58, SEE IF PROBLEM IS TO RUN ONLY A GIVEN
- C NUMBER OF ITERATIONS.
- IF (.NOT.(KEY.EQ.58)) GO TO 20034
- IF (PRGOPT(LAST+2).NE.ZERO) MXITLP = PRGOPT(LAST+3)
- LDS=4
- GO TO 20009
- 20034 CONTINUE
- C
- C IF KEY = 59, SEE IF USER PROVIDES THE BASIS INDICES.
- IF (.NOT.(KEY .EQ. 59)) GO TO 20037
- USRBAS = PRGOPT(LAST+2) .NE. ZERO
- IF (.NOT.(USRBAS)) GO TO 20040
- I=1
- N20043=MRELAS
- GO TO 20044
- 20043 I=I+1
- 20044 IF ((N20043-I).LT.0) GO TO 20045
- IBASIS(I) = PRGOPT(LAST+2+I)
- GO TO 20043
- 20045 CONTINUE
- 20040 CONTINUE
- LDS=MRELAS+3
- GO TO 20009
- 20037 CONTINUE
- C
- C IF KEY = 60, SEE IF USER HAS PROVIDED SCALING OF COLUMNS.
- IF (.NOT.(KEY .EQ. 60)) GO TO 20047
- COLSCP = PRGOPT(LAST+2).NE.ZERO
- IF (.NOT.(COLSCP)) GO TO 20050
- J=1
- N20053=NVARS
- GO TO 20054
- 20053 J=J+1
- 20054 IF ((N20053-J).LT.0) GO TO 20055
- CSC(J)=ABS(PRGOPT(LAST+2+J))
- GO TO 20053
- 20055 CONTINUE
- 20050 CONTINUE
- LDS=NVARS+3
- GO TO 20009
- 20047 CONTINUE
- C
- C IF KEY = 61, SEE IF USER HAS PROVIDED SCALING OF COSTS.
- IF (.NOT.(KEY .EQ. 61)) GO TO 20057
- CSTSCP = PRGOPT(LAST+2).NE.ZERO
- IF (CSTSCP) COSTSC = PRGOPT(LAST+3)
- LDS=4
- GO TO 20009
- 20057 CONTINUE
- C
- C IF KEY = 62, SEE IF SIZE PARAMETERS ARE PROVIDED WITH THE DATA.
- C THESE WILL BE CHECKED AGAINST THE MATRIX ELEMENT SIZES LATER.
- IF (.NOT.(KEY .EQ. 62)) GO TO 20060
- SIZEUP = PRGOPT(LAST+2).NE.ZERO
- IF (.NOT.(SIZEUP)) GO TO 20063
- ASMALL = PRGOPT(LAST+3)
- ABIG = PRGOPT(LAST+4)
- 20063 CONTINUE
- LDS=5
- GO TO 20009
- 20060 CONTINUE
- C
- C IF KEY = 63, SEE IF TOLERANCE FOR LINEAR SYSTEM RESIDUAL ERROR IS
- C PROVIDED.
- IF (.NOT.(KEY .EQ. 63)) GO TO 20066
- IF (PRGOPT(LAST+2).NE.ZERO) TOLLS = MAX(EPS,PRGOPT(LAST+3))
- LDS=4
- GO TO 20009
- 20066 CONTINUE
- C
- C IF KEY = 64, SEE IF MINIMUM REDUCED COST OR STEEPEST EDGE
- C DESCENT IS TO BE USED FOR SELECTING VARIABLES TO ENTER BASIS.
- IF (.NOT.(KEY.EQ.64)) GO TO 20069
- STPEDG = PRGOPT(LAST+2).EQ.ZERO
- LDS=3
- GO TO 20009
- 20069 CONTINUE
- C
- C IF KEY = 65, SET THE NUMBER OF ITERATIONS BETWEEN RECALCULATING
- C THE ERROR IN THE PRIMAL SOLUTION.
- IF (.NOT.(KEY.EQ.65)) GO TO 20072
- IF (PRGOPT(LAST+2).NE.ZERO) ITBRC=MAX(ONE,PRGOPT(LAST+3))
- LDS=4
- GO TO 20009
- 20072 CONTINUE
- C
- C IF KEY = 66, SET THE NUMBER OF NEGATIVE REDUCED COSTS TO BE FOUND
- C IN THE PARTIAL PRICING STRATEGY.
- IF (.NOT.(KEY.EQ.66)) GO TO 20075
- IF (.NOT.(PRGOPT(LAST+2).NE.ZERO)) GO TO 20078
- NPP=MAX(PRGOPT(LAST+3),ONE)
- NPP=MIN(NPP,NVARS)
- 20078 CONTINUE
- LDS=4
- GO TO 20009
- 20075 CONTINUE
- C IF KEY = 67, CHANGE THE TUNING PARAMETER TO APPLY TO THE ERROR
- C ESTIMATES FOR THE PRIMAL AND DUAL SYSTEMS.
- IF (.NOT.(KEY.EQ.67)) GO TO 20081
- IF (.NOT.(PRGOPT(LAST+2).NE.ZERO)) GO TO 20084
- TUNE=ABS(PRGOPT(LAST+3))
- 20084 CONTINUE
- LDS=4
- GO TO 20009
- 20081 CONTINUE
- IF (.NOT.(KEY.EQ.68)) GO TO 20087
- LDS=6
- GO TO 20009
- 20087 CONTINUE
- C
- C RESET THE ABSOLUTE TOLERANCE TO BE USED ON THE FEASIBILITY
- C DECISION PROVIDED THE RELATIVE ERROR TEST FAILED.
- IF (.NOT.(KEY.EQ.69)) GO TO 20090
- IF(PRGOPT(LAST+2).NE.ZERO)TOLABS=PRGOPT(LAST+3)
- LDS=4
- GO TO 20009
- 20090 CONTINUE
- CONTINUE
- C
- 20009 ICTOPT = ICTOPT+1
- LAST = NEXT
- LPRG=LPRG+LDS
- GO TO 20004
- 20005 CONTINUE
- GO TO 20002
- C
- C PROCEDURE (VALIDATE OPTIONALLY MODIFIED DATA)
- C
- C IF USER HAS DEFINED THE BASIS, CHECK FOR VALIDITY OF INDICES.
- 30002 IF (.NOT.(USRBAS)) GO TO 20093
- I=1
- N20096=MRELAS
- GO TO 20097
- 20096 I=I+1
- 20097 IF ((N20096-I).LT.0) GO TO 20098
- ITEST=IBASIS(I)
- IF (.NOT.(ITEST.LE.0 .OR.ITEST.GT.(NVARS+MRELAS))) GO TO 20100
- NERR=16
- CALL XERMSG ('SLATEC', 'DPOPT',
- + 'IN DSPLP, AN INDEX OF USER-SUPPLIED BASIS IS OUT OF RANGE.',
- + NERR, IOPT)
- INFO=-NERR
- RETURN
- 20100 CONTINUE
- GO TO 20096
- 20098 CONTINUE
- 20093 CONTINUE
- C
- C IF USER HAS PROVIDED SIZE PARAMETERS, MAKE SURE THEY ARE ORDERED
- C AND POSITIVE.
- IF (.NOT.(SIZEUP)) GO TO 20103
- IF (.NOT.(ASMALL.LE.ZERO .OR. ABIG.LT.ASMALL)) GO TO 20106
- NERR=17
- CALL XERMSG ('SLATEC', 'DPOPT',
- + 'IN DSPLP, SIZE PARAMETERS FOR MATRIX MUST BE SMALLEST AND ' //
- + 'LARGEST MAGNITUDES OF NONZERO ENTRIES.', NERR, IOPT)
- INFO=-NERR
- RETURN
- 20106 CONTINUE
- 20103 CONTINUE
- C
- C THE NUMBER OF ITERATIONS OF REV. SIMPLEX STEPS MUST BE POSITIVE.
- IF (.NOT.(MXITLP.LE.0)) GO TO 20109
- NERR=18
- CALL XERMSG ('SLATEC', 'DPOPT',
- + 'IN DSPLP, THE NUMBER OF REVISED SIMPLEX STEPS BETWEEN ' //
- + 'CHECK-POINTS MUST BE POSITIVE.', NERR, IOPT)
- INFO=-NERR
- RETURN
- 20109 CONTINUE
- C
- C CHECK THAT SAVE AND PAGE FILE NUMBERS ARE DEFINED AND NOT EQUAL.
- IF (.NOT.(ISAVE.LE.0.OR.IPAGEF.LE.0.OR.(ISAVE.EQ.IPAGEF))) GO TO 2
- *0112
- NERR=19
- CALL XERMSG ('SLATEC', 'DPOPT',
- + 'IN DSPLP, FILE NUMBERS FOR SAVED DATA AND MATRIX PAGES ' //
- + 'MUST BE POSITIVE AND NOT EQUAL.', NERR, IOPT)
- INFO=-NERR
- RETURN
- 20112 CONTINUE
- CONTINUE
- GO TO 20003
- END
|