Hello: Attached to this email are the computer codes associated with Computational Optimization and Applications paper COAP93018 by John W. Chinneck, entitled "Analyzing Infeasible Nonlinear Programs". There are four distinct files, all for DOS, entitled README, MIS.FOR, MIS.BAT and DRUD2.FOR. The appropriate places to cut and paste are marked below. README follows ------------------------------------------- March 31, 1994 John W. Chinneck Systems and Computer Engineering Carleton University Ottawa, Ontario K1S 5B6 Canada telephone: (613) 788-5733 email: chinneck@sce.carleton.ca AN INTRODUCTION TO THE LSGRG(MIS) SOFTWARE ------------------------------------------ LSGRG(MIS) is experimental software written to support the research reported in the Computational Optimization and Applications paper entitled "Analyzing Infeasible Nonlinear Programs". Experimental software comes without guarantees, but it is free. I would like to hear from users with suggestions, comments, example problems, etc. Note first that LSGRG(MIS) requires the use of the LSGRG software written and distributed by Leon Lasdon and Stuart Smith. For more information on LSGRG, see their article in the ORSA Journal on Computing, vol. 4, no. 1, winter 1992, entitled "Solving Large Sparse Nonlinear Programs Using GRG". You can also try to contact the authors via email using: Lasdon: lasdon@utxvm.bitnet Smith: shsmith@midas.mgmt.purdue.edu LSGRG itself must be obtained directly from Lasdon or Smith and is not included in the package of software in this library. LSGRG(MIS) consists of LSGRG itself, together with my routine GRGMIS (in the file MIS.FOR in this library). To use LSGRG(MIS), simply use LSGRG in subroutine call mode as per the LSGRG instructions, but replace any calls to GRGSUB with a call to GRGMIS. GRGMIS manages the repeated calls to GRGSUB that are needed to implement the deletion filtering algorithm. LSGRG(MIS) also requires a way to recover from mathematical errors which cause the software to crash. Such errors may be introduced as a byproduct of the deletion filter. LSGRG(MIS) recovers from such errors by (i) writing status files as it analyzes the infeasible NLP, (ii) making system calls from within the GRGMIS routine to determine the existence of these status files and to manipulate them, and (iii) using a batch file to control the process of recovery from a crash. Naturally, the system calls and batch file are compiler and operating system dependent. The software provided here is for the DOS operating system and for the Lahey fortran compiler. The batch file is called MIS.BAT, and should be edited to provide the path names appropriate to your system. Here is a summary of the contents of the four files provided through this library: README: this file. MIS.FOR: the core LSGRG(MIS) routine called GRGMIS. DRUD2.FOR: a main calling routine and GCOMP problem subroutine for a small example of an infeasible NLP. MIS.BAT: a DOS batch file managing the process of problem setup and restart. MIS.FOR follows--------------------------------------------- SUBROUTINE GRGMIS(INPRNT,OTPRNT,NCORE,NNVARS,NFUN,MAXBAS, 1 MAXHES,NNOBJ,TTITLE,LVARS,BLVAR,BUVAR,BLCON,BUCON,DEFAUL,FPNEWT, 2 FPINIT,FPSTOP,FPSPIV,PPH1EP,NNSTOP,IITLIM,LLMSER,IIPR,IIPN4, 3 IIPN5,IIPN6,IIPER,PPSTEP,IIQUAD,LDERIV,MMODCG, 4 RAMCON,RAMVAR,AIJTOL,PIVPCT,MXTABU,FFUNPR,CONDTL,IDEGLM, 5 FPBOUN,FPDEG,IISCAL,IISCLG,IMEMCG,IIBVBL,XX,FCNS,INBIND,RMULTS, 6 NONBAS,REDGR,NBIND,NNONB,INFORM,Z) *JWC----------------------------------------------------------------- * August 1992. This is the modified calling routine for the * LSGRG subroutine interface. This version assumes control in * the event that the model is infeasible and goes on to locate * the MIS causing the problem. Written by: * John W. Chinneck * Systems and Computer Engineering * Carleton University * Ottawa, Ontario K1Y 3S1 * CANADA * telephone: (613) 788-5733 * email: chinneck@sce.carleton.ca * Revised March 1993 to handle the case where removal of a * constraint causes a mathematical error, such as sqrt(-1). *-------------------------------------------------------------------- C ...................................................................... C ............................COMMON DECLARATIONS....................... C ...................................................................... INTEGER M,N,MP1,NPMP1,NBMAX,NNBMAX,NPNBMX,MPNBMX,NRTOT COMMON /DIMEN/ M,N,MP1,NPMP1,NBMAX,NNBMAX,NPNBMX,MPNBMX,NRTOT C INTEGER KX,KG,KALB,KUB,KICAND,KISTAT,KVSTAT COMMON /DYNAM1/ KX,KG,KALB,KUB,KICAND,KISTAT,KVSTAT C INTEGER KU,KGRADF,KIBC,KIBV,KINBV,KIUB,KIBVB COMMON /DYNAM2/ KU,KGRADF,KIBC,KIBV,KINBV,KIUB,KIBVB C INTEGER KR,KV,KD,KGBEST,KXBEST,KXB1,KXB2,KXB3 COMMON /DYNAM3/ KR,KV,KD,KGBEST,KXBEST,KXB1,KXB2,KXB3 C INTEGER KDBND,KXSTAT,KGG,KRR,KY,KGRADP COMMON /DYNAM4/ KDBND,KXSTAT,KGG,KRR,KY,KGRADP C INTEGER KROWB,KCOLB,KICOLS,KYCG,KSCG,KCGSCR COMMON /DYNAM5/ KROWB,KCOLB,KICOLS,KYCG,KSCG,KCGSCR C INTEGER KX0,KG0,KINBVP,KASCAL,KALBO,KUBO COMMON /DYNAM6/ KX0,KG0,KINBVP,KASCAL,KALBO,KUBO C INTEGER KBMAP,KINLIN,KIRANK,KCDNUM,KINBLD,KTABU,KLKSAM COMMON /DYNAM7/ KBMAP,KINLIN,KIRANK,KCDNUM,KINBLD,KTABU,KLKSAM C INTEGER KGRAD,KHAG,KHEG,KHEGL,KZMEM COMMON /DYNAM8/ KGRAD,KHAG,KHEG,KHEGL,KZMEM C INTEGER NLIN,NNLIN,NFIX COMMON /LINCNT/ NLIN,NNLIN,NFIX C INTEGER NVARS,NROWS,MAXR,MAXB,MAXTBU,MAXCG COMMON /SIZES/ NVARS,NROWS,MAXR,MAXB,MAXTBU,MAXCG C DOUBLE PRECISION EPS,PLINFY,PLZERO,TOLX,TOLZ COMMON /TOLS/ EPS,PLINFY,PLZERO,TOLX,TOLZ C INTEGER INFO COMMON /INFBK/ INFO C CHARACTER*76 TITLE COMMON /INOUT/ TITLE C INTEGER INIT,LASTCL COMMON /INITBK/ INIT,LASTCL C INTEGER IOIN,IOOUT,IODUMP,IOERR,IOTERM COMMON /IOUNIT/ IOIN,IOOUT,IODUMP,IOERR,IOTERM C INTEGER NB,NOBJ,NINF,NSUPER,IPR3,NCAND,IPR COMMON /NINTBK/ NB,NOBJ,NINF,NSUPER,IPR3,NCAND,IPR C INTEGER NBC, NNBC COMMON /BIND/ NBC, NNBC C INTEGER LASTZ LOGICAL GALLOC,GETSIZ COMMON /SETIN/ LASTZ, GALLOC,GETSIZ C LOGICAL MAXIM COMMON /MAXBK/ MAXIM C LOGICAL DEBUG COMMON/DBUG/ DEBUG C DOUBLE PRECISION PSTEP,FUNPR COMMON /STEPBK/ PSTEP,FUNPR C C C C ...................................................................... C ............................ARGUMENT DECLARATIONS..................... C ...................................................................... LOGICAL INPRNT,OTPRNT DOUBLE PRECISION BLVAR(NNVARS),BUVAR(NNVARS) DOUBLE PRECISION BLCON(NFUN),BUCON(NFUN),DEFAUL(37),FPNEWT DOUBLE PRECISION FPINIT,FPSTOP,FPSPIV,PPH1EP,AIJTOL,PIVPCT DOUBLE PRECISION FFUNPR,CONDTL,FPBOUN,FPDEG,XX(NNVARS),FCNS(NFUN) DOUBLE PRECISION RMULTS(MAXBAS),REDGR(NNVARS),Z(NCORE),PPSTEP INTEGER NCORE,NNVARS,NFUN,MAXBAS,MAXHES,NNOBJ,NNSTOP,IITLIM,LLMSER INTEGER IIPR,IIPN4,IIPN5,IIPN6,IIPER,IIQUAD,LDERIV,MMODCG INTEGER INBIND(MAXBAS),NONBAS(NNVARS),NBIND,NNONB,INFORM INTEGER LVARS(1),MXTABU,IDEGLM,IISCAL,IMEMCG,IIBVBL CHARACTER*8 RAMCON(NFUN), RAMVAR(NNVARS) CHARACTER*76 TTITLE C C ...................................................................... C ............................LOCAL DECLARATIONS....................... C ...................................................................... C REAL*8 ZSTART INTEGER I,J,L,INEED,IEND,ITIPR3,NINDEX,IRS INTEGER KVAR,KCON,IGTSUB LOGICAL USENAM C C ...................................................................... *JWC Declarations needed for MIS localization. INTEGER MISOUT LOGICAL MISON COMMON/MIS/MISOUT,MISON INTEGER*2 COSTAT(1000),IHHOLD DOUBLE PRECISION XXO(500),BLVARO(500),BUVARO(500) DOUBLE PRECISION BLCONO(500),BUCONO(500) INTEGER COLEN,VARLEN,CONLEN DATA COLEN/1000/,VARLEN/500/,CONLEN/500/ CHARACTER*8 CTEMP CHARACTER*10 CFEAS CHARACTER*3 CROCOL CHARACTER*5 CSENSE INTEGER IHOLD1,IHOLD2 LOGICAL MISSW,IFLAG DATA MISSW/.TRUE./ DOUBLE PRECISION INFLIM DATA INFLIM/1.D29/ LOGICAL LDEREV,LLOG,LDEBUG,LNOERR DATA LDEREV/.TRUE./,LLOG/.TRUE./,LDEBUG/.FALSE./,LNOERR/.TRUE./ INTEGER CURR,CURRX,CURRDV,CURRDB,CURRIN INTEGER NTOT NTOT=NNVARS+NFUN LOGICAL LRSTRT,LVARB,LLOWR INTEGER IDNUM *.................................................................... PLINFY=1.D31 MISON=.FALSE. MISOUT = 3 OPEN(UNIT=MISOUT,FILE='LSGRG.MIS',STATUS='UNKNOWN') MRKR = 11 IRLXD = 12 IGUARD = 13 *JWC Check to see whether this is a restart. If yes, then update * bounds and counters, reposition the PRN and MIS files, and * restart at the appropriate spot. LRSTRT=.FALSE. INQUIRE (FILE='MARKER',EXIST=LRSTRT) OPEN(UNIT=MRKR,FILE='MARKER',STATUS='UNKNOWN', 1 FORM='UNFORMATTED') OPEN(UNIT=IRLXD,FILE='RELAXED',STATUS='UNKNOWN', 1 FORM='UNFORMATTED') OPEN(UNIT=IGUARD,FILE='GUARDS',STATUS='UNKNOWN', 1 FORM='UNFORMATTED') IF(LRSTRT) THEN * *JWC Reposition the files. * 630 READ(MISOUT,FMT=631,END=632) CROCOL 631 FORMAT(A3) GOTO 630 632 READ (IGUARD,END=633) LVARB,IHOLD1,IHOLD2 GOTO 632 * 633 MISON=.TRUE. DEFAUL(37)=0.D0 REWIND(MRKR) REWIND(IRLXD) REWIND(IGUARD) 500 READ(IRLXD,END=20) LVARB,LLOWR,IDNUM IF (LVARB) THEN IF(LLOWR) THEN BLVAR(IDNUM)=-PLINFY ELSE BUVAR(IDNUM)=PLINFY ENDIF ELSE IF(LLOWR) THEN BLCON(IDNUM)=-PLINFY ELSE BUCON(IDNUM)=PLINFY ENDIF ENDIF GOTO 500 ENDIF *JWC Check that arrays to capture the original data are big enough. IF(COLEN.LT.NTOT) THEN CTEMP='COSTAT' IHOLD1=COLEN IHOLD2=NTOT GOTO 10 ENDIF IF(VARLEN.LT.NNVARS) THEN CTEMP='Variable' IHOLD1=VARLEN IHOLD2=NNVARS GOTO 10 ENDIF IF(CONLEN.LT.NFUN) THEN CTEMP='Row' IHOLD1=CONLEN IHOLD2=NFUN GOTO 10 ENDIF GOTO 20 10 WRITE(IOOUT,15) CTEMP,IHOLD1,IHOLD2 15 FORMAT(/,1X,A8,' arrays size ',I5,' too small. At least ',I5, + ' needed.',/,' MIS localization disabled.',/) MISSW=.FALSE. GOTO 100 20 CONTINUE *JWC Capture the initial set of bounds and the original point and * establish the initial values of COSTAT. COSTAT values are * 0: no bounds remain in model * 1: only lower bound remains in model * 2: only upper bound remains in model * 3: both bounds remain in model and are distinct * 4: both bounds remain in model and are identical DO 30 I=1,NNVARS XXO(I)=XX(I) BLVARO(I)=BLVAR(I) BUVARO(I)=BUVAR(I) COSTAT(I)=0 IF(BLVARO(I).GE.-INFLIM) COSTAT(I)=COSTAT(I)+1 IF(BUVARO(I).LE.INFLIM) COSTAT(I)=COSTAT(I)+2 IF((COSTAT(I).EQ.3).AND.(BLVARO(I).EQ.BUVARO(I))) COSTAT(I)=4 30 CONTINUE DO 40 I=1,NFUN BLCONO(I)=BLCON(I) BUCONO(I)=BUCON(I) IHOLD1=NNVARS+I COSTAT(IHOLD1)=0 IF(BLCONO(I).GE.-INFLIM) COSTAT(IHOLD1)=COSTAT(IHOLD1)+1 IF(BUCONO(I).LE.INFLIM) COSTAT(IHOLD1)=COSTAT(IHOLD1)+2 IF((COSTAT(IHOLD1).EQ.3).AND.(BLCONO(I).EQ.BUCONO(I))) + COSTAT(IHOLD1)=4 40 CONTINUE IF(LDEBUG) THEN WRITE(MISOUT,2010) 2010 FORMAT(/,' ORIGINAL COSTAT VALUES AND VARIABLE BOUNDS:') DO 2020 I=1,NTOT IF(I.LE.NNVARS) THEN WRITE(MISOUT,2015) I,COSTAT(I),BLVARO(I),BUVARO(I) ELSE WRITE(MISOUT,2015) I,COSTAT(I),BLCONO(I-NNVARS), + BUCONO(I-NNVARS) 2015 FORMAT(1X,I3,1X,I3,2(1X,D12.4)) ENDIF 2020 CONTINUE ENDIF IF(LRSTRT) GOTO 620 100 CALL GRGSUB(INPRNT,OTPRNT,NCORE,NNVARS,NFUN,MAXBAS, 1 MAXHES,NNOBJ,TTITLE,LVARS,BLVAR,BUVAR,BLCON,BUCON,DEFAUL,FPNEWT, 2 FPINIT,FPSTOP,FPSPIV,PPH1EP,NNSTOP,IITLIM,LLMSER,IIPR,IIPN4, 3 IIPN5,IIPN6,IIPER,PPSTEP,IIQUAD,LDERIV,MMODCG, 4 RAMCON,RAMVAR,AIJTOL,PIVPCT,MXTABU,FFUNPR,CONDTL,IDEGLM, 5 FPBOUN,FPDEG,IISCAL,IISCLG,IMEMCG,IIBVBL,XX,FCNS,INBIND,RMULTS, 6 NONBAS,REDGR,NBIND,NNONB,INFORM,Z) IF(INFORM.NE.5) THEN CALL SYSTEM('ERASE LSGRG.MIS') RETURN ENDIF IF(.NOT.MISSW) THEN CALL SYSTEM('ERASE LSGRG.MIS') RETURN ENDIF *JWC----------------------------------------------------------------- * No feasible point found for the original model, so look for a * Minimal Intractable Set of constraints. 620 MISON=.TRUE. DEFAUL(37)=0.D0 *JWC Turn off the report printing INPRNT=.FALSE. OTPRNT=.FALSE. PPH1EP=0.D0 IIPR=0 IIPN4=0 IIPN5=0 IIPN6=0 IIPER=0 *JWC Set exit value and increment according to search direction. IF(LDEREV) THEN CURRX=1 CURRIN=-1 ELSE CURRX=NTOT*2 CURRIN=1 ENDIF *JWC If it's a restart, write an entry to the guards file, * else print banners, establish initial CURRDV and CURRDB. IF(LRSTRT) THEN READ(MRKR) CURR,CURRDV,CURRDB LVARB=.TRUE. IHOLD1=CURRDV IF(CURRDV.GT.NNVARS) THEN LVARB=.FALSE. IHOLD1=CURRDV-NNVARS END IF IF(COSTAT(CURRDV).LE.3) IHOLD2=CURRDB IF(COSTAT(CURRDV).EQ.4) THEN IHOLD2=3 CURR=CURR+CURRIN ENDIF WRITE(IGUARD) LVARB,IHOLD1,IHOLD2 GOTO 200 ELSE *JWC Print a banner WRITE(MISOUT,110) 110 FORMAT(/,1X,22('-'),' MIS LOCALIZATION BEGINS ',23('-')) *JWC Set up the MIS search direction * Search direction is currently hardwired reverse. CURRDB=0 IF(LDEREV) THEN CURR=NTOT*2+1 CURRDV=NTOT ELSE CURR=0 CURRDV=1 END IF END IF *JWC The deletion loop begins here 200 CURR=CURR+CURRIN IF(LDEREV) THEN IF(CURR.LT.CURRX) GOTO 999 ELSE IF(CURR.GT.CURRX) GOTO 999 END IF CURRDV=((CURR-1)/2)+1 CURRDB=2-(2*CURRDV-CURR) IF(COSTAT(CURRDV).EQ.0) GOTO 200 *JWC Reset the bounds and the initial point DO 120 I=1,NNVARS XX(I)=XXO(I) BLVAR(I)=BLVARO(I) BUVAR(I)=BUVARO(I) 120 CONTINUE DO 130 I=1,NFUN BLCON(I)=BLCONO(I) BUCON(I)=BUCONO(I) 130 CONTINUE IF(LDEBUG) THEN WRITE(MISOUT,2030) CURRDV,CURRDB 2030 FORMAT(/,' COSTAT VALUES AND VARIABLE BOUNDS WHEN CURRDV=:', + I3,' CURRDB=',I3) DO 2040 I=1,NTOT IF(I.LE.NNVARS) THEN WRITE(MISOUT,2015) I,COSTAT(I),BLVARO(I),BUVARO(I) ELSE WRITE(MISOUT,2015) I,COSTAT(I),BLCONO(I-NNVARS), + BUCONO(I-NNVARS) ENDIF 2040 CONTINUE ENDIF *JWC Drop a bound temporarily IF(COSTAT(CURRDV).EQ.4) THEN IF(CURRDV.LE.N) THEN BLVAR(CURRDV)=-PLINFY BUVAR(CURRDV)=PLINFY ELSE BLCON(CURRDV-N)=-PLINFY BUCON(CURRDV-N)=PLINFY ENDIF CURR=CURR+CURRIN ELSE IF(CURRDB.EQ.2) THEN IF(COSTAT(CURRDV).GE.2) THEN IF(CURRDV.LE.N) THEN BUVAR(CURRDV)=PLINFY ELSE BUCON(CURRDV-N)=PLINFY ENDIF ELSE GOTO 200 END IF ELSE IF((COSTAT(CURRDV).EQ.1).OR.(COSTAT(CURRDV).EQ.3)) THEN IF(CURRDV.LE.N) THEN BLVAR(CURRDV)=-PLINFY ELSE BLCON(CURRDV-N)=-PLINFY ENDIF ELSE GOTO 200 END IF END IF END IF *JWC Record the varb about to be tested. REWIND (MRKR) ENDFILE MRKR WRITE(MRKR) CURR,CURRDV,CURRDB *JWC Submit the modified problem for solution. CALL GRGSUB(INPRNT,OTPRNT,NCORE,NNVARS,NFUN,MAXBAS, 1 MAXHES,NNOBJ,TTITLE,LVARS,BLVAR,BUVAR,BLCON,BUCON,DEFAUL,FPNEWT, 2 FPINIT,FPSTOP,FPSPIV,PPH1EP,NNSTOP,IITLIM,LLMSER,IIPR,IIPN4, 3 IIPN5,IIPN6,IIPER,PPSTEP,IIQUAD,LDERIV,MMODCG, 4 RAMCON,RAMVAR,AIJTOL,PIVPCT,MXTABU,FFUNPR,CONDTL,IDEGLM, 5 FPBOUN,FPDEG,IISCAL,IISCLG,IMEMCG,IIBVBL,XX,FCNS,INBIND,RMULTS, 6 NONBAS,REDGR,NBIND,NNONB,INFORM,Z) *JWC If it becomes feasible, then just continue the cycle. * If it is still infeasible, then drop the constraint * permanently. IF(INFORM.EQ.6) THEN WRITE(MISOUT,160) 160 FORMAT(' MIS log: WARNING: GRG error (no solution). Treated' + ' as infeasible.') INFORM=5 ENDIF CFEAS='infeasible' IF(INFORM.NE.5) CFEAS='feasible' CROCOL='col' IHOLD1=CURRDV IF(CURRDV.GT.N) THEN CROCOL='row' IHOLD1=CURRDV-N ENDIF CSENSE='lower' IF(CURRDB.EQ.2) CSENSE='upper' IF(COSTAT(CURRDV).EQ.4) CSENSE='fixed' IF(LLOG) WRITE(MISOUT,170) CFEAS,CROCOL,IHOLD1,CSENSE 170 FORMAT(' MIS log: ',A10,' with ',A3,1X,I5,1X,A5,' bound removed.') IF(INFORM.NE.5) GOTO 200 *JWC Permanently modify the bounds for the temporarily dropped bound. LVARB=.TRUE. IHOLD1=CURRDV IF(CURRDV.GT.NNVARS) THEN LVARB=.FALSE. IHOLD1=CURRDV-NNVARS ENDIF IF(COSTAT(CURRDV).EQ.4) THEN WRITE(IRLXD) LVARB,.TRUE.,IHOLD1 WRITE(IRLXD) LVARB,.FALSE.,IHOLD1 IF(CURRDV.LE.N) THEN BLVARO(CURRDV)=-PLINFY BUVARO(CURRDV)=PLINFY ELSE BLCONO(CURRDV-N)=-PLINFY BUCONO(CURRDV-N)=PLINFY ENDIF COSTAT(CURRDV)=0 GOTO 200 ENDIF IF(CURRDB.EQ.1) THEN WRITE(IRLXD) LVARB,.TRUE.,IHOLD1 IF(CURRDV.LE.N) THEN BLVARO(CURRDV)=-PLINFY ELSE BLCON(CURRDV-N)=-PLINFY ENDIF IF(COSTAT(CURRDV).EQ.1) COSTAT(CURRDV)=0 IF(COSTAT(CURRDV).EQ.3) COSTAT(CURRDV)=2 GOTO 200 ELSE WRITE(IRLXD) LVARB,.FALSE.,IHOLD1 IF(CURRDV.LE.N) THEN BUVARO(CURRDV)=PLINFY ELSE BUCONO(CURRDV-N)=PLINFY ENDIF IF(COSTAT(CURRDV).EQ.2) COSTAT(CURRDV)=0 IF(COSTAT(CURRDV).EQ.3) COSTAT(CURRDV)=1 GOTO 200 ENDIF *JWC The MIS has been identified. 999 WRITE(MISOUT,300) 300 FORMAT(/,1X,19('-'),' Column (var) bounds in the MIS ',19('-')) DO 1080 I=1,NTOT IF(I.EQ.(NNVARS+1)) WRITE (MISOUT,310) 310 FORMAT(/,1X,19('-'),' Row (const) bounds in the MIS ',20('-')) IF(COSTAT(I).EQ.0) GOTO 1080 IF(COSTAT(I).EQ.1) CSENSE='lower' IF(COSTAT(I).EQ.2) CSENSE='upper' IF(COSTAT(I).EQ.3) CSENSE='both ' IF(COSTAT(I).EQ.4) CSENSE='fixed' IHOLD1=I CTEMP=RAMVAR(I) IF(I.GT.NNVARS) THEN IHOLD1=I-NNVARS CTEMP=RAMCON(IHOLD1) ENDIF WRITE(MISOUT,90) IHOLD1,CTEMP,CSENSE 90 FORMAT(1X,I5,1X,A8,1X,A5,' bound') 1080 CONTINUE *JWC Write out the list of guards. WRITE(MISOUT,1085) 1085 FORMAT(/,1X,28('-'),' Guard Bounds ',28('-')) REWIND(IGUARD) 1090 READ(IGUARD,END=2000) LVARB,IHOLD1,IHOLD2 IF(IHOLD2.EQ.1) CSENSE='lower' IF(IHOLD2.EQ.2) CSENSE='upper' IF(IHOLD2.EQ.3) CSENSE='both ' IF(LVARB) THEN CTEMP=RAMVAR(IHOLD1) WRITE(MISOUT,1092) IHOLD1,CTEMP,CSENSE 1092 FORMAT(1X,'Variable ',I5,1X,A8,1X,A5,' bound') ELSE CTEMP=RAMCON(IHOLD1) WRITE(MISOUT,1094) IHOLD1,CTEMP,CSENSE 1094 FORMAT(1X,'Constraint ',I5,1X,A8,1X,A5,' bound') ENDIF GOTO 1090 *JWC Erase the temporary memory files. 2000 CLOSE (MRKR) CLOSE (IRLXD) CLOSE (IGUARD) CALL SYSTEM('ERASE MARKER') CALL SYSTEM('ERASE RELAXED') CALL SYSTEM('ERASE GUARDS') RETURN END *JWC End of subroutine GRGMIS. MIS.BAT follows----------------------------------------------- IF EXIST MISMAIN.OBJ ERASE MISMAIN.OBJ IF EXIST %1.MIS ERASE %1.MIS IF EXIST %1.PRN ERASE %1.PRN IF EXIST LSGRG.MIS ERASE LSGRG.MIS IF EXIST GUARDS ERASE GUARDS IF EXIST MARKER ERASE MARKER IF EXIST RELAXED ERASE RELAXED COPY %1.OBJ MISMAIN.OBJ c:\programs\lahey\os386 c:\programs\lahey\up l32 @lsgrgmis.lnk :RERUN C:\PROGRAMS\LAHEY\UP /N LSGRGMIS IF EXIST MARKER GOTO RERUN c:\programs\lahey\os386 remove IF EXIST LSGRG.MIS RENAME lsgrg.mis %1.MIS DRUD2.FOR follows----------------------------------------------- PROGRAM DRUD2 *JWC----------------------------------------------------------------- * This is an example calling routine which sets up the DRUD2 * test problem, which is the NLTEST1 problem seeded with * the simple DRUD1 problem causing a math error. *-------------------------------------------------------------------- IMPLICIT DOUBLE PRECISION (A-H,O-Z), INTEGER(I-N) INTEGER IOIN,IOOUT,IODUMP,IOERR,IOTERM COMMON /IOUNIT/ IOIN,IOOUT,IODUMP,IOERR,IOTERM LOGICAL INPRNT,OTPRNT DATA INPRNT/.TRUE./, OTPRNT/.TRUE./ DIMENSION Z(1000) DATA NCORE/1000/ CHARACTER*76 TTITLE DIMENSION LVARS(1) DATA LVARS(1)/0/ DATA NNVARS/4/,NFUN/5/,MAXBAS/5/,MAXHES/4/,NNOBJ/5/ DATA TTITLE/'DRUD2 INFEASIBLE TEST PROBLEM'/ DIMENSION BLVAR(4),BUVAR(4) DATA BLVAR/4.D0,0.D0,1.D-5,-1.D31/,BUVAR/6.D0,12.D0,1.D31,-1.D0/ DIMENSION BLCON(5),BUCON(5) DATA BLCON/3*-1.D31,0.D0,-1.D31/, + BUCON/25.D0,15.D0,25.D0,0.D0,1.D31/ DIMENSION XX(2) DATA XX/10.D0,10.D0,1.D0,1.D0/ DIMENSION DEFAUL(37) DATA DEFAUL/17*1.D0,0.D0,19*1.D0/ CHARACTER*8 RAMCON(5),RAMVAR(4) DATA RAMCON/'ROW1','ROW2','ROW3','DRUDROW','OBJ'/ DATA RAMVAR/'X1','X2','DRUDX','DRUDY'/ IOOUT = 2 IOERR = 2 IOTERM = 6 OPEN(UNIT=2,FILE='DRUD2.PRN') CALL GRGMIS(INPRNT,OTPRNT,NCORE,NNVARS,NFUN,MAXBAS, 1 MAXHES,NNOBJ,TTITLE,LVARS,BLVAR,BUVAR,BLCON,BUCON,DEFAUL,FPNEWT, 2 FPINIT,FPSTOP,FPSPIV,PPH1EP,NNSTOP,IITLIM,LLMSER,IIPR,IIPN4, 3 IIPN5,IIPN6,IIPER,PPSTEP,IIQUAD,LDERIV,MMODCG, 4 RAMCON,RAMVAR,AIJTOL,PIVPCT,MXTABU,FFUNPR,CONDTL,IDEGLM, 5 FPBOUN,FPDEG,IISCAL,IISCLG,IMEMCG,IIBVBL,XX,FCNS,INBIND,RMULTS, 6 NONBAS,REDGR,NBIND,NNONB,INFORM,Z) STOP END *JWC End of program NLTEST1. SUBROUTINE GCOMP(G,X) * First nonlinear infeasible test case. IMPLICIT REAL*8(A-H,O-Z),INTEGER*2(I-N) DIMENSION G(5),X(4) G(1) = -X(1)**2 + 10.D0*X(1) + X(2) G(2) = -X(1)**2 + 10.D0*X(1) - X(2) G(3) = X(1) + X(2) G(4) = X(4) - SQRT(X(3)) G(5) = X(1) + X(2) RETURN END -- John W. Chinneck tel: (613) 788-5733 Systems and Computer Engineering fax: (613) 788-5727 Carleton University email: Ottawa, Ontario K1S 5B6 Canada chinneck@sce.carleton.ca