COMMENT 100 TIME-PERT B5000 200 AN ALGOL 60 PROGRAM FOR THE ANALYSIS 300 AND PLANNING OF NETWORK FLOW PROBLEMS 400 ANNE G. MACEK 500 (PROFESSIONAL SERVICES, BURROUGHS CORPORATION) 600 FIRST RELEASE DATE 7-1-64 700 ; 800 COMMENT 900 BLOCK STRUCTURE 1000 :------------------------- 1100 : DECLARE GLOBAL VARIABLES 1200 : 1300 : PROCEDURE TYPEOUT 1400 : :----------------------- 1500 : : TYPE MESSAGES ON SUPERVISORY PRINTER 1600 : :----------------------- 1700 : 1800 : PROCEDURE PURGE 1900 : :----------------------- 2000 : : PURGE TAPE WITH A SAVE FACTOR 2100 : :----------------------- 2200 : 2300 : :----------------------- 2400 : : CONTROL BLOCK READ AND AUDIT CONTROL CARDS 2500 : :----------------------- 2600 : 2700 : :----------------------- 2800 : : DECLARE ADDITIONAL GLOBAL VARIABLES 2900 : :ORIGIN................. 3000 : : . CONTROL ROUTINE 3100 : : ................. 3200 : : 3300 : :BLOCK1:---------------- 3400 : : : READ SAVE RECORDS FOR AN UPDATE 3500 : : : OR GENERATE REPORTS RUN 3600 : : :---------------- 3700 : : 3800 : :BLOCK2:---------------- 3900 : : : AUDIT BLOCK 4000 : : : PROCEDURE UNPACK 4100 : : : :----------- 4200 : : : :----------- 4300 : : : PROCEDURE RENUMBER 4400 : : : :----------- 4500 : : : : COMPUTE RENUMBERED EVENT 4600 : : : : WRITE EVENT NUMBER,RENUMBERED EVENT, 4700 : : : : AND EVENT DESCRIPTION ON EVENT TAPE 4800 : : : :----------- 4900 : : : PROCEDURE CARDAUDIT 5000 : : : :----------- 5100 : : : : AUDIT ACTIVITIES 5200 : : : : WRITE PREDECESSOR EVENT,SUCCESSOR EVENT, 5300 : : : : PACKED RENUMBERED EVENTS,ACTIVITY DATE, 5400 : : : : ACTIVITY DURATION, AND ACTIVITY 5500 : : : : DESCRIPTION ON ACTIVITY TAPE 5600 : : : :----------- 5700 : : : CHECK NETWORK START DATE AND REPORT 5800 : : : DATE 5900 : : : READ AND AUDIT ACTIVITY CARDS 6000 : : : :----------- 6100 : : : : LIST ENDING AND STARTING EVENTS 6200 : : : :----------- 6300 : : : :----------- 6400 : : : : WRITE TALLY COUNTS ON ACTIVITY TAPE 6500 : : : : FILE 6600 : : : :----------- 6700 : : :---------------- 6800 : : 6900 : :BLOCK3:---------------- 7000 : : : RANK BLOCK 7100 : : : RANK EVENTS 7200 : : : WRITE EVENT RANKS ON EVENT TAPE 7300 : : : WRITE ACTIVITY RANKS ON ACTIVITY 7400 : : : TAPE 7500 : : : LIST ACTIVITIES IN A LOOP 7600 : : :---------------- 7700 : : 7800 : :BLOCK4:---------------- 7900 : : : SORT BLOCK 8000 : : : PROCEDURE TAPESORT 8100 : : : :----------- 8200 : : : : SORT TAPE FILE 8300 : : : :----------- 8400 : : : :----------- 8500 : : : : FILL GLOBAL ARRAYS 8600 : : : :----------- 8700 : : :---------------- 8800 : : 8900 : :BLOCK5:---------------- 9000 : : : NETANAL BLOCK 9100 : : : CALCULATE EARLIEST START AND SUMS 9200 : : : OF VARIANCE AND WRITE THEM ON 9300 : : : ACTIVITY TAPE 9400 : : : WRITE EARLIEST OCCURRENCE AND SUMS 9500 : : : OF VARIANCE ON EVENT TAPE 9600 : : : CALCULATE LATEST FINISH 9700 : : : WRITE LATEST FINISH AND ACTIVITY 9800 : : : SLACK ON ACTIVITY TAPE 9900 : : : WRITE LATEST OCCURRENCE AND EVENT 10000 : : : SLACK ON EVENT TAPE 10100 : : :---------------- 10200 : : 10300 : :BLOCK6:---------------- 10400 : : : LIST BLOCK 10500 : : : PROCEDURE PACK 10600 : : : :----------- 10700 : : : :----------- 10800 : : : PROCEDURE UPACK 10900 : : : ............ 11000 : : : ............ 11100 : : : 11200 : : : :----------- 11300 : : : : PROCEDURE NORMPROB 11400 : : : : :--------- 11500 : : : : : COMPUTE PROBABILITY OF MEETING 11600 : : : : : SCHEDULE DATES 11700 : : : : :------- - 11800 : : : : LIST ACTIVITIES 11900 : : : :----------- 12000 : : : 12100 : : : :------------ 12200 : : : : LIST EVENTS 12300 : : : :------------ 12400 : : :---------------- 12500 : : 12600 : :BLOCK7:---------------- 12700 : : : PLOT BLOCK 12800 : : : PROCEDURE UPACK 12900 : : : ............ 13000 : : : ............ 13100 : : : :----------- 13200 : : : : PROCEDURE UNPACK 13300 : : : : :--------- 13400 : : : : :--------- 13500 : : : : COMPUTE STARTING DATE OF GRAPH 13600 : : : :----------- 13700 : : : 13800 : : : :----------- 13900 : : : : WRITE HEADING IF PLOT BY DAYS OR 14000 : : : : WEEKS 14100 : : : :----------- 14200 : : : 14300 : : : :----------- 14400 : : : : WRITE HEADING IF PLOT BY MONTHS 14500 : : : :----------- 14600 : : : 14700 : : : :----------- 14800 : : : : WRITE HEADING IF PLOT BY QUARTERS 14900 : : : :----------- 15000 : : : 15100 : : : :----------- 15200 : : : : PROCEDURE PACK 15300 : : : : :--------- 15400 : : : : :--------- 15500 : : : : PLOT GRAPH 15600 : : : :----------- 15700 : : :---------------- 15800 : : 15900 : :FINISH:---------------- 16000 : : : FINISH BLOCK 16100 : : : WRITE SAVE RECORDS ON TAPE 16200 : : : :----------- 16300 : : : : LIST SAVE RECORDS AND ATIVITY TAPES 16400 : : : : IF PROGRAM TERMINATED BEFORE 16500 : : : : COMPLETION BECASE OF DATA ERRORS 16600 : : : :----------- 16700 : : : :----------- 16800 : : : : LIST EXECUTED OPERATIONS 16900 : : : :----------- 17000 : : :---------------- 17100 : :----------------------- 17200 : WRITE MESSAGES ON SUPERVISORY 17300 : PRINTER 17400 ENDOFPROG:------------------------- 17500 ; 17600 BEGIN 17700 COMMENT 17800 DEFINITIONS OF GLOBAL VARIABLES 17900 NOACT NUMBER OF ACTIVITIES 18000 NOEVN NUMBER OF EVENTS 18100 MAXNOACT MAXIMUM PERMISSIBLE NUMBER OF ACTIVITIES 18200 MAXNOEVN MAXIMUM PERMISSIBLE NUMBER OF EVENTS 18300 MINEV MINIMUM EVENT NUMBER 18400 MAXEV MAXIMUM EVENT NUMBER 18500 RUN RUN NUMBER 18600 SDATE NETWORK STARTING DATE 18700 SDAYS NUMBER OF WORKING DAYS FROM 1/1/62 UNTIL NETWORK 18800 START DATE 18900 WDPW NUMBER OF WORKING DAYS PER WEEK 19000 RDATE NETWORK REPORT DATE 19100 RDAYS NUMBER OF WORKING DAYS FROM NETWORK START DATE 19200 UNTIL REPORT DATE 19300 KEY ACTIVITY NUMBER ON ACTIVITY TAPE FILE 19400 I PREDECESSOR EVENT NUMBER 19500 J SUCCESSOR EVENT NUMBER 19600 RRIJ PACKED VARIABLE CONTAINING RENUMBERED 19700 PREDECESSOR AND SUCCESSOR EVENTS 19800 ASD FLAG DENOTING TYPE OF ACTIVITY DATE 19900 1 ACTUAL START DATE 20000 2 ACTUAL COMPLETION DATE 20100 3 DIRECTED START DATE 20200 4 SCHEDULED COMPLETION DATE 20300 ADAYS NUMBER OF WORKING DAYS FROM NETWORK START DATE 20400 UNTIL ACTIVITY DATE 20500 RANKI ACTIVITY RANK -RANK OF PREDECESSOR EVENT- 20600 TAL PACKED VARIABLE CONTAINING NUMBER OF ACTIVITIES 20700 LEADING INTO AND NUMBER LEADING FROM SUCCESSOR 20800 EVENT AND NUMBER OF PRECEDING ACTIVITIES WHICH 20900 ARE COMPLETE 21000 NOACTCOL,NOACTROW UPPER BOUNDS FOR ARRAYS OF LENGTH NOACT 21100 NOEVNCOL,NOEVNROW UPPER BOUNDS FOR ARRAYS OF LENGTH NOEVN 21200 NWPR NUMBER OF WORDS PER LOGICAL RECORD ON ACTIVITY 21300 TAPE 21400 SORTARRAYSIZE NUMBER OF ROWS IN ARRAY CONTAINING 21500 ACTIVITIES TO BE SORTED 21600 NUMENDING MAXIMUM PERMISSIBLE NUMBER OF ENDING EVENTS 21700 NUMSTARTING MAXIMUM PERMISSIBLE NUMBER OF STARTING EVENTS 21800 CHAINLENGTH LARGEST PERMISSIBLE NUMBER OF SERIAL 21900 ACTIVITIES 22000 SRUN RUN NUMBER READ FROM SAVE RECORDS TAPE 22100 SSDATE NETWORK START DATE READ FROM SAVE RECORDS TAPE 22200 SNOACT NUMBER OF ACTIVITIES READ FROM SAVE RECORDS TAPE 22300 SSDAYS NUMBER OF WORKING DAYS FROM 1/1/62 UNTIL NETWORK 22400 START DATE READ FROM SAVE RECORDS TAPE 22500 RD TAPE KEY OF TAPE FILE CONTAINING CURRENT 22600 ACTIVITY RECORDS 22700 WR TAPE KEY OF TAPE FILE TO BE WRITTEN NEXT 22800 RN RENUMBERED EVENT 22900 EVNO EVENT NUMBER 23000 RANKE EVENT RANK 23100 TALLY PACKED VARIABLE CONTAINING NUMBER OF ACTIVITIES 23200 LEADING INTO AND NUMBER LEADING FROM EVENT AND 23300 NUMBER OF PRECEDING ACTIVITIES WHICH ARE 23400 COMPLETE 23500 NOSORT NUMBER OF EVENT SORTS 23600 NCPR NUMBER OF WORDS PER LOGICAL RECORD ON EVENT TAPE 23700 RE TAPE KEY OF TAPE FILE CONTAINING CURRENT EVENT 23800 RECORDS 23900 SC TAPE KEY OF TAPE FILE CONTAINING SAVE RECORDS 24000 NE TAPE KEY OF TAPE FILE CONTAINING NEW EVENT 24100 RECORDS 24200 NTAPES NUMBER OF TAPES TO BE USED FOR SORTING 24300 ET EXPECTED DURATION TIME OF AN ACTIVITY 24400 VAR ACTIVITY VARIANCE 24500 SVAR SUM OF VARIANCES ALONG MOST CRITICAL PATH 24600 LEADING TO GIVEN ACTIVITY 24700 ES EARLIEST STARTING TIME FOR ACTIVITY 24800 LF LATEST FINISH TIME FOR ACTIVITY ALLOWED IN ORDER 24900 TO MEET SCHEDULE ENDING DATES 25000 SL ACTIVITY SLACK 25100 EEO EARLIEST EVENT OCCURRENCE 25200 LEO LATEST EVENT OCCURRENCE 25300 EVAR SUM OF VARIANCES ALONG MOST CRITICAL PATH 25400 LEADING TO EVENT 25500 SLCK EVENT SLACK 25600 NETNAME ARRAY CONTAINING NETWORK NAME 25700 SNETNAME ARRAY CONTAINING NETWORK NAME READ FROM SAVE 25800 RECORDS TAPE 25900 REMARKS ARRAY CONTAINING ACTIVITY DESCRIPTION 26000 DSCPT ARRAY CONTAINING EVENT DESCRIPTION 26100 PERIOD INTERVAL OF TIME ESTIMATES -DAYS OR WEEKS- 26200 ITEMNAME ARRAY CONTAINING NAMES OF ITEMS IN ACTIVITY 26300 RECORD ON TAPE 26400 EVENTITEM ARRAY CONTAINING NAMES OF ITEMS IN EVENT RECORD 26500 INST ARRAY CONTAINING SPO MESSAGES 26600 BLOCKTOTAL NUMBER OF BLOCKS OF CODE TO BE EXECUTED 26700 RSORTNUM NUMBER OF ACTIVITY SORTS 26800 NOBLOCK INDEX OF ARRAYS BLOC AND BLOCPARAM 26900 UPDATE FLAG DENOTING TYPE OF AUDIT TO BE PERFORMED 27000 0 INITIAL INPUT AUDIT 27100 1 UPDATE WITHOUT NETWORK CHANGES 27200 2 UPDATE WITH NETWORK CHANGES 27300 SAVETAPES BOOLEAN FLAG, TRUE IF INPUT TAPES FOR AN UPDATE 27400 OR GENERATE REPORTS RUN ARE TO BE SAVED 27500 BSAVA BOOLEAN FLAG, TRUE IF ACTIVITY TAPE IS TO BE 27600 SAVED DURING A GENERATE REPORTS RUN 27700 BSAVE BOOLEAN FLAG, TRUE IF EVENT TAPE IS TO BE SAVED 27800 DURING A GENERATE REPORTS RUN 27900 ONETIME BOOLEAN FLAG, TRUE IF ONLY ONE TIME ESTIMATE 28000 IS SPECIFIED 28100 LISTTAL BOOLEAN FLAG, TRUE IF END TALLIES ARE TO BE 28200 LISTED 28300 EVENTTAPE BOOLEAN FLAG, TRUE IF AN EVENT TAPE IS TO BE 28400 MADE 28500 BLOC ARRAY CONTAINING BLOCK NUMBERS WHICH ARE TO BE 28600 EXECUTED 28700 BLOCPARAM ARRAY CONTAINING PARAMETERS NECESSARY FOR 28800 CODING TO BE EXECUTED 28900 SORTCOL ARRAY CONTAINING NUMBER OF SORTKEYS AND SORTKEY 29000 NUMBERS FOR ACTIVITY SORTS 29100 EVENTCOL ARRAY CONTAINING NUMBER OF SORTKEYS AND SORTKEY 29200 NUMBERS FOR EVENT SORTS 29300 LL,K INDICES FOR LISTS 29400 ; 29500 INTEGER NOACT,NOEVN,MAXNOACT,MAXNOEVN,MINEV,MAXEV,RUN,SDATE,SDAYS, 29600 WDPW,RDATE,RDAYS,KEY,I,J,RRIJ,ASD,ADAYS,RANKI,TAL,LL,K ; 29700 INTEGER NOACTCOL,NOACTROW,NOEVNCOL,NOEVNROW,NWPR,SORTARRAYSIZE ; 29800 INTEGER NUMENDING,NUMSTARTING,CHAINLENGTH ; 29900 INTEGER SRUN,SSDATE,SNOACT,SSDAYS ; 30000 INTEGER RD,WR ; 30100 INTEGER RN,EVNO,RANKE,TALLY,NOSORT,NCPR,RE,SC ; 30200 INTEGER NE ; 30300 INTEGER NTAPES ; 30400 FILE OUT PRINTER 1(2,15) ; 30500 FILE OUT SPOOUT(1,20) ; 30600 FILE DUMMYFILE(1,10) ; 30700 FILE PERTA 2(2,256,19,SAVE 30) ; 30800 FILE PERTB 2(2,256,19,SAVE 30) ; 30900 FILE PERTC 2(2,256,250,SAVE 30) ; 31000 FILE PERTE 2(2,256,19,SAVE 30) ; 31100 FILE PERTF 2(2,256,19,SAVE 30) ; 31200 SWITCH FILE SWF ~ DUMMYFILE,PERTA,PERTB,PERTC,PERTE,PERTF ; 31300 REAL ET,VAR,SVAR,ES,LF,SL ; 31400 REAL EEO,LEO,EVAR,SLCK ; 31500 ALPHA ARRAY NETNAME[0:13],REMARKS[0:4] ; 31600 ALPHA ARRAY DSCPT[0:4] ; 31700 ALPHA ARRAY SNETNAME[0:13] ; 31800 ALPHA PERIOD ; 31900 ALPHA ARRAY ITEMNAME[0:15] ; 32000 ALPHA ARRAY EVENTITEM[0:10] ; 32100 ARRAY INST[0:5,0:12] ; 32200 ALPHA ARRAY FILENAMES[0:5] ; 32300 INTEGER ARRAY BLOC[0:40],BLOCPARAM[0:40],SORTCOL[0:9,0:5] ; 32400 INTEGER ARRAY EVENTCOL[0:9,0:5] ; 32500 LABEL ENDOFPROG ; 32600 LABEL MAINSTART ; 32700 LIST SAVEREC1(FOR LL ~ 1 STEP 1 UNTIL 13 DO NETNAME[LL],RUN, 32800 SDATE,SDAYS,RDATE,RDAYS,MAXNOACT,MAXNOEVN, 32900 CHAINLENGTH,NUMENDING,NUMSTARTING,WDPW,NOACT,NOEVN, 33000 NOACTROW,NOACTCOL,NOEVNROW,NOEVNCOL,MINEV,MAXEV, 33100 FOR LL ~ 1 STEP 1 UNTIL 5 DO SORTCOL[0,LL],FOR LL ~ 33200 1 STEP 1 UNTIL 5 DO EVENTCOL[0,LL],SC,RD,RE,WR,NE), 33300 SSAVEREC1(FOR LL ~ 1 STEP 1 UNTIL 13 DO SNETNAME[LL],SRUN, 33400 SSDATE,SSDAYS,RDATE,RDAYS,MAXNOACT,MAXNOEVN, 33500 CHAINLENGTH,NUMENDING,NUMSTARTING,WDPW,SNOACT,NOEVN, 33600 NOACTROW,NOACTCOL,NOEVNROW,NOEVNCOL,MINEV,MAXEV, 33700 FOR LL ~ 1 STEP 1 UNTIL 5 DO SORTCOL[0,LL],FOR LL ~ 33800 1 STEP 1 UNTIL 5 DO EVENTCOL[0,LL],SC,RD,RE,WR,NE) ; 33900 INTEGER BLOCKTOTAL,RSORTNUM,NOBLOCK,UPDATE ; 34000 BOOLEAN SAVETAPES ; 34100 BOOLEAN BSAVE ; 34200 BOOLEAN BSAVA ; 34300 BOOLEAN ONETIME,LISTTAL ; 34400 BOOLEAN EVENTTAPE ; 34500 PROCEDURE TYPEOUT(F,A) ; 34600 COMMENT THIS PROCEDURE TYPES OUT THE MESSAGES CONTAINED IN THE 34700 ARRAY A ON THE SUPERVISORY PRINTER ; 34800 FILE F ; 34900 ARRAY A[0] ; 35000 BEGIN 35100 SAVE ARRAY B[0:7] ; 35200 STREAM PROCEDURE TYPE(F,B) ; 35300 BEGIN 35400 LOCAL TA ; 35500 LABEL L,L2 ; 35600 COMMENT BUILD DESCRIPTOR ; 35700 SI ~ B ; TA ~ SI ; DI ~ LOC TA ; DS ~ 5 LIT "{|000"; 35800 DI ~ F ; SI ~ LOC TA ; DS ~ 1 WDS ; RELEASE(F) ; 35900 COMMENT WAIT FOR PRESENCE ; 36000 L: SI ~ F ; SKIP 2 SB ; IF SB THEN GO TO L2 ; GO TO L ; 36100 L2: END ; 36200 STREAM PROCEDURE LOAD(A,B) ; 36300 BEGIN 36400 SI ~ A ; DI ~ B ; 36500 10(SI ~ SI + 2 ; DS ~ 6 CHR) ; 36600 END ; 36700 LOAD(A,B) ; TYPE(F,B) ; 36800 END TYPEOUT ; 36900 PROCEDURE PURGE(F,FACTOR) ; 37000 COMMENT THIS PROCEDURE PURGES A TAPE WITH A SAVE FACTOR ; 37100 FILE F ; 37200 INTEGER FACTOR ; 37300 BEGIN 37400 ARRAY TEMP[0:1] ; 37500 LABEL L1,L2,RET ; 37600 SWITCH SW ~ L1,L2,RET ; 37700 INTEGER SAVE1,SAVE2 ; 37800 STREAM PROCEDURE FIXSAVEFACTOR(F,SAVE1,SAVE2) ; 37900 BEGIN 38000 LOCAL T ; 38100 SI ~ F ; SI ~ SI - 24 ; DI ~ LOC T ; DS ~ WDS ; 38200 SI ~ T ; SI ~ SI + 37 ; DI ~ SAVE2 ; DI ~ DI + 5 ; 38300 DS ~ 3 CHR ; 38400 SI ~ SAVE1 ; SI ~ SI + 5 ; DI ~ T ; DI ~ DI + 37 ; 38500 DS ~ 3 CHR ; 38600 END FIXSAVEFACTOR ; 38700 SAVE1 ~ SAVE2 ~ 0 ; REWIND(F) ; 38800 FIXSAVEFACTOR(F,SAVE1,SAVE2) ; 38900 WRITE(F,1,TEMP[*]) ; 39000 FIXSAVEFACTOR(F,SAVE2,SAVE1) ; 39100 GO TO SW[FACTOR] ; 39200 L1: CLOSE(F,SAVE) ; GO TO RET ; 39300 L2: CLOSE(F,RELEASE) ; 39400 RET: END PURGE ; 39500 MAINSTART: 39600 FILL ITEMNAME[*] WITH " KEY"," PRED"," SUCC", 39700 " RRIJ"," ET"," VAR"," ASD", 39800 " ADAYS"," ES"," LF"," SL"," SVAR", 39900 " RANK"," TALLY"," "," " ; 40000 FILL INST[1,*] WITH " ","IS THE"," SAVE ","RECORD", 40100 "S TAPE"," FILE.","~ " ; 40200 FILL INST[2,*] WITH " ","IS THE"," ACTIV","ITIES ", 40300 "TAPE F","ILE.~ " ; 40400 FILL INST[3,*] WITH " ","IS THE"," EVENT"," TAPE ", 40500 "FILE.~" ; 40600 FILL INST[4,*] WITH "SAVE T","HIS TA","PE FOR"," AN UP", 40700 "DATE R","UN.~ " ; 40800 FILL INST[5,*] WITH "REMOVE"," THIS ","TAPE.~" ; 40900 FILL FILENAMES[*] WITH "DUMMY ","PERTA ","PERTB ", 41000 "PERTC ","PERTE ","PERTF " ; 41100 ONETIME ~ LISTTAL ~ FALSE ; 41200 BEGIN 41300 COMMENT CONTROL BLOCK ; 41400 COMMENT 41500 DEFINITIONS OF VARIABLES IN CONTROL BLOCK 41600 NOMODULES NUMBER OF MEMORY MODULES ON THE B5000 SYSTEM 41700 BEING USED 41800 CONTROL1 ARRAY CONTAINING CARD IMAGE OF A CONTROL CARD 41900 CONTROL2 ARRAY CONTAINING VALUES OF INPUT PARAMETERS ON 42000 A CONTROL CARD 42100 NOTES ARRAY CONTAINING COMMENTS 42200 INA,INE TEMPORARY ARRAYS 42300 LL,MM,NN INDICES FOR ARRAYS 42400 ; 42500 INTEGER MM,NN,LL ; 42600 INTEGER NOMODULES ; 42700 ALPHA ARRAY CONTROL1[0:6] ; 42800 ALPHA ARRAY NOTES[0:14] ; 42900 INTEGER ARRAY CONTROL2[0:5] ; 43000 INTEGER ARRAY INA,INE[0:9] ; 43100 LABEL L1,L2,L3,L4,L5 ; 43200 LABEL ER ; 43300 LABEL ER2,ER4,EOJ ; 43400 LIST CONTROLIN(FOR NN ~ 1 STEP 1 UNTIL 6 DO CONTROL1[NN], 43500 FOR NN ~ 1 STEP 1 UNTIL 5 DO CONTROL2[NN]), 43600 REMARK(FOR NN ~ 1 STEP 1 UNTIL 14 DO NOTES[NN]), 43700 CONTROLOUT1(FOR NN ~ 1 STEP 1 UNTIL 6 DO CONTROL1[NN]), 43800 CONTROLOUT2(FOR NN ~ 1 STEP 1 UNTIL 6 DO CONTROL1[NN], 43900 CONTROL2[1]), 44000 CONTROLOUT3(FOR NN ~ 1 STEP 1 UNTIL 6 DO CONTROL1[NN], 44100 CONTROL2[1],CONTROL2[2]) ; 44200 FILE IN FILECONTR(2,10) ; 44300 FORMAT IN FORMCONTR(6A6,X4,I10,4I5) ; 44400 FORMAT COMMENTS(13A6,A2) ; 44500 FORMAT OUT OUTER("CONTROL CARD INCORRECT. THE FOLLOWING CONTROL", 44600 "CARDS ARE IGNORED"), 44700 OUTMOD("NO MODULES NOT SPECIFIED"), 44800 OUTTAPE("A MINIMUM OF THREE TAPES ARE NEEDED"), 44900 OUTWDPW("NO WORKING DAYS PER WEEK INVALID"), 45000 OUTSORTA("TWO SUCCESSIVE ACTIVITY SORTS, SORTED ON FIRST", 45100 " ONLY"), 45200 OUTSORTE("TWO SUCCESSIVE EVENT SORTS, SORTED ON FIRST ", 45300 "ONLY"), 45400 OUTSEVENT("EVENT TAPE SORT, ALTHOUGH NO EVENT TAPE ", 45500 "SPECIFIED, AN EVENT TAPE IS ASSUMED"), 45600 OUTLEVENT("EVENT TAPE LIST, ALTHOUGH NO EVENT TAPE ", 45700 "SPECIFIED, AN EVENT TAPE IS ASSUMED"), 45800 OUTSORTKEYS("MORE THAN FOUR SORTKEYS CALLED FOR, FIRST ", 45900 "FOUR ARE USED"), 46000 OUTREPORTS("MORE THAN NINE SORTS ARE CALLED FOR."//"THE ", 46100 "FOLLOWING CONTROL CARDS ARE IGNORED:"/), 46200 OUTSORTDE("LAST EVENT SORT OMITTED BECAUSE SORT BY EVNO ", 46300 "IMMEDIATELY FOLLOWS"), 46400 OUTSORTDA("LAST ACTIVITY SORT OMITTED BECAUSE SORT BY I ", 46500 "OR J IMMEDIATELY FOLLOWS"), 46600 OUTLISTDE("LIST OF EVENTS BY DEPARTMENT NOT POSSIBLE ", 46700 "BECAUSE NO MORE EVENT SORTS ARE PERMITTED"), 46800 OUTLISTDA("LIST OF ACTIVITIES BY DEPARTMENT NOT POSSIBLE", 46900 "BECAUSE NO MORE ACTIVITY SORTS ARE PERMITTED"), 47000 OUTPLOT("PLOT INTERVAL INCORRECT, PLOT IGNORED"), 47100 OUTPLOTD("GRAPH OF ACTIVITIES BY DEPARTMENT NOT POSSIBLE", 47200 " BECAUSE NO MORE ACTIVITY SORTS ARE PERMITTED"), 47300 OUTBLOC("THE TOTAL NUMBER OF SORT, LIST, AND PLOT CARDS ", 47400 "EXCEEDS THE MAX NO. ALLOWED"//"THE FOLLOWING ", 47500 "CONTROL CARDS ARE IGNORED:"/), 47600 OUTEOF("NO MCP END OF FILE CARD FOR FILE FILECONTR," 47700 " THE FOLLOWING CARDS ARE IGNORED"), 47800 OUTCARD1(6A6), 47900 OUTCARD2(6A6,X4,I10), 48000 OUTCARD3(6A6,X4,I10,4I5), 48100 OUTCARD4(6A6,X4,I10,I5) ; 48200 FOR NN ~ 0 STEP 1 UNTIL 40 DO BLOC[NN] ~ 0 ; 48300 FOR NN ~ 0 STEP 1 UNTIL 40 DO BLOCPARAM[NN] ~ 0 ; 48400 COMMENT READ PERT CONTROL CARDS ; 48500 WRITE(PRINTER[PAGE]) ; 48600 MM ~ 1 ; 48700 COMMENT READ HEADER CARD ; 48800 READ(FILECONTR,FORMCONTR,CONTROLIN)[ENDOFPROG] ; 48900 IF (CONTROL1[1] ! "PERT C") OR (CONTROL1[2] ! "ONTROL") 49000 OR (CONTROL1[3] ! " CARDS") THEN 49100 BEGIN 49200 WRITE(PRINTER[DBL],OUTCARD3,CONTROLIN) ; 49300 WRITE(PRINTER[DBL],OUTER) ; 49400 GO TO ENDOFPROG ; 49500 END ; 49600 WRITE(PRINTER[DBL],OUTCARD1, CONTROLOUT1) ; 49700 COMMENT READ COMMENT CARD ; 49800 READ(FILECONTR[NO],FORMCONTR,CONTROLIN)[ENDOFPROG] ; 49900 IF (CONTROL1[1] = "COMMEN") AND (CONTROL1[2] = "T ") 50000 THEN 50100 BEGIN 50200 READ(FILECONTR,COMMENTS,REMARK) ; 50300 WRITE(PRINTER[DBL],COMMENTS,REMARK) ; 50400 FOR LL ~ 3 STEP 1 UNTIL 10 DO INST[0,LL-3] ~ NOTES[LL] ; 50500 INST[0,8] ~ ".~ " ; 50600 TYPEOUT(SPOOUT,INST[0,*]) ; 50700 END ; 50800 COMMENT READ NUMBER OF MODULES CARD ; 50900 READ(FILECONTR,FORMCONTR,CONTROLIN)[ENDOFPROG] ; 51000 IF (CONTROL1[1] !"NUMBER") OR (CONTROL1[2] ! " OF MO") 51100 OR (CONTROL1[3] ! "DULES ") THEN 51200 BEGIN 51300 WRITE(PRINTER[DBL],OUTCARD3,CONTROLIN) ; 51400 WRITE(PRINTER[DBL],OUTMOD) ; 51500 GO TO ENDOFPROG ; 51600 END ; 51700 NOMODULES ~ CONTROL2[1] ; 51800 WRITE(PRINTER[DBL],OUTCARD2,CONTROLOUT2) ; 51900 COMMENT CALCULATE SORTARRAYSIZE ; 52000 IF (NOMODULES { 4) THEN SORTARRAYSIZE ~ 100 ELSE 52100 SORTARRAYSIZE ~ 500 ; 52200 BLOCKTOTAL ~ RSORTNUM ~ 0 ; 52300 UPDATE ~ 0 ; 52400 FOR NN ~ 1 STEP 1 UNTIL 9 DO INA[NN] ~ 0 ; 52500 FOR NN ~ 1 STEP 1 UNTIL 9 DO INE[NN] ~ 0 ; 52600 NOSORT ~ 0 ; RSORTNUM ~ 0 ; 52700 BSAVA ~ BSAVE ~ FALSE ; 52800 EVENTTAPE ~ FALSE ; 52900 SAVETAPES ~ FALSE ; 53000 COMMENT READ TAPE CARDS ; 53100 READ(FILECONTR,FORMCONTR,CONTROLIN)[ENDOFPROG] ; 53200 IF (CONTROL1[1] = "NUMBER") AND (CONTROL1[2] = " OF TA") 53300 AND (CONTROL1[3] = "PES ") THEN 53400 BEGIN 53500 WRITE(PRINTER[DBL],OUTCARD2,CONTROLOUT2) ; 53600 NTAPES ~ CONTROL2[1] ; 53700 IF (NTAPES < 3) THEN 53800 BEGIN 53900 WRITE(PRINTER[DBL],OUTTAPE) ; 54000 NTAPES ~ 3 ; 54100 END ; 54200 READ(FILECONTR,FORMCONTR,CONTROLIN)[ENDOFPROG] ; 54300 END 54400 ELSE NTAPES ~ 3 ; 54500 IF (CONTROL1[1] = "SAVE T") AND (CONTROL1[2] = "APES ") 54600 THEN 54700 BEGIN 54800 SAVETAPES ~ TRUE ; 54900 WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 55000 READ(FILECONTR,FORMCONTR,CONTROLIN)[ENDOFPROG] ; 55100 END ; 55200 IF (CONTROL1[1] = "EVENT ") AND (CONTROL1[2] = "TAPE ") 55300 THEN 55400 BEGIN 55500 EVENTTAPE ~ TRUE ; 55600 WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 55700 READ(FILECONTR,FORMCONTR,CONTROLIN)[ENDOFPROG] ; 55800 END ; 55900 COMMENT READ RUN TYPE CARDS ; 56000 MM ~ MM + 1 ; 56100 IF (CONTROL1[1] = "INPUT ") AND (CONTROL1[2] = "AUDIT ") 56200 THEN 56300 BEGIN 56400 WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 56500 COMMENT SET PARAMETERS FOR AN INPUT AUDIT RUN ; 56600 BLOCKTOTAL ~ 4 ; 56700 FOR NN ~ 1 STEP 1 UNTIL 4 DO BLOC[NN] ~ NN + 1 ; 56800 RSORTNUM ~ 1 ; INA[1] ~ 3 ; 56900 FILL SORTCOL[0,*] WITH 0,1,0,15,15,15 ; 57000 FILL SORTCOL[1,*] WITH 0,3,12,1,2,15 ; 57100 IF EVENTTAPE THEN FILL EVENTCOL[0,*] WITH 0,1,0,10,10,10 ; 57200 GO TO L3 57300 END ; 57400 IF (CONTROL1[1] = "UPDATE") THEN 57500 BEGIN 57600 WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 57700 COMMENT SET PARAMETERS FOR AN UPDATE RUN ; 57800 BLOCKTOTAL ~ 2 ; BLOC[1] ~ 1 ; BLOC[2] ~ 2 ; 57900 READ(PERTC,*,SSAVEREC1) ; 58000 IF (CONTROL1[2] = " WITH ") AND (CONTROL1[3] = "CHANGE") 58100 THEN UPDATE ~ 2 ELSE UPDATE ~ 1 ; 58200 IF EVENTTAPE AND ((UPDATE = 2) AND (EVENTCOL[0,1] ! 0)) 58300 THEN 58400 BEGIN 58500 BLOCPARAM[2] ~ 1 ; 58600 IF (EVENTCOL[0,2] ! 1) THEN 58700 BEGIN 58800 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 58900 BLOC[BLOCKTOTAL] ~ 4 ; 59000 BLOCPARAM[BLOCKTOTAL] ~ 1 ; 59100 NOSORT ~ 1 ; INE[1] ~ BLOCKTOTAL ; 59200 FILL EVENTCOL[1,*] WITH 0,1,1,10,10,10 ; 59300 END ; 59400 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 59500 BLOC[BLOCKTOTAL] ~ 4 ; BLOCPARAM[BLOCKTOTAL] ~ 2 ; 59600 NOSORT ~ NOSORT + 1 ; 59700 FILL EVENTCOL[NOSORT,*] WITH 0,1,1,10,10,10 ; 59800 END ; 59900 IF (UPDATE = 2) THEN 60000 BEGIN 60100 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 60200 BLOC[BLOCKTOTAL] ~ 3 ; 60300 BLOCPARAM[BLOCKTOTAL] ~ BLOCPARAM[2] ; 60400 END ; 60500 IF (UPDATE = 2) OR (SORTCOL[0,2] ! 12) OR 60600 (SORTCOL[0,3] ! 1) OR (SORTCOL[0,4] ! 2) THEN 60700 BEGIN 60800 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 60900 BLOC[BLOCKTOTAL] ~ 4 ; 61000 RSORTNUM ~ 1 ; 61100 INA[1] ~ BLOCKTOTAL ; 61200 FILL SORTCOL[1,*] WITH 0,3,12,1,2,15 ; 61300 END ; 61400 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 61500 BLOC[BLOCKTOTAL] ~ 5 ; 61600 GO TO L3 61700 END ; 61800 L1: IF (CONTROL1[1] = "END OF") AND (CONTROL1[2] = " JOB ") 61900 THEN 62000 BEGIN 62100 IF (MM = 2) THEN 62200 BEGIN 62300 WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 62400 GO TO ENDOFPROG ; 62500 END ; 62600 GO TO EOJ ; 62700 END ; 62800 IF (CONTROL1[1] = "GENERA") AND (CONTROL1[2] = "TE REP") 62900 AND (CONTROL1[3] = "ORTS ") THEN 63000 BEGIN 63100 WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 63200 IF MM = 2 THEN 63300 BEGIN 63400 COMMENT SET PARAMETERS FOR A GENERATE REPORTS RUN ; 63500 BLOCKTOTAL ~ 1 ; BLOC[1] ~ 1 ; 63600 READ(PERTC,*,SAVEREC1) ; 63700 IF SAVETAPES THEN 63800 BEGIN 63900 BSAVE ~ TRUE ; 64000 BSAVA ~ TRUE ; 64100 END ; 64200 END ; 64300 COMMENT READ REPORT CARDS ; 64400 L2: READ(FILECONTR,FORMCONTR,CONTROLIN)[ER2] ; 64500 IF (CONTROL1[1] = "END OF") AND (CONTROL1[2] = " JOB ") 64600 THEN IF (BLOCKTOTAL > 1) THEN GO TO EOJ ELSE 64700 BEGIN 64800 WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 64900 GO TO ENDOFPROG ; 65000 END ; 65100 IF (BLOCKTOTAL = 39) THEN 65200 BEGIN 65300 WRITE(PRINTER[DBL],OUTBLOC) ; 65400 WRITE(PRINTER[DBL],OUTCARD3,CONTROLIN) ; 65500 GO TO ER ; 65600 END ; 65700 IF (CONTROL1[1] = "SORT ") THEN 65800 BEGIN 65900 WRITE(PRINTER[DBL],OUTCARD3,CONTROLIN) ; 66000 IF (CONTROL1[2] = "EVENTS")THEN 66100 BEGIN 66200 IF NOT EVENTTAPE THEN 66300 BEGIN 66400 WRITE(PRINTER[DBL],OUTSEVENT) ; 66500 EVENTTAPE ~ TRUE ; 66600 END ; 66700 IF (INE[NOSORT] = BLOCKTOTAL) THEN 66800 BEGIN 66900 WRITE(PRINTER[DBL],OUTSORTE) ; 67000 GO TO L2 ; 67100 END ; 67200 NOSORT ~ NOSORT + 1 ; 67300 IF NOSORT > 9 THEN 67400 BEGIN 67500 WRITE(PRINTER[DBL],OUTREPORTS) ; 67600 GO TO ER ; 67700 END ; 67800 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 67900 INE[NOSORT] ~ BLOCKTOTAL ; 68000 BLOC[BLOCKTOTAL] ~ 4 ; 68100 BLOCPARAM[BLOCKTOTAL] ~ 1 ; 68200 IF CONTROL2[1] > 4 THEN 68300 BEGIN 68400 WRITE(PRINTER[DBL],OUTSORTKEYS) ; 68500 EVENTCOL[NOSORT,1] ~ 4 ; 68600 END 68700 ELSE EVENTCOL[NOSORT,1] ~ CONTROL2[1] ; 68800 FOR NN ~ 2 STEP 1 UNTIL EVENTCOL[NOSORT,1] + 1 DO 68900 EVENTCOL[NOSORT,NN] ~ CONTROL2[NN] ; 69000 FOR NN ~ EVENTCOL[NOSORT,1] + 2 STEP 1 UNTIL 5 DO 69100 EVENTCOL[NOSORT,NN] ~ 10 ; 69200 GO TO L2 ; 69300 END ; 69400 IF (INA[RSORTNUM] = BLOCKTOTAL) THEN 69500 BEGIN 69600 WRITE(PRINTER,OUTSORTA) ; GO TO L2 ; 69700 END ; 69800 RSORTNUM ~ RSORTNUM + 1 ; 69900 IF RSORTNUM > 9 THEN 70000 BEGIN 70100 WRITE(PRINTER,OUTREPORTS) ; 70200 GO TO ER ; 70300 END ; 70400 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 70500 INA[RSORTNUM] ~ BLOCKTOTAL ; 70600 BLOC[BLOCKTOTAL] ~ 4 ; 70700 IF (CONTROL2[1] > 4) THEN 70800 BEGIN 70900 WRITE(PRINTER[DBL],OUTSORTKEYS) ; 71000 SORTCOL[RSORTNUM,1] ~ 4 ; 71100 END 71200 ELSE SORTCOL[RSORTNUM,1] ~ CONTROL2[1] ; 71300 FOR NN ~ 2 STEP 1 UNTIL SORTCOL[RSORTNUM,1] + 1 DO 71400 SORTCOL[RSORTNUM,NN] ~ CONTROL2[NN] ; 71500 FOR NN ~ SORTCOL[RSORTNUM,1] + 2 STEP 1 UNTIL 5 DO 71600 SORTCOL[RSORTNUM,NN] ~ 15 ; 71700 GO TO L2 71800 END ; 71900 IF (CONTROL1[1] = "LIST ") THEN 72000 BEGIN 72100 IF (CONTROL1[6].[12:24] = "DEPT") THEN 72200 WRITE(PRINTER[DBL],OUTCARD2,CONTROLOUT2) ELSE 72300 WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 72400 IF (CONTROL1[2] = "EVENTS") OR ((CONTROL1[2] = "MILEST") 72500 AND (CONTROL1[3] = "ONES ")) THEN 72600 BEGIN 72700 IF NOT EVENTTAPE THEN 72800 BEGIN 72900 WRITE(PRINTER[DBL],OUTLEVENT) ; 73000 EVENTTAPE ~ TRUE ; 73100 END ; 73200 IF (CONTROL1[6] = "DEPT ") OR (CONTROL1[2] = "MILEST") 73300 THEN 73400 BEGIN 73500 IF (EVENTCOL[NOSORT,2] ! 1) THEN 73600 BEGIN 73700 IF (INE[NOSORT] = BLOCKTOTAL) THEN 73800 WRITE(PRINTER[DBL],OUTSORTDE) ELSE 73900 BEGIN 74000 IF (BLOCKTOTAL = 38) THEN 74100 BEGIN 74200 WRITE(PRINTER[DBL],OUTBLOC) ; 74300 GO TO ER ; 74400 END ; 74500 IF (NOSORT = 9) THEN 74600 BEGIN 74700 WRITE(PRINTER[DBL],OUTLISTDE) ; 74800 GO TO L2 ; 74900 END ; 75000 NOSORT ~ NOSORT + 1 ; 75100 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 75200 INE[NOSORT] ~ BLOCKTOTAL ; 75300 BLOC[BLOCKTOTAL] ~ 4 ; 75400 BLOCPARAM[BLOCKTOTAL] ~ 1 ; 75500 END ; 75600 FILL EVENTCOL[NOSORT,*] WITH 0,1,1,10,10,10 ; 75700 END ; 75800 IF (CONTROL1[6] = "DEPT ") THEN 75900 BEGIN 76000 BLOCPARAM[BLOCKTOTAL+1].[16:3] ~ 1 ; 76100 BLOCPARAM[BLOCKTOTAL+1].[20:3] ~ CONTROL2[1] ; 76200 END 76300 ELSE BLOCPARAM[BLOCKTOTAL+1].[16:3] ~ 2 ; 76400 END ; 76500 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 76600 BLOC[BLOCKTOTAL] ~ 6 ; 76700 BLOCPARAM[BLOCKTOTAL].[9:3] ~ 1 ; 76800 GO TO L2 ; 76900 END ; 77000 IF (CONTROL1[6].[12:24] = "DEPT") THEN 77100 BEGIN 77200 IF ((CONTROL1[6].[42:6] = "J") AND (SORTCOL[RSORTNUM,2] 77300 ! 2)) OR (SORTCOL[RSORTNUM,2] ! 1) THEN 77400 BEGIN 77500 IF (INA[RSORTNUM] = BLOCKTOTAL) THEN 77600 WRITE(PRINTER[DBL],OUTSORTA) ELSE 77700 BEGIN 77800 IF (BLOCKTOTAL = 38) THEN 77900 BEGIN 78000 WRITE(PRINTER[DBL],OUTBLOC) ; 78100 GO TO ER ; 78200 END ; 78300 IF (RSORTNUM = 9) THEN 78400 BEGIN 78500 WRITE(PRINTER[DBL],OUTLISTDA) ; 78600 GO TO L2 ; 78700 END ; 78800 RSORTNUM ~ RSORTNUM + 1 ; 78900 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 79000 INA[RSORTNUM] ~ BLOCKTOTAL ; 79100 BLOC[BLOCKTOTAL] ~ 4 ; 79200 END ; 79300 IF (CONTROL1[6].[42:6] = "J")THEN 79400 FILL SORTCOL[RSORTNUM,*] WITH 0,1,2,15,15,15 79500 ELSE FILL SORTCOL[RSORTNUM,*] WITH 0,1,1,15,15,15 ; 79600 END ; 79700 IF (CONTROL1[6].[42:6] = "J")THEN 79800 BLOCPARAM[BLOCKTOTAL + 1].[16:3] ~ 2 ELSE 79900 BLOCPARAM[BLOCKTOTAL + 1].[16:3] ~ 1 ; 80000 BLOCPARAM[BLOCKTOTAL + 1].[20:3] ~ CONTROL2[1] ; 80100 END ; 80200 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 80300 BLOC[BLOCKTOTAL] ~ 6 ; 80400 FOR NN ~ 3,4 DO 80500 BEGIN 80600 IF (CONTROL1[NN] = "DUMMY ") THEN 80700 BLOCPARAM[BLOCKTOTAL] ~ BLOCPARAM[BLOCKTOTAL] +1 ; 80800 IF (CONTROL1[NN] = "COMPL ") THEN 80900 BLOCPARAM[BLOCKTOTAL] ~ BLOCPARAM[BLOCKTOTAL] + 2 81000 END ; 81100 GO TO L2 81200 END ; 81300 IF (CONTROL1[1] = "PLOT ") THEN 81400 BEGIN 81500 IF (CONTROL1[6].[12:24] = "DEPT") THEN 81600 WRITE(PRINTER[DBL],OUTCARD3,CONTROLOUT3) ELSE 81700 WRITE(PRINTER[DBL],OUTCARD2,CONTROLOUT2) ; 81800 IF (CONTROL1[6].[12:24] = "DEPT") THEN 81900 BEGIN 82000 IF ((CONTROL1[6].[42:6] = "J") AND (SORTCOL[RSORTNUM,2] 82100 ! 2)) OR (SORTCOL[RSORTNUM,2] ! 1) THEN 82200 BEGIN 82300 IF (INA[RSORTNUM] = BLOCKTOTAL) THEN 82400 WRITE(PRINTER[DBL],OUTSORTDA) ELSE 82500 BEGIN 82600 IF(BLOCKTOTAL = 38) THEN 82700 BEGIN 82800 WRITE(PRINTER[DBL],OUTBLOC) ; 82900 GO TO ER ; 83000 END ; 83100 IF RSORTNUM = 9 THEN 83200 BEGIN 83300 WRITE(PRINTER[DBL],OUTPLOT) ; 83400 GO TO L2 ; 83500 END ; 83600 RSORTNUM ~ RSORTNUM + 1 ; 83700 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 83800 INA[RSORTNUM] ~ BLOCKTOTAL ; 83900 BLOC[BLOCKTOTAL] ~ 4 ; 84000 END ; 84100 IF (CONTROL1[5].[42:6] = "J") THEN 84200 FILL SORTCOL[RSORTNUM,*] WITH 0,1,2,15,15,15 84300 ELSE FILL SORTCOL[RSORTNUM,*] WITH 0,1,1,15,15,15 ; 84400 END ; 84500 IF (CONTROL1[5].[42:6] = "J") THEN 84600 BLOCPARAM[BLOCKTOTAL+1].[16:3] ~ 2 ELSE 84700 BLOCPARAM[BLOCKTOTAL+1].[16:3] ~ 1 ; 84800 BLOCPARAM[BLOCKTOTAL+1].[20:3] ~ CONTROL2[2] ; 84900 END ; 85000 IF (CONTROL1[5] = "DAYS ") THEN 85100 BLOCPARAM[BLOCKTOTAL+1].[9:3] ~ 1 ELSE 85200 IF (CONTROL1[5] = "WEEKS ") THEN 85300 BLOCPARAM[BLOCKTOTAL+1].[9:3] ~ 2 ELSE 85400 IF (CONTROL1[5] = "MONTHS") THEN 85500 BLOCPARAM[BLOCKTOTAL + 1].[9:3] ~ 3 ELSE 85600 IF (CONTROL1[5] = "QTRS ") THEN 85700 BLOCPARAM[BLOCKTOTAL+1].[9:3] ~ 4 ELSE 85800 BEGIN 85900 WRITE(PRINTER,OUTPLOT) ; GO TO L2 86000 END ; 86100 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 86200 BLOC[BLOCKTOTAL] ~ 7 ; 86300 FOR NN ~ 3,4 DO 86400 BEGIN 86500 IF (CONTROL1[NN] = "DUMMY ") THEN 86600 BLOCPARAM[BLOCKTOTAL].[12:3] ~ 86700 BLOCPARAM[BLOCKTOTAL].[12:3] + 1 ; 86800 IF (CONTROL1[NN] = "COMPL ") THEN 86900 BLOCPARAM[BLOCKTOTAL].[12:3] ~ 87000 BLOCPARAM[BLOCKTOTAL].[12:3] + 2 ; 87100 END ; 87200 BLOCPARAM[BLOCKTOTAL].[24:24] ~ CONTROL2[1].[24:24] ; 87300 GO TO L2 87400 END 87500 END ; 87600 WRITE(PRINTER[DBL],OUTCARD3,CONTROLIN) ; 87700 WRITE(PRINTER[DBL],OUTER) ; 87800 IF (BLOCKTOTAL } 2) THEN GO TO ER ELSE GO TO ENDOFPROG ; 87900 COMMENT READ OPTION CARDS FOR INPUT AUDIT OR UPDATE RUNS ; 88000 L3: READ(FILECONTR,FORMCONTR,CONTROLIN)[ER2] ; 88100 IF (CONTROL1[1] = "DATA O") AND (CONTROL1[2] = "N TAPE") 88200 THEN 88300 BEGIN 88400 WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 88500 IF (UPDATE = 0) THEN BLOCPARAM[1].[40:3] ~ 1 88600 ELSE BLOCPARAM[2].[40:3] ~ 1 ; 88700 GO TO L3 ; 88800 END ; 88900 IF (CONTROL1[1] = "ONE TI") AND (CONTROL1[2] = "ME ") 89000 THEN 89100 BEGIN 89200 WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 89300 ONETIME ~ TRUE ; GO TO L3 ; 89400 END ; 89500 IF (CONTROL1[1] = "LIST E") AND (CONTROL1[2] = "ND TAL") 89600 AND (CONTROL1[3] = "LIES ") THEN 89700 BEGIN 89800 WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 89900 LISTTAL ~ TRUE ; GO TO L3 ; 90000 END ; 90100 COMMENT SET GLOBAL PARAMETERS ; 90200 IF UPDATE = 0 THEN 90300 BEGIN 90400 CHAINLENGTH ~ MAXNOACT ~ MAXNOEVN ~ 511 ; 90500 NUMENDING ~ NUMSTARTING ~ 10 ; WDPW ~ 5 ; 90600 END ; 90700 L4: MM ~ MM + 1 ; 90800 IF (CONTROL1[1] = "CHAIN ") AND (CONTROL1[2] = "LENGTH") 90900 THEN CHAINLENGTH ~ CONTROL2[1] ELSE 91000 IF (CONTROL1[2] = " ACTIV") AND (CONTROL1[3] = "ITIES ") 91100 THEN MAXNOACT ~ CONTROL2[1] ELSE 91200 IF (CONTROL1[2] = " EVENT") AND (CONTROL1[3] = "S ") 91300 THEN MAXNOEVN ~ CONTROL2[1] ELSE 91400 IF (CONTROL1[1] = "WORKIN") AND (CONTROL1[2] = "G DAYS") 91500 AND (CONTROL1[3] = " PER W") AND (CONTROL1[4] = 91600 "EEK ") THEN 91700 BEGIN 91800 WDPW ~ CONTROL2[1] ; 91900 IF (WDPW > 7) OR (WDPW < 1) THEN 92000 BEGIN 92100 WRITE(PRINTER[DBL],OUTCARD2,CONTROLOUT2) ; 92200 WRITE(PRINTER[DBL],OUTWDPW) ; 92300 GO TO ENDOFPROG ; 92400 END 92500 END ELSE 92600 IF (CONTROL1[2] = " ENDIN") AND (CONTROL1[3] = "G EVEN") 92700 AND (CONTROL1[4] = "TS ") THEN NUMENDING ~ 92800 CONTROL2[1] ELSE 92900 IF (CONTROL1[2] = " START") AND (CONTROL1[3] = "ING EV") 93000 AND (CONTROL1[4] = "ENTS ") THEN NUMSTARTING ~ 93100 CONTROL2[1] ELSE GO TO L1 ; 93200 WRITE(PRINTER[DBL],OUTCARD2,CONTROLOUT2) ; 93300 READ(FILECONTR,FORMCONTR,CONTROLIN)[ER2] ; 93400 IF MM < 8 THEN GO TO L4 ; 93500 GO TO L1 ; 93600 ER: READ(FILECONTR,FORMCONTR,CONTROLIN)[ER2] ; 93700 IF (CONTROL1[1] ! "END OF") AND (CONTROL1[2] ! " JOB ") 93800 THEN 93900 BEGIN 94000 WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 94100 GO TO ER ; 94200 END ; 94300 EOJ: WRITE(PRINTER[DBL],OUTCARD1,CONTROLOUT1) ; 94400 BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 94500 BLOC[BLOCKTOTAL] ~ 8 ; 94600 READ(FILECONTR,FORMCONTR,CONTROLIN)[L5] ; 94700 WRITE(PRINTER[DBL],OUTEOF) ; 94800 ER4: WRITE(PRINTER[DBL],OUTCARD3,CONTROLIN) ; 94900 READ(FILECONTR,FORMCONTR,CONTROLIN)[L5] ; 95000 GO TO ER4 ; 95100 ER2: IF BLOCKTOTAL < 40 THEN BLOCKTOTAL ~ BLOCKTOTAL + 1 ; 95200 BLOC[BLOCKTOTAL] ~ 8 ; 95300 L5: END CONTROL BLOCK ; 95400 BEGIN 95500 COMMENT 95600 DEFINITIONS OF GLOBAL VARIABLES 95700 EK NUMBER OF ENDING EVENTS 95800 BK NUMBER OF STARTING EVENTS 95900 TP TEMPORARY TAPEKEY 96000 REEV ARRAY CONTAINING RENUMBERED ENDING EVENTS 96100 RBEV ARRAY CONTAINING RENUMBERED STARTING EVENTS 96200 EVENT ARRAY CONTAINING EVENT NUMBERS 96300 RIRJ PACKED ARRAY CONTAINING RENUMBERED PREDECESSOR 96400 AND SUCCESSOR EVENT NUMBERS FOR EACH ACTIVITY 96500 ; 96600 INTEGER EK,BK,TP ; 96700 INTEGER ARRAY REEV[0:NUMENDING],RBEV[0:NUMSTARTING] ; 96800 INTEGER ARRAY EVENT[0:MAXNOEVN.[30:9],0:IF MAXNOEVN.[30:9] = 0 THEN 96900 MAXNOEVN.[39:9] ELSE 511] , 97000 RIRJ[0:MAXNOACT.[30:9],0:IF MAXNOACT.[30:9] = 0 97100 THEN MAXNOACT.[39:9] ELSE 511] ; 97200 LIST TREC(KEY,I,J,RRIJ,ET,VAR,ASD,ADAYS,ES,LF,SL,SVAR,RANKI, 97300 TAL,FOR LL ~ 1 STEP 1 UNTIL 4 DO REMARKS[LL]) ; 97400 LIST EREC(RN,EVNO,RANKE,EEO,EVAR,LEO,SLCK,TALLY,FOR LL ~ 1 STEP 97500 1 UNTIL 4 DO DSCPT[LL]) ; 97600 LIST SAVEREC2(FOR LL ~ 0 STEP 1 UNTIL NOACTCOL DO 97700 RIRJ[K,LL]), 97800 SAVEREC3(FOR LL ~ 0 STEP 1 UNTIL NOEVNCOL DO EVENT[K,LL]); 97900 LABEL BLOCK1,BLOCK2,BLOCK3,BLOCK4,BLOCK5,BLOCK6,BLOCK7, 98000 ORIGIN,FINISH ; 98100 SWITCH BLOCKCONTROL ~ BLOCK1,BLOCK2,BLOCK3,BLOCK4,BLOCK5,BLOCK6, 98200 BLOCK7,FINISH ; 98300 IF EVENTTAPE THEN 98400 FILL EVENTITEM[*] WITH " RENUM"," EVENT"," RANK", 98500 " EEO"," EVAR"," LEO"," SLACK"," TALLY", 98600 " "," "," " ; 98700 RSORTNUM ~ 0 ; 98800 NOBLOCK ~ 0 ; 98900 NCPR ~ 12 ; 99000 NWPR ~ 19 ; 99100 NOSORT ~ 0 ; 99200 COMMENT CONTROL ROUTINE ; 99300 ORIGIN: NOBLOCK ~ NOBLOCK + 1 ; 99400 GO TO BLOCKCONTROL[BLOC[NOBLOCK]] ; 99500 BLOCK1: BEGIN 99600 COMMENT READ SAVE RECORDS BLOCK ; 99700 FOR K ~ 0 STEP 1 UNTIL NOACTROW DO 99800 READ(PERTC,*,SAVEREC2) ; 99900 FOR K ~ 0 STEP 1 UNTIL NOEVNROW DO 100000 READ(PERTC,*,SAVEREC3) ; 100100 IF SAVETAPES THEN 100200 BEGIN 100300 LOCK(PERTC,SAVE) ; 100400 INST[1,0] ~ FILENAMES[3] ; 100500 TYPEOUT(SPOOUT,INST[1,*]) ; TYPEOUT(SPOOUT,INST[5,*]) ; 100600 END 100700 ELSE PURGE(PERTC,1) ; 100800 END ; 100900 GO TO ORIGIN ; 101000 BLOCK2: BEGIN 101100 COMMENT 101200 DEFINITIONS OF VARIABLES IN AUDIT BLOCK 101300 OT OPTIMISTIC TIME ESTIMATE 101400 ML MOST LIKELY TIME ESTIMATE 101500 PT PESSIMISTIC TIME ESTIMATE 101600 BOOL2 BOOLEAN FLAG, TRUE IF ERROR FOUND IN AUDIT BLOCK 101700 BOOL4 BOOLEAN FLAG, TRUE IF ERROR IN TIME ESTIMATES 101800 WEEKFLAG BOOLEAN FLAG, TRUE IF TIME ESTIMATES ARE GIVEN 101900 IN WEEKS 102000 BTAPE BOOLEAN FLAG, TRUE IF ACTIVITY BEING AUDITED 102100 WAS READ FROM ACTIVITY TAPE FILE 102200 ASDAT ACTIVITY DATE 102300 DAS DAY OF THE MONTH OF NETWORK START DATE 102400 MOS MONTH NUMBER OF NETWORK START DATE 102500 YRS YEAR OF NETWORK START DATE 102600 DAR DAY OF THE MONTH OF NETWORK REPORT DATE 102700 MOR MONTH NUMBER OF REPORT DATE 102800 YRR YEAR OF REPORT DATE 102900 DAA DAY OF THE MONTH OF ACTIVITY DATE 103000 MOA MONTH NUMBER OF ACTIVITY DATE 103100 YRA YEAR OF ACTIVITY DATE 103200 NINES 9999999999 103300 CSDATE CORRECTED NETWORK START DATE 103400 CRDATE CORRECTED REPORT DATE 103500 CASDATE CORRECTED ACTIVITY DATE 103600 SWER FLAG TO DENOTE TYPE OF ERROR IN AN AUDITED DATE 103700 IKEY KEY NUMBER OF ACTIVITY CARD 103800 CODE FLAG TO DENOTE TYPE OF ACTIVITY CARD 103900 0 INITIAL ACTIVITES FOR INPUT AUDIT RUN 104000 1 UPDATE ACTIVITY TIMES 104100 2 ADD NEW ACTIVITY 104200 3 DELETE ACTIVITY 104300 NLINE NUMBER OF LINES PRINTED ON PAGE BY PRINTER 104400 TLINE TOTAL NUMBER PRINTED LINES ALLOWED PER PAGE 104500 PAGEN PAGE NUMBER 104600 SI PREDECESSOR EVENT NUMBER ON ACTIVITY TAPE FILE 104700 SJ SUCCESSOR EVENT NUMBER ON ACTIVITY TAPE FILE 104800 SASD FLAG ON ACTIVITY TAPE FILE DENOTING TYPE OF 104900 ACTIVITY DATE 105000 TAPEKEY KEY OF NEXT ACTIVITY ON ACTIVITY TAPE FILE 105100 TKEY INDEX FOR READING ACTIVITY TAPE FILE 105200 DELETEKEYS NUMBER OF DELETED ACTIVITIES 105300 AC TAPE KEY REFERRING TO NETWORK DATA FILE 105400 DPM ARRAY CONTAINING NUMBER OF DAYS IN EACH MONTH 105500 TALLIES PACKED ARRAY CONTAINING NUMBER OF TIMES 105600 RENUMBERED EVENTS ARE USED AS PREDECESSORS AND 105700 SUCCESSORS OF ACTIVITIES AND NUMBER OF PRECEDING 105800 ACTIVITIES THAT HAVE BEEN COMPLETED 105900 SHEAD ARRAY CONTAINING SCRAMBLE TABEL FOR RENUMBERING 106000 MONTH ARRAY CONTAINING ABBREVIATION OF EACH MONTH 106100 SREMARKS ARRAY CONTAINING ACTIVITY DESCRIPTION ON 106200 ACTIVITY TAPE FILE 106300 ITEMS ARRAY CONTAINING TYPE OF NETWORK DATA - EVENTS 106400 OR ACTIVITIES 106500 K,L,KR,KC,KRI,KCI,KRJ,KCJ INDICES OF ARRAYS 106600 TEMP,TEMP1 TEMPORARY LOCAL VARIABLES 106700 ; 106800 COMMENT AUDIT BLOCK ; 106900 REAL OT,ML,PT; 107000 BOOLEAN BOOL2,BOOL4 ; 107100 BOOLEAN WEEKFLAG ; 107200 BOOLEAN BTAPE ; 107300 LABEL START,LL1,LL2,LL4,LL5,ERR11,ERR12,ERR13,ERR21,ERR22,ERR23, 107400 LL3,EOF,LL1A,LL2A ; 107500 LABEL CODE1 ; 107600 LABEL CODE3 ; 107700 LABEL LL1B,LL2B ; 107800 LABEL LL6,LL7 ; 107900 LABEL LOOP2,LL5A,LOOP3,EOF3 ; 108000 INTEGER ASDAT,DAS,MOS,YRS,DAR,MOR,YRR,DAA,MOA,YRA,NINES,CSDATE, 108100 CRDATE,CASDAT,SWER,TEMP1,K,L ; 108200 INTEGER IKEY,CODE ; 108300 INTEGER NLINE,TLINE,PAGEN ; 108400 INTEGER KR,KC,TEMP ; 108500 INTEGER SI,SJ,SASD,TAPEKEY ; 108600 INTEGER TKEY,DELETEKEYS ; 108700 INTEGER AC ; 108800 INTEGER ARRAY DPM[0:12] ; 108900 INTEGER ARRAY TALLIES[0:MAXNOEVN.[30:9],0:IF MAXNOEVN.[30:9] = 0 THEN 109000 MAXNOEVN ELSE 511] ; 109100 INTEGER ARRAY SHEAD[0:100] ; 109200 ALPHA ARRAY MONTH[0:12],SREMARKS[0:4] ; 109300 ALPHA ARRAY ITEMS[0:2] ; 109400 SWITCH SW1 ~ LL3,ERR11,ERR12,ERR13 ; 109500 SWITCH SW2 ~ LL4,ERR21,ERR22,ERR23 ; 109600 SWITCH SW3 ~ CODE1,LL1A,CODE3 ; 109700 FILE IN CARDR(2,10) ; 109800 FILE IN TAPER(2,56,10) ; 109900 SWITCH FILE SWA ~ CARDR,TAPER ; 110000 LIST DATA1(FOR LL ~ 1 STEP 1 UNTIL 13 DO NETNAME[LL],RUN,SDATE, 110100 RDATE,PERIOD), 110200 DATA2(IKEY,I,J,OT,ML,PT,ASDAT,ASD,FOR LL ~ 1 STEP 1 UNTIL 110300 4 DO REMARKS[LL],CODE) , 110400 OUTER41(FOR LL ~ 1 STEP 1 UNTIL 13 DO NETNAME[LL]), 110500 OUTERACT(I,J), 110600 STREC(KEY,SI,SJ,RRIJ,ET,VAR,SASD,ADAYS,ES,LF,SL,SVAR, 110700 RANKI,TAL,FOR LL ~ 1 STEP 1 UNTIL 4 DO SREMARKS[LL]), 110800 OUTH(PAGEN,FOR LL ~ 1 STEP 1 UNTIL 13 DO NETNAME[LL],RUN, 110900 DAS,MONTH[MOS],YRS,DAR,MONTH[MOR],YRR,PERIOD), 111000 OUT1(FOR LL ~ 1 STEP 1 UNTIL 13 DO NETNAME[LL],PAGEN), 111100 OUT3(NOACT,MINEV,NOEVN,MAXEV) ; 111200 LIST DATA3(FOR LL ~ 1 STEP 1 UNTIL 2 DO ITEMS[LL]), 111300 DATA4(EVNO,FOR LL ~ 1 STEP 1 UNTIL 4 DO DSCPT[LL]) ; 111400 LIST ENDEVENT(EVENT[KR,KC],TALLIES[KR,KC].[30:9]), 111500 STARTEVENT(EVENT[KR,KC],TALLIES[KR,KC].[21:9]), 111600 NET(FOR LL ~ 1 STEP 1 UNTIL 13 DO NETNAME[LL]), 111700 TALS(EVENT[KR,KC],TALLIES[KR,KC].[30:9], 111800 TALLIES[KR,KC].[21:9],TALLIES[KR,KC].[39:9]) ; 111900 FORMAT IN FIN1(13A6,X2/I10,2I7,X3,A5), 112000 FIN2(I6,2I10,3F7.1,I6,I1,4A6,I2) ; 112100 FORMAT IN FIN3(2A6), 112200 FIN4(I10,X5,4A6) ; 112300 FORMAT OUT FORMH(////////////////////"TIME P.E.R.T. - INPUT AND ", 112400 "AUDIT OF ACTIVITY CARDS",X61,"PAGE",I6///"NETWORK ", 112500 "NAME",X3,13A6,X10,"RUN",I10///"START DATE ",I3,X1, 112600 A3,I3,X4,"REPORT DATE ",I3,X1,A3,I3,X4,"UNITS OF ", 112700 "TIME ",A5), 112800 FOUT1("NETWORK NAME",X3,13A6,X17,"PAGE",I6), 112900 FOUT2(I6,2I11,3F8.1,I7,I4,X2,4A6,I4), 113000 FOUT3("NUMBER OF ACTIVITES",I7,X5, 113100 "MINIMUM EVENT NUMBER",I11/ 113200 "NUMBER OF EVENTS",I10,X5, 113300 "MAXIMUM EVENT NUMBER",I11), 113400 SPO3("ERRORS WERE DETECTED") , 113500 FOUT4(I10,X5,4A6), 113600 FORMH4("LISTING OF ACTIVITY CARDS"//X3,"KEY",X7,"PRED",X7, 113700 "SUCC OT",X6,"ML",X6,"PT DATE TYPE ", 113800 "ACTIVITY DESCRIPTION CODE"/), 113900 FORMH5("LISTING OF EVENT CARDS"//"EVENT NUMBER",X10, 114000 "EVENT DESCRIPTION"/), 114100 TAPEERROR("EVENT DESCRIPTION CARDS ARE PRESENT ALTHOUGH ", 114200 "NO EVENT TAPE IS SPECIFIED"/"AN EVENT TAPE IS ", 114300 "ASSUMED"/), 114400 UPDATEERROR("EVENT TAPE IS TO BE UPDATED ALTHOUGH ", 114500 "NETWORK CHANGES ARE NOT SPECIFIED"/"CHANGES ARE ", 114600 "ASSUMED"/) ; 114700 FORMAT OUT ENDERROR("ENDING EVENT",I10," HAS",I5," ACTIVITIES ", 114800 "LEADING INTO IT. ONLY ONE IS PERMITTED."), 114900 STARTERROR("STARTING EVENT",I10," HAS",I5," ACTIVITIES ", 115000 "LEADING FROM IT. ONLY ONE IS PERMITTED."), 115100 HEADNET(13A6), 115200 HEADTALS(X21,"NO. PRED. NO. SUCC. NO. COM."/X10, 115300 "EVENT",X8,"EVENTS",X9,"EVENTS PRED. EVENTS"), 115400 OUTTALS(4I15), 115500 STARTINGERROR("TOO FEW STARTING EVENTS WERE ESTIMATED"), 115600 ENDINGERROR("TOO FEW ENDING EVENTS WERE ESTIMATED") ; 115700 FORMAT OUT ERROR1("PRED EVENT NO. OUT OF RANGE") , 115800 ERROR2("SUCC EVENT NO. OUT OF RANGE") , 115900 ERROR5("SUCC EVENT NO. EQUALS PRED EVENT NO.") , 116000 ERROR6("OT IS GREATER THAN ML , OT SET EQUAL TO ML") , 116100 ERROR7("ML IS GREATER THAN PT , PT SET EQUAL TO ML") , 116200 ERROR8("THE CORRECTED ACTIVITY RECORD IS AS FOLLOWS") , 116300 ERROR9("INVALID NETWORK START DATE") , 116400 ERROR10("INVALID NETWORK REPORT DATE") , 116500 ERROR11("REPORT DATE EARLIER THAN START DATE,SET EQUAL") , 116600 ERROR12("ACTUAL START DATE LATER THAN REPORT DATE ", 116700 ", SET EQUAL") , 116800 ERROR13("ACTUAL COMP. DATE LATER THAN REPORT DATE ", 116900 ", SET EQUAL") , 117000 ERROR14("DIRECTED START DATE EARLIER THAN REPORT DATE ", 117100 ", SET EQUAL") , 117200 ERROR15("SCHEDULE DATE EARLIER THAN REPORT DATE , SET" , 117300 " EQUAL") , 117400 ERROR16("INVALID ACTUAL START DATE") , 117500 ERROR17("INVALID COMPLETION DATE") , 117600 ERROR18("INVALID DIRECTED START DATE") , 117700 ERROR19("INVALID SCHEDULE DATE") , 117800 ERROR20("ACTUAL START DATE EARLIER THAN NETWORK START ", 117900 "DATE , SET EQUAL") , 118000 ERROR21("ACTUAL COMPLETION DATE EARLIER THAN NETWORK ", 118100 "START DATE, SET EQUAL") , 118200 ERROR24("OT IS ZERO AND ML IS NON-ZERO , SET EQUAL") , 118300 ERROR25("NETWORK START DATE IS NOT A WORKING DAY") , 118400 ERROR26("NETWORK REPORT DATE IS NOT A WORKING DAY"), 118500 ERROR27("ACTUAL START DATE NOT A WORKING DAY") , 118600 ERROR28("ACTUAL COMP. DATE NOT A WORKING DAY") , 118700 ERROR29("DIRECTED START DATE NOT A WORKING DAY") , 118800 ERROR30("SCHEDULE DATE NOT A WORKING DAY") , 118900 ERROR33("NETWORK START DATE IS NOT VALID OR A WORKING " , 119000 "DAY") , 119100 ERROR34("REPORT DATE IS NOT VALID OR A WORKING DAY") , 119200 ERROR35("ACTUAL START DATE IS NOT VALID OR A WORKING DAY" 119300 ) , 119400 ERROR36("ACTUAL COMP. DATE IS NOT VALID OR A WORKING ", 119500 "DAY") , 119600 ERROR37("DIRECTED START DATE IS NOT VALID OR A WORKING ", 119700 "DAY") , 119800 ERROR38("SCHEDULE DATE IS NOT VALID OR A WORKING DAY") , 119900 ERROR39("NO. OF ACTIVITIES EXCEEDS MAX NO. ALLOWED"), 120000 ERROR40("NO. OF EVENTS EXCEEDS MAX NO. ALLOWED"), 120100 ERROR41(13A6/"NETWORK NAME FOR UPDATE DIFFERENT FROM ", 120200 "NETWORK NAME ON TAPE. UPDATE NOT PERFORMED"/), 120300 ERROR42("NETWORK STARTING DATE FOR UPDATE DIFFERENT FROM", 120400 "STARTING DATE ON TAPE. TAPE STARTING DATE USED."), 120500 ERROR43("CHANGES WERE MADE IN THE NETWORK ALTHOUGH ", 120600 "UNSPECIFIED."), 120700 ERROR44("UPDATE ACTIVITIES OUT OF SEQUENCE. ACTIVITY ", 120800 "IGNORED"), 120900 ERROR45("NO ACTIVITIES CARD BEFORE ACTIVITY DATA CARDS"), 121000 ERROR46("ACTIVITY ",I10," TO",I10," NOT A STARTING ", 121100 "ACTIVITY, DIRECTED START DATE NOT PERMITTED"), 121200 ERROR47("ACTIVITY ",I10," TO",I10," NOT AN ENDING ", 121300 "ACTIVITY, SCHEDULE DATE NOT PERMITTED") ; 121400 PROCEDURE UNPACK(MODAYR,SDAYS,WDPW,DPM,MO,DA,YR,DAYS,CMODAYR,SWER) ; 121500 COMMENT THIS PROCEDURE UNPACKS DATE MODAYR INTO MONTH NO., DAY, 121600 AND YEAR AND CALCULATES NO. OF WORKING DAYS FROM SDAYS ; 121700 COMMENT 121800 DEFINITION OF VARIABLES IN PROCEDURE UNPACK 121900 MODAYR DATE TO BE UNPACKED 122000 SDAYS NUMBER OF WORKING DAYS FROM 1/1/62 TO A GIVEN 122100 DATE 122200 WDPW NUMBER OF WORKING DAYS PER WEEK 122300 MO MONTH NUMBER OF MODAYR 122400 DA DAY OF THE MONTH OF MODAYR 122500 YR YEAR OF MODAYR 122600 DAYS NUMBER OF WORKING DAYS FROM A GIVEN DATE UNTIL 122700 MODAYR 122800 CMODAYR NEAREST VALID CALEDAR DATE TO MODAYR 122900 SWER FLAG DENOTING TYPE OF ERROR IN DATE MODAYR 123000 DPM ARRAY CONTAINING NUMBER OF DAYS IN EACH MONTH 123100 TEMP NUMBER OF YEARS FROM NEAREST LEAP YEAR TO YR 123200 YEARS NUMBER OF YEARS FROM 62 TO YR 123300 TYEARS NUMBER OF YEARS FROM 61 TO YR 123400 LYEARS NUMBER OF LEAP YEARS FROM 61 TO YR 123500 RYEARS NUMBER OF NON-LEAP YEARS FROM 61 TO YR 123600 YDAYS NUMBER OF DAYS IN YEARS 123700 MDAYS NUMBER OF DAYS FROM FIRST DAY OF YR UNTIL THE 123800 FIRST DAY OF MONTH MO 123900 WEEKS NUMBER OF WHOLE WORKING WEEKS FROM 1/1/62 UNTIL 124000 MODAYR 124100 REMDA DAYS NOT INCLUDEDED IN WEEKS 124200 BOOL BOOLEAN FLAG, TRUE IF ERROR IN DATE 124300 I INDEX OF ARRAY DPM 124400 ; 124500 VALUE MODAYR,SDAYS,WDPW ; 124600 INTEGER MODAYR,SDAYS,WDPW,MO,DA,YR,DAYS,CMODAYR,SWER ; 124700 INTEGER ARRAY DPM[0] ; 124800 BEGIN 124900 INTEGER TEMP,YEARS,TYEARS,LYEARS,RYEARS,YDAYS,MDAYS,I,WEEKS, 125000 REMDA ; 125100 BOOLEAN BOOL ; 125200 LABEL L1,L2,L3,L4,L5,L6,L7 ; 125300 BOOL ~ FALSE ; 125400 COMMENT UNPACK MODAYR INTO MONTH NO, DAY, AND YEAR ; 125500 YR ~ MODAYR MOD 100 ; 125600 SWER ~ 1 ; 125700 MO ~ MODAYR DIV 10000 ; 125800 DA ~ MODAYR DIV 100 MOD 100 ; 125900 COMMENT CHECK VALIDITY OF DATE ; 126000 IF YR } 62 THEN GO TO L1 ; 126100 YR ~ 62 ; MO ~ DA ~ 1 ; 126200 BOOL ~ TRUE ; GO TO L6 ; 126300 L1: IF YR { 80 THEN GO TO L2 ; 126400 YR ~ 80 ; MO ~ 12 ; DA ~ 31 ; 126500 BOOL ~ TRUE ; GO TO L6 ; 126600 L2: IF MO } 1 THEN GO TO L3 ; 126700 MO ~ DA ~ 1 ; BOOL ~ TRUE ; GO TO L6 ; 126800 L3: IF MO { 12 THEN GO TO L4 ; 126900 MO ~ 12 ; DA ~ 31 ; BOOL ~ TRUE ; GO TO L6 ; 127000 L4: IF DA } 1 THEN GO TO L5 ; 127100 DA ~ 1 ; BOOL ~ TRUE ; GO TO L6 ; 127200 L5: IF DA { DPM[MO] THEN GO TO L6 ; 127300 TEMP ~ YR MOD 4 ; 127400 IF (MO = 2) AND (TEMP = 0) AND (DA = 29) THEN GO TO L6 ; 127500 DA ~ DPM[MO] ; BOOL ~ TRUE ; 127600 L6: YEARS ~ YR - 62 ; 127700 COMMENT CALCULATE NO. OF WORKING DAYS SINCE SDAYS ; 127800 IF (YEARS = 0) AND (MO = 1) THEN 127900 BEGIN 128000 DAYS ~ DA ; GO TO L7 128100 END ; 128200 TYEARS ~ YEARS + 1 ; 128300 LYEARS ~ TYEARS DIV 4 ; 128400 RYEARS ~ YEARS - LYEARS ; 128500 YDAYS ~ (365 | RYEARS)+(366 | LYEARS) ; 128600 MDAYS ~ 0 ; 128700 FOR I ~ 1 STEP 1 UNTIL MO-1 DO MDAYS ~ MDAYS + DPM[I] ; 128800 IF (YR MOD 4 = 0) AND (MO > 2) THEN MDAYS ~ MDAYS + 1 ; 128900 DAYS ~ YDAYS + MDAYS + DA ; 129000 L7: CMODAYR ~ 0 ; 129100 WEEKS ~ DAYS DIV 7 ; 129200 REMDA ~ DAYS - (WEEKS | 7) ; 129300 DAYS ~ (WEEKS | WDPW) + REMDA - SDAYS ; 129400 IF BOOL THEN CMODAYR ~ MO | 10000 + DA | 100 + YR ; 129500 COMMENT CHECK THAT DATE IS A WORKING DAY ; 129600 IF ( ( WDPW ! 7) AND((REMDA > WDPW) OR (REMDA = 0))) 129700 THEN 129800 BEGIN 129900 IF BOOL THEN SWER ~ 4 ELSE SWER ~ 3 130000 END ; 130100 IF BOOL THEN SWER ~ 2 130200 END UNPACK ; 130300 PROCEDURE RENUMBER ; 130400 COMMENT THIS PROCEDURE RENUMBERS EVENTS ; 130500 COMMENT 130600 DEFINITIONS OF VARIABLES USED IN THE PROCEDURE RENUMBER 130700 SCRAMBLEINDEX INDEX FOR ARRAY SHEAD 130800 M,MM TEMPORARY LOCAL VARIABLES 130900 LIFO BOOLEAN VARIABLE, TRUE IF EVENT NUMBERS ARE TO 131000 BE CHECKED FROM LAST TO FIRST 131100 THIS PROCEDURE USES THE FOLLOWING VARIABLES DECLARED IN 131200 OUTER BLOCKS 131300 EVENT,MAXNOEVN,NOEVN,TALLIES,SHEAD 131400 EVNO,EVENTTAPE,RN 131500 ; 131600 BEGIN 131700 INTEGER SCRAMBLEINDEX,M,MM ; 131800 BOOLEAN LIFO ; 131900 LABEL RETEST,RETURN ; 132000 DEFINE I = M.[30:9],M.[39:9]#, 132100 II = MM.[30:9],MM.[39:9]#, 132200 DEFTALI = TALLIES[I].[3:18]#, 132300 DEFTALII = TALLIES[II].[3:18]# ; 132400 LIFO ~ TRUE ; 132500 SCRAMBLEINDEX ~ (EVNO.[42:6] + EVNO.[36:6] + EVNO.[30:6] + 132600 EVNO.[24:6] + EVNO.[18:6] + EVNO.[12:6] + EVNO.[6:6]) 132700 MOD 100 ; 132800 M ~ SHEAD[SCRAMBLEINDEX] ; 132900 IF M = 0 THEN 133000 BEGIN 133100 IF NOEVN = MAXNOEVN THEN 133200 BEGIN 133300 WRITE(PRINTER,ERROR40) ; 133400 GO TO FINISH ; 133500 END ; 133600 RN ~ M ~ NOEVN ~ NOEVN + 1 ; 133700 SHEAD[SCRAMBLEINDEX] ~ M ; 133800 EVENT[I] ~ EVNO ; 133900 IF EVENTTAPE THEN WRITE(SWF[NE],*,EREC) ; 134000 GO TO RETURN ; 134100 END ; 134200 RETEST: IF EVENT[I] = EVNO THEN 134300 BEGIN 134400 RN ~ M ; GO TO RETURN ; 134500 END ; 134600 MM ~ M ; 134700 M ~ DEFTALI ; 134800 IF M ! 0 THEN GO TO RETEST ; 134900 IF NOEVN = MAXNOEVN THEN 135000 BEGIN 135100 WRITE(PRINTER,ERROR40) ; 135200 GO TO FINISH ; 135300 END ; 135400 RN ~ M ~ NOEVN ~ NOEVN + 1 ; 135500 EVENT[I] ~ EVNO ; 135600 IF EVENTTAPE THEN WRITE(SWF[NE],*,EREC) ; 135700 IF LIFO THEN 135800 BEGIN 135900 DEFTALI ~ SHEAD[SCRAMBLEINDEX] ; 136000 SHEAD[SCRAMBLEINDEX] ~ M ; 136100 END 136200 ELSE DEFTALII ~ M ; 136300 RETURN: END RENUMBER ; 136400 PROCEDURE CARDAUDIT(I,J,ASD,REMARKS) ; 136500 COMMENT THIS PROCEDURE AUDITS ACTIVITY DATA ; 136600 COMMENT 136700 DEFINITION OF VARIABLES IN PROCEDURE CARDAUDIT 136800 I PREDECESSOR EVENT NUMBER 136900 J SUCCESSOR EVENT NUMBER 137000 ASD FLAG DENOTING TYPE OF ACTIVITY DATE 137100 REMARKS ARRAY CONTAINING ACTIVITY DESCRIPTION 137200 THIS PROCEDURE USES THE FOLLOWING VARIABLES DECLARED IN 137300 OUTER BLOCKS 137400 KEY,BOOL4,UPDATE,RIRJ,EVNO,RN,SDAYS,DPM,SWER 137500 RRIJ,BTAPE,NINES,BOOL2,MINEV,MAXEV,ADAYS 137600 ONETIME,OT,PT,ML,ET,VAR,RDAYS,RDATE,DAA,DAR,MOA, 137700 MOR,YRA,YRR,ASDAT,CASDAT,SDATE,DAS,MOS,YRS,WDPW, 137800 NOACT,WEEKFLAG,TALLIES 137900 ; 138000 VALUE I,J,ASD ; 138100 INTEGER I,J,ASD; 138200 ALPHA ARRAY REMARKS[0] ; 138300 BEGIN 138400 LABEL L1,L2,L3,L5,L7,LL3,LL6,LL7,LL8,LL9,LL10,LL11,LL12,LL13, 138500 LL14,LL15,LL16,LL17,LL18,LL19,LL20,LL21,LL22,LL23,ERR4, 138600 ERR5,ERR6,ERR7,ERR31,ERR32,ERR33,EER,L6,L8 ; 138700 LABEL L9 ; 138800 SWITCH SW1 ~ LL8,LL9,LL10,LL11 ; 138900 SWITCH SW2 ~ ERR4,ERR5,ERR6,ERR7 ; 139000 SWITCH SW3 ~ LL16,LL17,LL18,LL19 ; 139100 SWITCH SW4 ~ LL20,LL21,LL22,LL23 ; 139200 SWITCH SW5 ~ LL6,ERR31,ERR32,ERR33 ; 139300 DEFINE DKEY = KEY.[30:9],KEY.[39:9]# ; 139400 DEFINE CI = TALLIES[RRIJ.[8:9],RRIJ.[17:9]].[21:9]#, 139500 CJ = TALLIES[RRIJ.[30:9],RRIJ.[39:9]].[30:9]#, 139600 AT = TALLIES[RRIJ.[30:9],RRIJ.[39:9]].[39:9]# ; 139700 BOOL4 ~ FALSE ; 139800 COMMENT RENUMBER PREDECESSOR AND SUCCESSOR EVENTS AND COMPUTE 139900 TALLIES ; 140000 IF UPDATE ! 1 THEN 140100 BEGIN 140200 EVNO ~ I ; 140300 RENUMBER ; 140400 RRIJ.[4:22] ~ RN.[26:22] ; 140500 END ; 140600 CI ~ CI + 1 ; 140700 IF UPDATE ! 1 THEN 140800 BEGIN 140900 EVNO ~ J ; 141000 RENUMBER ; 141100 RRIJ.[26:22] ~ RN.[26:22] ; 141200 END ; 141300 CJ ~ CJ + 1 ; 141400 IF ASD = 2 THEN AT ~ AT + 1 ; 141500 IF UPDATE = 1 THEN GO TO L6 ; 141600 RIRJ[DKEY] ~ RRIJ ; 141700 COMMENT AUDIT EVENT NUMBERS ; 141800 IF I > 0 AND I < NINES THEN GO TO L1 ; 141900 WRITE(PRINTER[DBL],ERROR1) ; 142000 BOOL2 ~ TRUE ; 142100 L1: IF J > 0 AND J < NINES THEN GO TO L2 ; 142200 WRITE(PRINTER[DBL],ERROR2) ; 142300 BOOL2 ~ TRUE ; 142400 L2: IF I ! J THEN GO TO L5 ; 142500 WRITE(PRINTER[DBL],ERROR5) ; 142600 BOOL2 ~ TRUE ; 142700 COMMENT CALCULATE MIN. AND MAX. EVENT NOS. ; 142800 L5: IF I < MINEV THEN MINEV ~ I ; 142900 IF J < MINEV THEN MINEV ~ J ; 143000 IF I > MAXEV THEN MAXEV ~ I ; 143100 IF J > MAXEV THEN MAXEV ~ J ; 143200 L6: IF BTAPE THEN GO TO LL7 ; 143300 COMMENT AUDIT ACTIVITY TIMES ; 143400 IF ONETIME THEN 143500 BEGIN 143600 ET ~ ML ; VAR ~ 0 ; 143700 GO TO L3 ; 143800 END ; 143900 IF ML > PT THEN 144000 BEGIN 144100 WRITE(PRINTER[DBL],ERROR7) ; 144200 BOOL4 ~ BOOL2 ~ TRUE ; 144300 PT ~ ML 144400 END ; 144500 IF OT > ML THEN 144600 BEGIN 144700 WRITE(PRINTER[DBL],ERROR6) ; 144800 BOOL4 ~ BOOL2 ~ TRUE ; 144900 OT ~ ML 145000 END 145100 ELSE IF (OT = 0) AND (ML ! 0) THEN 145200 BEGIN 145300 WRITE(PRINTER[DBL],ERROR24) ; 145400 BOOL4 ~ BOOL2 ~ TRUE ; 145500 OT ~ ML 145600 END ; 145700 COMMENT COMPUTE EXPECTED TIME OF ACTIVITY ; 145800 ET ~ (OT + 4 | ML + PT)/6.0 ; 145900 VAR ~ ((PT - OT)/6.0)*2 ; 146000 L3: ADAYS ~ 0 ; 146100 IF ASD = 0 THEN GO TO LL7 ; 146200 COMMENT AUDIT ACTIVITY DATES ; 146300 UNPACK(ASDAT,SDAYS,WDPW,DPM,MOA,DAA,YRA,ADAYS,CASDAT, 146400 SWER ) ; 146500 GO TO SW5[SWER] ; 146600 LL6: GO TO SW1[ASD] ; 146700 LL8: IF ADAYS { RDAYS THEN GO TO LL13 ; 146800 WRITE(PRINTER[DBL],ERROR12) ; 146900 GO TO LL12 ; 147000 LL9: IF ADAYS { RDAYS THEN GO TO LL14 ; 147100 WRITE(PRINTER[DBL],ERROR13) ; 147200 GO TO LL12 ; 147300 LL10: IF ADAYS } RDAYS THEN GO TO LL7 ; 147400 WRITE(PRINTER[DBL],ERROR14) ; 147500 GO TO LL12 ; 147600 LL11: IF ADAYS } RDAYS THEN GO TO LL7 ; 147700 WRITE(PRINTER[DBL],ERROR15) ; 147800 GO TO LL12 ; 147900 LL12: ASDAT ~ RDATE ; BOOL2 ~ TRUE ; 148000 ADAYS ~ RDAYS ; 148100 DAA ~ DAR ; MOA ~ MOR ; YRA ~ YRR ; GO TO LL7 ; 148200 LL13: IF ADAYS } 0 THEN GO TO LL7 ; 148300 WRITE(PRINTER[DBL],ERROR20) ; 148400 GO TO LL15 ; 148500 LL14: IF ADAYS } 0 THEN GO TO LL7 ; 148600 WRITE(PRINTER[DBL],ERROR21) ; 148700 GO TO LL15 ; 148800 ERR31: ASDAT ~ CASDAT ; BOOL2 ~ TRUE ; 148900 GO TO SW2[ASD] ; 149000 ERR4: WRITE(PRINTER[DBL],ERROR16) ; GO TO LL8 ; 149100 ERR5: WRITE(PRINTER[DBL],ERROR17) ; GO TO LL9 ; 149200 ERR6: WRITE(PRINTER[DBL],ERROR18) ; GO TO LL10 ; 149300 ERR7: WRITE(PRINTER[DBL],ERROR19) ; GO TO LL11 ; 149400 ERR32: BOOL2 ~ TRUE ; 149500 GO TO SW3[ASD] ; 149600 LL16: WRITE(PRINTER[DBL],ERROR27) ; GO TO LL8 ; 149700 LL17: WRITE(PRINTER[DBL],ERROR28) ; GO TO LL9 ; 149800 LL18: WRITE(PRINTER[DBL],ERROR29) ; GO TO LL10 ; 149900 LL19: WRITE(PRINTER[DBL],ERROR30) ; GO TO LL11 ; 150000 ERR33: ASDAT ~ CASDAT ; BOOL2 ~ TRUE ; 150100 GO TO SW4[ASD] ; 150200 LL20: WRITE(PRINTER[DBL],ERROR35) ; GO TO LL8 ; 150300 LL21: WRITE(PRINTER[DBL],ERROR36) ; GO TO LL9 ; 150400 LL22: WRITE(PRINTER[DBL],ERROR37) ; GO TO LL10 ; 150500 LL23: WRITE(PRINTER[DBL],ERROR38) ; GO TO LL10 ; 150600 LL15: ASDAT ~ SDATE ; BOOL2 ~ TRUE ; ADAYS ~ 0 ; 150700 DAA ~ DAS ; MOA ~ MOS ; YRA ~ YRS ; 150800 LL7: NOACT ~ NOACT + 1 ; 150900 L8: IF BOOL4 THEN 151000 BEGIN 151100 WRITE(PRINTER[DBL],ERROR8) ; 151200 IF WEEKFLAG THEN 151300 BEGIN 151400 ML ~ ML / WDPW ; PT ~ PT / WDPW ; OT ~ OT / WDPW 151500 END ; 151600 WRITE(PRINTER[DBL],FOUT2,DATA2) ; 151700 END ; 151800 L9: IF BTAPE THEN WRITE(SWF[WR],*,STREC) 151900 ELSE WRITE(SWF[WR],*,TREC) ; 152000 END CARDAUDIT ; 152100 START: NOACT ~ KEY ~ 0 ; 152200 DELETEKEYS ~ 0 ; 152300 WEEKFLAG ~ FALSE ; 152400 FILL MONTH[*] WITH " ","JAN","FEB","MAR","APR","MAY", 152500 "JUN","JUL","AUG","SEP","OCT","NOV","DEC" ; 152600 FILL DPM[*] WITH 0,31,28,31,30,31,30,31,31,30,31,30,31 ; 152700 NINES ~ 9999999999 ; 152800 IF UPDATE = 0 THEN 152900 BEGIN 153000 RD ~ 2 ; WR ~ 1 ; SC ~ 3 ; RE ~ 4 ; 153100 NE ~ 5 ; 153200 END ; 153300 IF (BLOCPARAM[NOBLOCK].[45:3] ! 1) THEN NE ~ RE ; 153400 IF (BLOCPARAM[NOBLOCK].[40:3] = 1) THEN AC ~ 1 153500 ELSE AC ~ 0 ; 153600 COMMENT INITIALIZE GLOBAL ARRAYS FOR INPUT AUDIT RUN ; 153700 IF UPDATE ! 1 THEN 153800 BEGIN 153900 NOEVN ~ MAXEV ~ 0 ; 154000 IF MAXNOEVN.[30:9] = 0 THEN 154100 BEGIN 154200 TEMP1 ~ MAXNOEVN.[39:9] ; 154300 FOR L ~ 0 STEP 1 UNTIL TEMP1 DO EVENT[0,L] ~ 0 154400 END ELSE 154500 BEGIN 154600 TEMP1 ~ MAXNOEVN.[30:9] ; 154700 FOR L ~ 0 STEP 1 UNTIL TEMP1 DO 154800 FOR K ~ 0 STEP 1 UNTIL 511 DO 154900 EVENT[L,K] ~ 0 155000 END ; 155100 IF MAXNOACT.[30:9] = 0 THEN 155200 BEGIN 155300 TEMP1 ~ MAXNOACT.[39:9] ; 155400 FOR L ~ 0 STEP 1 UNTIL TEMP1 DO 155500 RIRJ[0,L] ~ 0 ; 155600 END ELSE 155700 BEGIN 155800 TEMP1 ~ MAXNOACT.[30:9] ; 155900 FOR L ~ 0 STEP 1 UNTIL TEMP1 DO 156000 FOR K ~ 0 STEP 1 UNTIL 511 DO 156100 RIRJ[0,L] ~ 0 ; 156200 END ; 156300 MINEV ~ NINES ; 156400 END ; 156500 BOOL2 ~ BOOL4 ~ FALSE ; 156600 BTAPE ~ FALSE ; 156700 WRITE(PRINTER[PAGE]) ; 156800 PAGEN ~ 1 ; 156900 TLINE ~ NLINE ~ 24 ; 157000 COMMENT READ HEADER CARDS ; 157100 READ(SWA[AC],FIN1,DATA1) ; 157200 IF (PERIOD = "WEEKS") THEN WEEKFLAG ~ TRUE ; 157300 IF UPDATE ! 0 THEN 157400 BEGIN 157500 FOR LL ~ 1 STEP 1 UNTIL 13 DO 157600 IF (NETNAME[LL] ! SNETNAME[LL]) THEN 157700 BEGIN 157800 WRITE(PRINTER[DBL],ERROR41) ; 157900 GO TO ENDOFPROG ; 158000 END ; 158100 IF (SDATE ! SSDATE) THEN 158200 BEGIN 158300 WRITE(PRINTER[DBL],ERROR42) ; 158400 BOOL2 ~ TRUE ; 158500 SDATE ~ SSDATE 158600 END 158700 END ; 158800 COMMENT AUDIT NETWORK START DATE ; 158900 UNPACK(SDATE,0,WDPW,DPM,MOS,DAS,YRS,SDAYS,CSDATE,SWER) ; 159000 GO TO SW1[SWER] ; 159100 ERR11: WRITE(PRINTER[DBL],ERROR9) ; 159200 SDATE ~ CSDATE ; BOOL2 ~ TRUE ; GO TO LL3 ; 159300 ERR12: WRITE(PRINTER[DBL],ERROR25) ; BOOL2 ~ TRUE ; GO TO LL3 ; 159400 ERR13: WRITE(PRINTER[DBL],ERROR33) ; BOOL2 ~ TRUE ; 159500 SDATE ~ CSDATE ; 159600 COMMENT AUDIT NETWORK REPORT DATE ; 159700 LL3: UNPACK(RDATE,SDAYS,WDPW,DPM,MOR,DAR,YRR,RDAYS,CRDATE, 159800 SWER ) ; 159900 GO TO SW2[SWER] ; 160000 ERR21: WRITE(PRINTER[DBL],ERROR10) ; 160100 RDATE ~ CRDATE ; BOOL2 ~ TRUE ; GO TO LL4 ; 160200 ERR22: WRITE(PRINTER[DBL],ERROR26) ; BOOL2 ~ TRUE ; GO TO LL4 ; 160300 ERR23: WRITE(PRINTER[DBL],ERROR34) ; BOOL2 ~ TRUE ; 160400 RDATE ~ CRDATE ; 160500 LL4: IF RDAYS } 0 THEN GO TO LL5 ; 160600 RDAYS ~ 0 ; BOOL2 ~ TRUE ; 160700 MOR ~ MOS ; DAR ~ DAS ; YRR ~ YRS ; 160800 WRITE(PRINTER[DBL],ERROR11) ; 160900 COMMENT PRINT TITLE PAGE FOR DATA LISTING ; 161000 LL5: WRITE(PRINTER,FORMH,OUTH) ; 161100 RRIJ ~ ET ~ VAR ~ ASD ~ ADAYS ~ ES ~ LF ~ SL ~ SVAR ~ 161200 RANKI ~ TAL ~ RN ~ EVNO ~ RANKE ~ EEO ~EVAR ~ LEO 161300 ~ SLCK ~ TALLY ~ 0 ; 161400 FOR L ~ 1 STEP 1 UNTIL 4 DO DSCPT[L] ~ " " ; 161500 COMMENT READ DATA TYPE CARD ; 161600 READ(SWA[AC],FIN3,DATA3) ; 161700 IF (ITEMS[1] = "EVENTS") THEN 161800 BEGIN 161900 IF NOT EVENTTAPE THEN 162000 BEGIN 162100 WRITE(PRINTER,TAPEERROR) ; 162200 EVENTTAPE ~ BOOL2 ~ TRUE ; 162300 END ; 162400 IF (UPDATE = 1) THEN 162500 BEGIN 162600 WRITE(PRINTER,UPDATEERROR) ; 162700 UPDATE ~ 2 ; 162800 BOOL2 ~ TRUE ; 162900 END ; 163000 COMMENT READ EVENT CARDS ; 163100 LOOP2: READ(SWA[AC],FIN4,DATA4)[LL2B] ; 163200 IF (EVNO = NINES) THEN GO TO LL5A ; 163300 IF (NLINE = TLINE) THEN 163400 BEGIN 163500 COMMENT PRINT HEADING ; 163600 PAGEN ~ PAGEN + 1 ; NLINE ~ 0 ; 163700 WRITE(PRINTER[PAGE]) ; 163800 WRITE(PRINTER[DBL],FOUT1,OUT1) ; 163900 WRITE(PRINTER,FORMH5) ; 164000 END ; 164100 COMMENT LIST EVENT ; 164200 WRITE(PRINTER[DBL],FOUT4,DATA4) ; 164300 NLINE ~ NLINE + 1 ; 164400 COMMENT RENUMBER EVENT ; 164500 RENUMBER ; 164600 GO TO LOOP2 ; 164700 LL5A: NLINE ~ TLINE ; 164800 READ(SWA[AC],FIN3,DATA3)[LL2B] ; 164900 END ; 165000 TAPEKEY ~ 1 ; 165100 IF (ITEMS[1] ! "ACTIVI") THEN 165200 BEGIN 165300 WRITE(PRINTER[DBL],ERROR45) ; 165400 GO TO FINISH ; 165500 END ; 165600 COMMENT READ ACTIVITY CARDS ; 165700 LL1: READ(SWA[AC],FIN2,DATA2)[LL2B] ; 165800 IF NLINE = TLINE THEN 165900 BEGIN 166000 COMMENT PRINT HEADING ; 166100 PAGEN ~ PAGEN + 1 ; NLINE ~ 0 ; 166200 WRITE(PRINTER[PAGE]) ; WRITE(PRINTER[DBL],FOUT1,OUT1) ; 166300 WRITE(PRINTER,FORMH4) ; 166400 END ; 166500 COMMENT PRINT CARD IMAGE ; 166600 WRITE(PRINTER[DBL],FOUT2,DATA2) ; 166700 NLINE ~ NLINE + 1 ; 166800 IF UPDATE = 0 THEN GO TO LL1A ; 166900 IF (IKEY < TAPEKEY) THEN 167000 BEGIN 167100 BOOL2 ~ TRUE ; 167200 WRITE(PRINTER[DBL],ERROR44) ; GO TO LL1 ; 167300 END ; 167400 IF (IKEY > SNOACT) AND (UPDATE = 1) THEN 167500 BEGIN 167600 WRITE(PRINTER[DBL],ERROR43) ; 167700 BOOL2 ~ TRUE ; 167800 UPDATE ~ 2 ; CODE ~ 2 ; 167900 END ; 168000 IF KEY + DELETEKEYS > SNOACT THEN GO TO LL1A ; 168100 BTAPE ~ TRUE ; 168200 FOR TKEY ~ TAPEKEY STEP 1 UNTIL IKEY-1 DO 168300 BEGIN 168400 READ(SWF[RD],*,STREC)[LL1B] ; 168500 KEY ~ KEY - DELETEKEYS ; 168600 CARDAUDIT(SI,SJ,SASD,SREMARKS) ; 168700 END ; 168800 BTAPE ~ FALSE ; 168900 READ(SWF[RD],*,STREC)[LL1B] ; 169000 TAPEKEY ~ IKEY + 1 ; 169100 IF (CODE ! 1) AND (UPDATE = 1) THEN 169200 BEGIN 169300 WRITE(PRINTER,ERROR43) ; UPDATE ~ 2 ; 169400 BOOL2 ~ TRUE ; 169500 END ; 169600 GO TO SW3[CODE] ; 169700 CODE3: DELETEKEYS ~ DELETEKEYS + 1 ; 169800 KEY ~ KEY - DELETEKEYS ; 169900 GO TO LL1 ; 170000 CODE1: IF SI ! I OR SJ ! J THEN 170100 BEGIN 170200 BOOL2 ~ TRUE ; 170300 WRITE(PRINTER[DBL],ERROR43) ; 170400 KEY ~ KEY - DELETEKEYS ; 170500 BTAPE ~ TRUE ; 170600 CARDAUDIT(SI,SJ,SASD,SREMARKS) ; 170700 BTAPE ~ FALSE ; 170800 GO TO LL1 ; 170900 END ; 171000 LL1B: BTAPE ~ FALSE ; 171100 COMMENT AUDIT ACTIVITY CARDS ; 171200 LL1A: IF (UPDATE = 0) OR (IKEY > SNOACT) THEN 171300 BEGIN 171400 KEY ~ KEY + 1 ; 171500 IF KEY > MAXNOACT THEN 171600 BEGIN 171700 WRITE(PRINTER[DBL],ERROR39) ; GO TO FINISH ; 171800 END 171900 END 172000 ELSE KEY ~ KEY - DELETEKEYS ; 172100 COMMENT CHECK PERIOD AND CONVERT TO DAYS ; 172200 IF WEEKFLAG THEN 172300 BEGIN 172400 ML ~ ML | WDPW ; PT ~ PT | WDPW ; OT ~ OT | WDPW 172500 END ; 172600 CARDAUDIT(I,J,ASD,REMARKS) ; 172700 GO TO LL1 ; 172800 LL2B: IF (AC = 1) THEN 172900 BEGIN 173000 LOCK(TAPER,RELEASE) ; TYPEOUT(SPOOUT,INST[5,*]) ; 173100 END ; 173200 IF (UPDATE = 0) OR (KEY + DELETEKEYS } SNOACT) 173300 THEN GO TO LL2 ; 173400 BTAPE ~ TRUE ; 173500 FOR TKEY ~ TAPEKEY STEP 1 UNTIL SNOACT DO 173600 BEGIN 173700 READ(SWF[RD],*,STREC)[LL2] ; 173800 KEY ~ KEY - DELETEKEYS ; 173900 CARDAUDIT(SI,SJ,SASD,SREMARKS) ; 174000 END ; 174100 COMMENT LIST NUMBER OF ACTIVITIES AND EVENTS ; 174200 LL2: PAGEN ~ PAGEN + 1 ; 174300 WRITE(PRINTER[PAGE]) ; WRITE(PRINTER[DBL],FOUT1,OUT1) ; 174400 WRITE(PRINTER[DBL],FOUT3,OUT3) ; 174500 REWIND(SWF[WR]) ; 174600 IF EVENTTAPE THEN REWIND(SWF[NE]) ; 174700 IF (UPDATE ! 0) THEN IF SAVETAPES THEN 174800 BEGIN 174900 LOCK(SWF[RD],SAVE) ; 175000 INST[2,0] ~ FILENAMES[RD] ; 175100 TYPEOUT(SPOOUT,INST[2,*]) ; TYPEOUT(SPOOUT,INST[5,*]) ; 175200 END 175300 ELSE REWIND(SWF[RD]) ; 175400 TP ~ RD ; RD ~ WR ; WR ~ TP ; 175500 IF UPDATE = 1 THEN GO TO LL2A ; 175600 NOACTROW ~ NOACT.[30:9] ; 175700 NOACTCOL ~ IF NOACTROW = 0 THEN NOACT.[39:9] ELSE 511 ; 175800 NOEVNROW ~ NOEVN.[30:9] ; 175900 NOEVNCOL ~ IF NOEVNROW = 0 THEN NOEVN.[39:9] ELSE 511 ; 176000 LL2A: EK ~ BK ~ 0 ; 176100 IF LISTTAL THEN 176200 BEGIN 176300 COMMENT PRINT HEADING FOR LIST TALLIES ; 176400 WRITE(PRINTER[PAGE]) ; 176500 WRITE(PRINTER[DBL],HEADNET,NET) ; 176600 WRITE(PRINTER,HEADTALS) ; 176700 WRITE(PRINTER[DBL]) ; 176800 END ; 176900 FOR K ~ 1 STEP 1 UNTIL NOEVN DO 177000 BEGIN 177100 KR ~ K.[30:9] ; KC ~ K.[39:9] ; 177200 COMMENT LIST EVENT TALLIES ; 177300 IF LISTTAL THEN WRITE(PRINTER[DBL],OUTTALS,TALS) ; 177400 COMMENT DETERMINE STARTING AND ENDING EVENTS ; 177500 IF TALLIES[KR,KC].[21:9] = 0 THEN 177600 BEGIN 177700 IF TALLIES[KR,KC].[30:9] ! 1 THEN 177800 BEGIN 177900 WRITE(PRINTER[DBL],ENDERROR,ENDEVENT) ; 178000 BOOL2 ~ TRUE ; 178100 END ; 178200 IF EK = NUMENDING THEN 178300 BEGIN 178400 WRITE(PRINTER[DBL],ENDINGERROR) ; 178500 BOOL2 ~ TRUE ; GO TO LL7 ; 178600 END ; 178700 EK ~ EK + 1 ; 178800 REEV[EK] ~ K ; 178900 GO TO LL6 ; 179000 END ; 179100 IF TALLIES[KR,KC].[30:9] = 0 THEN 179200 BEGIN 179300 IF TALLIES[KR,KC].[21:9] ! 1 THEN 179400 BEGIN 179500 WRITE(PRINTER[DBL],STARTERROR,STARTEVENT) ; 179600 BOOL2 ~ TRUE ; 179700 END ; 179800 IF BK = NUMSTARTING THEN 179900 BEGIN 180000 WRITE(PRINTER[DBL],STARTINGERROR) ; 180100 BOOL2 ~ TRUE ; GO TO LL7 ; 180200 END ; 180300 BK ~ BK + 1 ; 180400 RBEV[BK] ~ K ; 180500 END ; 180600 LL6: END ; 180700 LL7: BEGIN 180800 COMMENT BLOCK TO LIST ENDING AND STARTING EVENTS ; 180900 LIST OUTHEAD(FOR LL ~ 1 STEP 1 UNTIL 13 DO NETNAME[LL],RUN), 181000 OUT1(BK,FOR LL ~ 1 STEP 1 UNTIL BK DO EVENT[RBEV[LL] 181100 .[30:9],RBEV[LL].[39:9]]), 181200 OUT2(EK,FOR LL ~ 1 STEP 1 UNTIL EK DO EVENT[REEV[LL] 181300 .[30:9],REEV[LL].[39:9]]) ; 181400 FORMAT OUT STARTINGEVENTS("THE NETWORK CONTAINS",I4," STARTING ", 181500 "EVENTS WHICH ARE NUMBERED"/(5I12)), 181600 STARTINGEVENT("THE NETWORK CONTAINS",I4," STARTING EVENT", 181700 " WHICH IS NUMBERED"/I12), 181800 ENDINGEVENTS("THE NETWORK CONTAINS",I4," ENDING EVENTS ", 181900 "WHICH ARE NUMBERED"/(5I12)), 182000 ENDINGEVENT("THE NETWORK CONTAINS",I4," ENDING EVENT ", 182100 "WHICH IS NUMBERED"/I12), 182200 HEADING(13A6,X10,"RUN",I11) ; 182300 WRITE(PRINTER[PAGE]) ; 182400 WRITE(PRINTER[DBL],HEADING,OUTHEAD) ; 182500 IF BK = 1 THEN WRITE(PRINTER[DBL],STARTINGEVENT,OUT1) ELSE 182600 WRITE(PRINTER[DBL],STARTINGEVENTS,OUT1) ; 182700 IF EK = 1 THEN WRITE(PRINTER[DBL],ENDINGEVENT,OUT2) ELSE 182800 WRITE(PRINTER[DBL],ENDINGEVENTS,OUT2) ; 182900 END ; 183000 BEGIN 183100 COMMENT BLOCK TO UPDATE ACTIVITY TAPE FILE WITH TALLY COUNTS ; 183200 INTEGER KRI,KRJ,KCI,KCJ,TEMP ; 183300 LABEL LOOP,EOF ; 183400 LABEL LAB1, LAB2, LAB3, LAB4, LAB ; 183500 SWITCH SWL ~ LAB,LAB1,LAB2,LAB3,LAB4 ; 183600 FORMAT OUT ERROR48("ALL PRECEDING ACTIVITIES TO ACTIVITY ",I10," TO", 183700 I10,"NOT COMPLETED, ACTUAL START DATE NOT ALLOWED"), 183800 ERROR49("ALL PRECEDING ACTIVITIES TO ACTIVITY ",I10," TO", 183900 I10,"NOT COMPLETED, ACTUAL COMPL DATE NOT ALLOWED") ; 184000 LOOP: READ(SWF[RD],*,TREC)[EOF] ; 184100 TAL ~ 0 ; 184200 TEMP ~ RRIJ.[4:22] ; 184300 KRI ~ TEMP.[30:9] ; KCI ~ TEMP.[39:9] ; 184400 TEMP ~ RRIJ.[26:22] ; 184500 KRJ ~ TEMP.[30:9] ; KCJ ~ TEMP.[39:9] ; 184600 TAL ~ TALLIES[KRJ,KCJ] ; 184700 IF (TALLIES[KRI,KCI].[30:9] = TALLIES[KRI,KCI].[39:9]) 184800 AND (ASD ! 3) THEN TAL ~ - TAL ; 184900 GO TO SWL[ASD + 1] ; 185000 LAB1: IF (TAL } 0) AND (TALLIES[KRI,KCI].[30:9] ! 0) THEN 185100 BEGIN 185200 WRITE(PRINTER[DBL],ERROR48,OUTERACT) ; 185300 BOOL2 ~ TRUE ; 185400 END ; 185500 GO TO LAB ; 185600 LAB2: IF (TAL } 0) AND (TALLIES[KRI,KCI].[30:9] ! 0) THEN 185700 BEGIN 185800 WRITE(PRINTER[DBL],ERROR49,OUTERACT) ; 185900 BOOL2 ~ TRUE ; 186000 END ; 186100 GO TO LAB ; 186200 LAB3: IF (TALLIES[KRI,KCI].[30:9] ! 0) THEN 186300 BEGIN 186400 WRITE(PRINTER[DBL],ERROR46,OUTERACT) ; 186500 BOOL2 ~ TRUE ; 186600 END ; 186700 GO TO LAB ; 186800 LAB4: IF (TALLIES[KRJ,KCJ].[21:9] ! 0) THEN 186900 BEGIN 187000 WRITE(PRINTER[DBL],ERROR47,OUTERACT) ; 187100 BOOL2 ~ TRUE ; 187200 END ; 187300 LAB: WRITE(SWF[WR],*,TREC) ; 187400 GO TO LOOP ; 187500 EOF: REWIND(SWF[RD]) ; REWIND(SWF[WR]) ; 187600 TP ~ RD ; RD ~ WR ; WR ~ TP ; 187700 END ; 187800 IF BOOL2 THEN 187900 BEGIN 188000 WRITE(PRINTER,SPO3) ; 188100 GO TO FINISH 188200 END ; 188300 IF EVENTTAPE THEN 188400 BEGIN 188500 COMMENT WRITE EVENT NUMBERS AND TALLIES ON EVENT TAPE ; 188600 LOOP3: READ(SWF[NE],*,EREC)[EOF3] ; 188700 TALLY ~ TALLIES[RN.[30:9],RN.[39:9]] ; 188800 WRITE(SWF[WR],*,EREC) ; 188900 GO TO LOOP3 ; 189000 EOF3: IF (UPDATE = 1) AND SAVETAPES THEN 189100 BEGIN 189200 LOCK(SWF[NE],SAVE) ; 189300 INST[3,0] ~ FILENAMES[NE] ; 189400 TYPEOUT(SPOOUT,INST[3,*]) ; TYPEOUT(SPOOUT,INST[5,*]) ; 189500 END 189600 ELSE REWIND(SWF[NE]) ; 189700 REWIND(SWF[WR]) ; 189800 TP ~ NE ; NE ~ WR ; WR ~ TP ; 189900 IF (RE = WR) THEN RE ~ NE ; 190000 END ; 190100 END AUDIT BLOCK ; 190200 GO TO ORIGIN ; 190300 BLOCK3: BEGIN 190400 COMMENT RANK BLOCK ; 190500 COMMENT 190600 DEFINITIONS OF VARIABLES IN RANK BLOCK 190700 CH MAXIMUM RANK PERMITTED 190800 SRN RENUMBERED EVENT ON OLD EVENT TAPE 190900 SEVNO EVENT NUMBER ON OLD EVENT TAPE 191000 SRANKE EVENT RANK ON OLD EVENT TAPE 191100 STALLY TALLY ON OLD EVENT TAPE 191200 DIFMAX INCREASE IN MAXRANK IN SUCCESSIVE PASSES 191300 BOOL BOOLEAN FLAG, TRUE IF A LOOP IS DETECTED IN THE 191400 NETWORK 191500 TWOTAPES BOOLEAN FLAG, TRUE IF TWO EVENT TAPES ARE TO BE 191600 MERGED 191700 ERANK ARRAY CONTAINING RANK OF EACH EVENT 191800 SDSCPT ARRAY CONTAINING EVENT DESCRIPTION ON OLD EVENT 191900 TAPE 192000 SEEO EARLIEST EVENT OCCURRENCE ON OLD EVENT TAPE 192100 SEVAR SUM OF VARIANCES ON OLD EVENT TAPE 192200 SLEO LATEST EVENT OCCURRENCE ON OLD EVENT TAPE 192300 SSLCK EVENT SLACK ON OLD EVENT TAPE 192400 MAXRANK MAXIMUM RANK COMPUTED DURING CURRENT PASS 192500 OLDMAX MAXIMUM RANK COMPUTED DURING LAST PASS 192600 TEMP,TEMP2 TEMPORARY VARIABLES 192700 K,L,KK,KRI,KCI,KRJ,KCJ,NN INDICES FOR INDEXING ARRAYS 192800 ; 192900 INTEGER CH ; 193000 INTEGER K,L ; 193100 INTEGER SRN,SEVNO,SRANKE,STALLY ; 193200 INTEGER DIFMAX ; 193300 INTEGER NN ; 193400 BOOLEAN BOOL ; 193500 BOOLEAN TWOTAPES ; 193600 INTEGER ARRAY ERANK[0:NOEVNROW,0:NOEVNCOL] ; 193700 ALPHA ARRAY SDSCPT[0:4] ; 193800 REAL SEEO,SEVAR,SLEO,SSLCK ; 193900 LABEL L1, BEND2 ; 194000 LABEL LOOP,EOF,LOOP2,EOF2 ; 194100 LABEL EOFA,L2 ; 194200 LIST SEREC(SRN,SEVNO,SRANKE,SEEO,SEVAR,SLEO,SSLCK,STALLY,FOR 194300 LL ~ 1 STEP 1 UNTIL 4 DO SDSCPT[LL]) ; 194400 LIST OUT1(FOR LL ~ 1 STEP 1 UNTIL 13 DO NETNAME[LL],RUN) , 194500 OUT2(KEY,EVENT[RIRJ[K,L].[8:9],RIRJ[K,L].[17:9]], 194600 EVENT[RIRJ[K,L].[30:9],RIRJ[K,L].[39:9]]) ; 194700 FORMAT OUT LOOPERROR(13A6,X10,"RUN",I11/"THE NETWORK CONTAINS AT ", 194800 "LEAST ONE LOOP"/"SOME OR ALL OF THE FOLLOWING ", 194900 "ACTIVITIES FORM THE LOOP"/X8,"KEY",X7,"PRED",X7, 195000 "SUCC"/) , 195100 ERRORACTIVITY(3I11) ; 195200 INTEGER KK,TEMP,MAXRANK ; 195300 INTEGER TEMP2,KRI,KCI,KRJ,KCJ ; 195400 INTEGER OLDMAX ; 195500 LABEL LR ; 195600 COMMENT SET MAXIMUM RANK FOR NETWORK ; 195700 IF (CHAINLENGTH < NOEVN) THEN CH ~ CHAINLENGTH + 1 195800 ELSE CH ~ NOEVN ; 195900 OLDMAX ~ 0 ; 196000 BOOL ~ FALSE ; 196100 TWOTAPES ~ FALSE ; 196200 FOR K ~ 0 STEP 1 UNTIL NOEVNROW DO 196300 FOR L ~ 0 STEP 1 UNTIL NOEVNCOL DO 196400 ERANK[K,L] ~ 0 ; 196500 COMMENT COMPUTE EVENT RANKS ; 196600 LR: MAXRANK ~ 0 ; 196700 FOR KK ~ 1 STEP 1 UNTIL NOACT DO 196800 BEGIN 196900 TEMP2 ~ RIRJ[KK.[30:9],KK.[39:9]] ; 197000 KRI ~ TEMP2.[8:9] ; KCI ~ TEMP2.[17:9] ; 197100 KRJ ~ TEMP2.[30:9] ; KCJ ~ TEMP2.[39:9] ; 197200 IF (ERANK[KRI,KCI] } ERANK[KRJ,KCJ]) THEN 197300 BEGIN 197400 TEMP ~ ERANK[KRJ,KCJ] ~ ERANK[KRI,KCI] + 1 ; 197500 IF TEMP > MAXRANK THEN MAXRANK ~ TEMP 197600 END 197700 END ; 197800 COMMENT TEST FOR A POSSIBLE LOOP ; 197900 IF (MAXRANK > CH) THEN GO TO L1 ; 198000 OLDMAX ~ MAXRANK ; 198100 IF (MAXRANK ! 0) THEN GO TO LR ; 198200 IF EVENTTAPE THEN 198300 BEGIN 198400 COMMENT WRITE EVENT RANKS ON EVENT TAPE FILE ; 198500 SEVNO ~ 0 ; 198600 IF (BLOCPARAM[NOBLOCK] = 1) THEN TWOTAPES ~ TRUE ; 198700 LOOP: READ(SWF[NE],*,EREC)[EOF] ; 198800 IF TWOTAPES THEN 198900 BEGIN 199000 DO READ(SWF[RE],*,SEREC)[EOFA] UNTIL (SEVNO } EVNO) ; 199100 IF (SEVNO = EVNO) THEN 199200 BEGIN 199300 FOR NN ~ 1 STEP 1 UNTIL 4 DO 199400 IF (DSCPT[NN] ! " ") THEN GO TO L2 ; 199500 FOR NN ~ 1 STEP 1 UNTIL 4 DO DSCPT[NN] ~ SDSCPT[NN] ; 199600 END ; 199700 END ; 199800 L2: RANKE ~ ERANK[RN.[30:9],RN.[39:9]] ; 199900 WRITE(SWF[WR],*,EREC) ; 200000 GO TO LOOP ; 200100 EOFA: IF SAVETAPES THEN 200200 BEGIN 200300 LOCK(SWF[RE],RELEASE) ; 200400 INST[3,0] ~ FILENAMES[RE] ; 200500 TYPEOUT(SPOOUT,INST[3,*]) ; TYPEOUT(SPOOUT,INST[5,*]) ; 200600 END 200700 ELSE PURGE(SWF[RE],2) ; 200800 TWOTAPES ~ FALSE ; 200900 GO TO L2 ; 201000 EOF: REWIND(SWF[NE]) ; REWIND(SWF[WR]) ; 201100 IF TWOTAPES THEN IF SAVETAPES THEN 201200 BEGIN 201300 LOCK(SWF[RE],RELEASE) ; 201400 INST[3,0] ~ FILENAMES[RE] ; 201500 TYPEOUT(SPOOUT,INST[3,*]) ; TYPEOUT(SPOOUT,INST[5,*]) ; 201600 END 201700 ELSE PURGE(SWF[RE],2) ; 201800 TP ~ NE ; NE ~ RE ; RE ~ WR ; WR ~ TP ; 201900 END ; 202000 COMMENT WRITE ACTIVITY RANKS ON TAPE ; 202100 LOOP2: READ(SWF[RD],*,TREC)[EOF2] ; 202200 RANKI ~ ERANK[RRIJ.[8:9],RRIJ.[17:9]] ; 202300 WRITE(SWF[WR],*,TREC) ; 202400 GO TO LOOP2 ; 202500 EOF2: REWIND(SWF[RD]) ; REWIND(SWF[WR]) ; 202600 TP ~ RD ; RD ~ WR ; WR ~ TP ; 202700 GO TO BEND2 ; 202800 COMMENT PRINT LIST OF ACTIVITIES IN LOOP ; 202900 L1: WRITE(PRINTER[PAGE]) ; 203000 WRITE(PRINTER,LOOPERROR,OUT1) ; 203100 DIFMAX ~ MAXRANK - OLDMAX ; 203200 FOR KEY ~ 1 STEP 1 UNTIL NOACT DO 203300 BEGIN 203400 K ~ KEY.[30:9] ; L~ KEY.[39:9] ; 203500 IF (ERANK[RIRJ[K,L].[8:9],RIRJ[K,L].[17:9]] > 203600 CH - DIFMAX) 203700 THEN WRITE(PRINTER,ERRORACTIVITY,OUT2) 203800 END ; 203900 GO TO FINISH ; 204000 BEND2: END RANK BLOCK ; 204100 GO TO ORIGIN ; 204200 BLOCK4: BEGIN 204300 COMMENT SORT BLOCK ; 204400 COMMENT 204500 DEFINITIONS OF VARIABLES IN SORT BLOCK 204600 NCOLS NUMBER OF SORTKEYS 204700 COLSN ARRAY CONTAINING SORTKEYS 204800 TEMPKEY TEMPORARY VARIABLE 204900 L INDEX FOR ARRAYS 205000 ; 205100 INTEGER NCOLS,L,TEMPKEY ; 205200 INTEGER ARRAY COLSN[0:4] ; 205300 LABEL LOOP,EOF ; 205400 PROCEDURE TAPESORT(NTAPES,NWPR,NCOLS,SORTKEYS,ARSIZE,SORTINPUT, 205500 SORTOUTPUT,SEQFLAG,SEQCOL,SAVEFACTOR) ; 205600 COMMENT THIS PROCEDURE SORTS A TAPE FILE ; 205700 COMMENT 205800 DEFINITIONS OF SOME OF THE VARIABLES IN PROCEDURE TAPESORT 205900 NTAPES NUMBER OF TAPES USED FOR SORTING 206000 NWPR NUMBER OF WORDS PER LOGICAL RECORD 206100 NCOLS NUMBER OF SORTKEYS 206200 SORTKEYS ARRAY CONTAINING SORTKEY NUMBERS 206300 ARSIZ NUMBER OF RECORDS WHICH CAN BE SORTED INTERNALLY 206400 SORTINPUT INPUT TAPE FILE 206500 SORTOUTPUT OUTPUT TAPE FILE 206600 SEQFLAG BOOLEAN FLAG, TRUE IF RECORDS ARE TO BE 206700 SEQUENCED AFTER THEY ARE SORTED 206800 SEQCOL COLUMN IN WHICH RECORDS ARE TO BE SEQUENCED 206900 SAVEFACTOR BOOLEAN FLAG, TRUE IF INPUT FILE IS TO BE 207000 PRESERVED 207100 ; 207200 INTEGER NTAPES,NWPR,NCOLS,ARSIZE ; 207300 INTEGER SEQCOL ; 207400 BOOLEAN SEQFLAG,SAVEFACTOR ; 207500 FILE SORTINPUT,SORTOUTPUT ; 207600 INTEGER ARRAY SORTKEYS[0] ; 207700 BEGIN 207800 INTEGER RECSIN,RECSOUT ; 207900 REAL EOFMARK ; 208000 BOOLEAN MOREDATA,EXITFLAG,LASTPASS,INITIAL ; 208100 INTEGER NNT,NT,JJ,J,I,COUNTER,COPYCOUNT,WRT,NEWRT,NSLEFT, 208200 NNWPR,IND,TT,K,SMALL,LARGE,FIRST,SECOND,CC,H ; 208300 INTEGER FLAG ; 208400 LABEL STEPUP,MERGEST,MERGE,RECORD,EOF1,EOF2,RETURN,CLOSEND ; 208500 LABEL EOF3,TAPECOPY,ADJUST,EXIT,DISTRIB ; 208600 LABEL NOTALLODD,EOF4 ; 208700 LABEL XCH ; 208800 SWITCH SWFLAG1 ~ XCH,RECORD ; 208900 SWITCH SWFLAG2 ~ RECORD,XCH ; 209000 BOOLEAN ARRAY ASCENDFLAG[0:NTAPES] ; 209100 INTEGER ARRAY LIM[0:NTAPES],DIST[0:NTAPES] ; 209200 INTEGER ARRAY TCHECK,TSUM,INDEX[0:NTAPES],RECINDEX[0:ARSIZE] ; 209300 REAL ARRAY A[0:NTAPES,0:NWPR-1] ; 209400 SAVE REAL ARRAY AA[0:ARSIZE,0:NWPR-1] ; 209500 REAL ARRAY EOFARRAY,BUFF[0:NWPR-1],NEOFARRAY[0:NWPR-1] ; 209600 FILE TSORT2(2,100,NWPR) ; 209700 FILE TSORT3(2,100,NWPR) ; 209800 FILE TSORT4(2,100,NWPR) ; 209900 FILE TSORT5(2,100,NWPR) ; 210000 FILE TSORT6(2,100,NWPR) ; 210100 FILE TSORT7(2,100,NWPR) ; 210200 FILE TSORT8(2,100,NWPR) ; 210300 FILE TSORT9(2,100,NWPR) ; 210400 SWITCH FILE SWF ~ SORTINPUT,SORTOUTPUT,TSORT2,TSORT3,TSORT4, 210500 TSORT5,TSORT6,TSORT7,TSORT8,TSORT9 ; 210600 FORMAT OUT ERROR1("EOF1 LABEL PASSED"), 210700 ERROR2("EOF2 LABEL PASSED"), 210800 ERROR3("SORT NOT PERFORMED CORRECTLY, RECORDS IN ", 210900 "NOT EQUAL TO RECORDS OUT") ; 211000 PROCEDURE TSORTW(N,NCOLS,SORTKEYS,A,INDEX,AFLAG) ; 211100 VALUE N,NCOLS ; 211200 INTEGER N,NCOLS ; 211300 BOOLEAN AFLAG ; 211400 INTEGER ARRAY SORTKEYS,INDEX[0] ; 211500 ARRAY A[0,0] ; 211600 BEGIN 211700 INTEGER M,K,J,I,IM,CC,CCC,TI,TIM,FLAG ; 211800 LABEL L1,L2,L3,L4,XCH ; 211900 SWITCH SW1 ~ XCH,L4 ; 212000 SWITCH SW2~ L4,XCH ; 212100 IF AFLAG THEN FLAG ~ 1 ELSE FLAG ~ 2 ; 212200 M ~ N ; 212300 L1: M ~ M DIV 2 ; 212400 IF M ! 0 THEN 212500 BEGIN 212600 K ~ N - M ; J ~ 1 ; 212700 L2: I ~ J ; 212800 L3: IM ~ I + M ; TI ~ INDEX[I] ; TIM ~ INDEX[IM] ; 212900 FOR CC ~ 1 STEP 1 UNTIL NCOLS DO 213000 BEGIN 213100 CCC ~ SORTKEYS[CC] ; 213200 IF A[TI,CCC] > A[TIM,CCC] THEN GO TO SW1[FLAG] ; 213300 IF A[TI,CCC] < A[TIM,CCC] THEN GO TO SW2[FLAG] ; 213400 END ; 213500 GO TO L4 ; 213600 XCH: INDEX[I] ~ TIM ; INDEX[IM] ~ TI ; 213700 I ~ I - M ; IF I } 1 THEN GO TO L3 ; 213800 L4: J ~ J + 1 ; 213900 IF J > K THEN GO TO L1 ELSE GO TO L2 ; 214000 END 214100 END TSORTW ; 214200 PROCEDURE INTERNALSORT(UNITIN,UNITOUT,NWPR,RECSIN,ARSIZE,NCOLS, 214300 AFLAG,RECSOUT,MOREDATA,RECINDEX,SORTKEYS,EOFARRAY, 214400 AA,TSORTW,SWF,SUM,INITIAL,NEOFARRAY,SEQFLAG,SEQCOL) ; 214500 INTEGER UNITIN,UNITOUT,NWPR,RECSIN,ARSIZE,NCOLS,RECSOUT ; 214600 INTEGER SUM ; 214700 INTEGER SEQCOL ; 214800 BOOLEAN MOREDATA,AFLAG,INITIAL ; 214900 BOOLEAN SEQFLAG ; 215000 INTEGER ARRAY RECINDEX,SORTKEYS[0] ; 215100 REAL ARRAY EOFARRAY[0],AA[0,0],NEOFARRAY[0] ; 215200 PROCEDURE TSORTW ; 215300 SWITCH FILE SWF ; 215400 BEGIN 215500 INTEGER K,J,NNWPR ; 215600 LABEL L1,L2,L3,L4,RET,L5,L7,L8 ; 215700 K ~ 0 ; NNWPR ~ NWPR - 1 ; 215800 L1: K ~ K + 1 ; READ(SWF[UNITIN],NWPR,AA[K,*])[L3] ; 215900 RECSIN ~ RECSIN + 1 ; RECINDEX[K] ~ K ; 216000 IF K ! ARSIZE THEN GO TO L1 ; 216100 L2: TSORTW(K,NCOLS,SORTKEYS,AA,RECINDEX,AFLAG) ; 216200 IF INITIAL THEN 216300 BEGIN 216400 IF MOREDATA THEN 216500 BEGIN 216600 READ(SWF[UNITIN][NO],NWPR,AA[0,*])[L5] ; 216700 GO TO L7 ; 216800 END ; 216900 L5: MOREDATA ~ FALSE ; 217000 GO TO L8 ; 217100 END ; 217200 L7: IF AFLAG THEN WRITE(SWF[UNITOUT],NWPR,NEOFARRAY[*]) 217300 ELSE WRITE(SWF[UNITOUT],NWPR,EOFARRAY[*]) ; 217400 L8: AFLAG ~ NOT AFLAG ; 217500 FOR J ~ 1 STEP 1 UNTIL K DO 217600 BEGIN 217700 RECSOUT ~ RECSOUT + 1 ; 217800 IF INITIAL AND NOT MOREDATA AND SEQFLAG THEN 217900 AA[RECINDEX[J],SEQCOL] ~ RECSOUT ; 218000 WRITE(SWF[UNITOUT],NWPR,AA[RECINDEX[J],*]) ; 218100 END ; 218200 SUM ~ SUM + 1 ; 218300 IF MOREDATA THEN 218400 READ(SWF[UNITIN][NO],NWPR,AA[0,*])[L4] ; 218500 GO TO RET ; 218600 L3: MOREDATA ~ FALSE ; K ~ K - 1 ; GO TO L2 ; 218700 L4: MOREDATA ~ FALSE ; 218800 RET: INITIAL ~ FALSE ; 218900 END INTERNALSORT ; 219000 PROCEDURE COPY(COPYCOUNT,UNITIN,UNITOUT,NWPR,EOFMARK,SWF,SORTKEYS); 219100 INTEGER COPYCOUNT,UNITIN,UNITOUT,NWPR ; 219200 REAL EOFMARK ; 219300 SWITCH FILE SWF ; 219400 INTEGER ARRAY SORTKEYS[0] ; 219500 BEGIN 219600 LABEL L1,L2 ; 219700 INTEGER I,TALLY ; 219800 ARRAY TEMP[0:NWPR-1] ; 219900 TALLY ~ COPYCOUNT ; 220000 FOR I ~ 0 STEP 1 UNTIL NWPR-1 DO TEMP[I] ~ EOFMARK ; 220100 WRITE(SWF[UNITOUT],NWPR,TEMP[*]) ; 220200 L1: READ REVERSE(SWF[UNITIN],NWPR,TEMP[ *])[L2] ; 220300 IF ABS(TEMP[SORTKEYS[1]]) = EOFMARK THEN 220400 BEGIN 220500 TALLY ~ TALLY - 1 ; 220600 IF TALLY = 0 THEN GO TO L2 ; 220700 END ; 220800 WRITE(SWF[UNITOUT],NWPR,TEMP[*]) ; 220900 GO TO L1 ; 221000 L2: REWIND(SWF[UNITIN]) ; 221100 END COPY ; 221200 INITIAL ~ TRUE ; 221300 RECSIN ~ RECSOUT ~ 0 ; LASTPASS ~ FALSE ; 221400 NNT ~ NTAPES - 1 ; NT ~ NTAPES ; JJ ~ 0 ; 221500 NNWPR ~ NWPR - 1 ; 221600 EOFMARK ~ 549755813887 ; 221700 EOFMARK.[3:6] ~ 63 ; 221800 FOR I ~ 0 STEP 1 UNTIL NNWPR DO 221900 BEGIN 222000 EOFARRAY[I] ~ EOFMARK ; NEOFARRAY[I] ~ -EOFMARK ; 222100 END ; 222200 FOR I ~ 0 STEP 1 UNTIL NTAPES DO 222300 BEGIN 222400 ASCENDFLAG[I] ~ FALSE ; 222500 TSUM[I] ~ LIM[I] ~ TCHECK[I] ~ DIST[I] ~ 0 ; 222600 END ; 222700 EXITFLAG ~ FALSE ; MOREDATA ~ TRUE ; 222800 TCHECK[1] ~ 1 ; I ~ 1 ; 222900 ASCENDFLAG[1] ~ TRUE ; 223000 INTERNALSORT(0,I,NWPR,RECSIN,ARSIZE,NCOLS,ASCENDFLAG[I], 223100 RECSOUT,MOREDATA,RECINDEX,SORTKEYS,EOFARRAY,AA, 223200 TSORTW,SWF,TSUM[I],INITIAL,NEOFARRAY,SEQFLAG,SEQCOL); 223300 IF NOT MOREDATA THEN 223400 BEGIN 223500 REWIND(SWF[I]) ; 223600 IF SAVEFACTOR THEN 223700 BEGIN 223800 LOCK(SWF[0],SAVE) ; 223900 TYPEOUT(SPOOUT,INST[5,*]) ; 224000 SAVEFACTOR ~ FALSE ; 224100 END 224200 ELSE PURGE(SWF[0],1) ; 224300 GO TO RETURN ; 224400 END ; 224500 DISTRIB: H ~ TCHECK[1] ; 224600 FOR I ~ 2 STEP 1 UNTIL NNT DO 224700 TCHECK[I-1] ~ TCHECK[I] + H ; TCHECK[NNT] ~ H ; 224800 FOR I ~ 1 STEP 1 UNTIL NNT DO 224900 IF BOOLEAN(TCHECK[I]) THEN 225000 BEGIN 225100 FOR JJ ~ 1 STEP 1 UNTIL NNT DO 225200 LIM [JJ] ~ TCHECK[(I+JJ-2) MOD NNT + 1 ] ; 225300 GO TO EXIT ; 225400 END ; 225500 EXIT: FOR I ~ 1 STEP 1 UNTIL NNT DO 225600 FOR J ~ TSUM[I]+1 STEP 1 UNTIL LIM[I] DO 225700 IF MOREDATA THEN 225800 BEGIN 225900 INTERNALSORT(0,I,NWPR,RECSIN,ARSIZE,NCOLS,ASCENDFLAG[I], 226000 RECSOUT,MOREDATA,RECINDEX,SORTKEYS,EOFARRAY,AA, 226100 TSORTW,SWF,TSUM[I],INITIAL,NEOFARRAY,FALSE,0) ; 226200 END ELSE 226300 BEGIN 226400 IF ASCENDFLAG[I] THEN 226500 BEGIN 226600 WRITE(SWF[I],NWPR,NEOFARRAY[*]) ; 226700 END ELSE 226800 BEGIN 226900 WRITE(SWF[I],NWPR, EOFARRAY[*]) ; 227000 END ; 227100 TSUM[I] ~ TSUM[I] + 1 ; 227200 ASCENDFLAG[I] ~ NOT ASCENDFLAG[I] ; 227300 END ; 227400 IF MOREDATA THEN GO TO DISTRIB ; 227500 IF SAVEFACTOR THEN 227600 BEGIN 227700 LOCK(SWF[0],SAVE) ; 227800 TYPEOUT(SPOOUT,INST[5,*]) ; 227900 SAVEFACTOR ~ FALSE ; 228000 END 228100 ELSE PURGE(SWF[0],1) ; 228200 MERGEST: NEWRT ~ WRT ~ NT ; NSLEFT ~ RECSOUT ~ 0 ; 228300 FOR I ~ 2 STEP 1 UNTIL NT DO ASCENDFLAG[I] ~ FALSE ; 228400 ASCENDFLAG[1] ~ TRUE ; 228500 FOR I ~ 1 STEP 1 UNTIL NNT DO 228600 IF NOT BOOLEAN(TSUM[I]) THEN GO TO NOTALLODD ; 228700 COPY(TSUM[1],1,WRT,NWPR,EOFMARK,SWF,SORTKEYS) ; 228800 TSUM[WRT] ~ TSUM[1] ; TSUM[1] ~ 0 ; 228900 WRT ~ NEWRT ~ 1 ; 229000 NOTALLODD: NSLEFT ~ 0 ; 229100 FOR I ~ 1 STEP 1 UNTIL NT DO 229200 BEGIN 229300 NSLEFT ~ NSLEFT + TSUM[I] ; 229400 ASCENDFLAG[I] ~ FALSE ; 229500 END ; 229600 IF NSLEFT = NNT THEN LASTPASS ~ TRUE ; 229700 ASCENDFLAG[1] ~ TRUE ; 229800 MERGE: FOR I ~ 1 STEP 1 UNTIL NT DO 229900 BEGIN 230000 INDEX[I] ~ I ; 230100 IF I ! WRT THEN 230200 READ REVERSE(SWF[I],NWPR,A[I,*])[EOF1] ; 230300 END ; 230400 FOR J ~ 0 STEP 1 UNTIL NNWPR DO 230500 IF ASCENDFLAG[WRT] THEN A[WRT,J] ~ EOFMARK ELSE 230600 A[WRT,J] ~ -EOFMARK ; 230700 TSORTW(NT,NCOLS,SORTKEYS,A,INDEX,ASCENDFLAG[WRT]) ; 230800 IF NOT LASTPASS THEN 230900 IF ASCENDFLAG[WRT] THEN 231000 WRITE(SWF[WRT],NWPR,NEOFARRAY[*]) 231100 ELSE WRITE(SWF[WRT],NWPR,EOFARRAY[*]) ; 231200 RECORD: IND ~ INDEX[1] ; 231300 IF ABS(A[IND,SORTKEYS[1]]) = EOFMARK THEN 231400 BEGIN 231500 NSLEFT ~ NSLEFT - NNT + 1 ; 231600 IF NSLEFT = NNT THEN LASTPASS ~ TRUE ; 231700 IF NSLEFT = 1 THEN GO TO CLOSEND ; 231800 ASCENDFLAG[WRT] ~ NOT ASCENDFLAG[WRT] ; 231900 FOR I ~ 1 STEP 1 UNTIL NT DO 232000 BEGIN 232100 TT ~ 1 ; 232200 IF I ! WRT THEN TT ~ TSUM[I] ~ TSUM[I] - 1 ELSE 232300 TSUM[I] ~ TSUM[I] + 1 ; 232400 IF TT = 0 THEN 232500 BEGIN 232600 NEWRT ~ I ; 232700 REWIND(SWF[NEWRT]) ; 232800 EOF4: END ; 232900 END ; 233000 IF WRT ! NEWRT THEN 233100 BEGIN 233200 WRT ~ NEWRT ; GO TO NOTALLODD ; 233300 END ; 233400 WRT ~ NEWRT ; GO TO MERGE ; 233500 END ; 233600 IF LASTPASS THEN 233700 BEGIN 233800 RECSOUT ~ RECSOUT + 1 ; 233900 IF SEQFLAG THEN A[IND,SEQCOL] ~ RECSOUT ; 234000 END ; 234100 WRITE(SWF[WRT],NWPR,A[IND,*]) ; 234200 READ REVERSE(SWF[IND],NWPR,A[IND,*])[EOF2] ; 234300 SMALL ~ 1 ; LARGE ~ 2 ; 234400 FLAG ~ IF ASCENDFLAG[WRT] THEN 1 ELSE 2 ; 234500 ADJUST: FIRST ~ INDEX[SMALL] ; SECOND ~ INDEX[LARGE] ; 234600 FOR K ~ 1 STEP 1 UNTIL NCOLS DO 234700 BEGIN 234800 CC ~ SORTKEYS[K] ; 234900 IF A[FIRST,CC] > A[SECOND,CC] THEN GO TO SWFLAG1[FLAG] ; 235000 IF A[FIRST,CC] < A[SECOND,CC] THEN GO TO SWFLAG2[FLAG] ; 235100 END ; 235200 GO TO RECORD ; 235300 XCH: K ~ INDEX[SMALL] ; INDEX[SMALL] ~ INDEX[LARGE] ; 235400 INDEX[LARGE] ~ K ; SMALL ~ LARGE ; LARGE ~ LARGE + 1 ; 235500 IF LARGE { NT THEN GO TO ADJUST ELSE GO TO RECORD ; 235600 CLOSEND: FOR J ~ 1 STEP 1 UNTIL NT DO REWIND(SWF[J]) ; 235700 GO TO RETURN ; 235800 EOF1: WRITE(PRINTER,ERROR1) ; GO TO RETURN ; 235900 EOF2: WRITE(PRINTER,ERROR2) ; GO TO RETURN ; 236000 RETURN: IF (RECSIN ! RECSOUT) THEN 236100 BEGIN 236200 WRITE(PRINTER[DBL],ERROR3) ; 236300 GO TO FINISH ; 236400 END ; 236500 END TAPESORT ; 236600 IF (BLOCPARAM[NOBLOCK] = 1) THEN 236700 BEGIN 236800 COMMENT SORT EVENT TAPE ; 236900 IF BSAVE THEN 237000 BEGIN 237100 INST[3,0] ~ FILENAMES[RE] ; TYPEOUT(SPOOUT,INST[3,*]) ; 237200 END ; 237300 NOSORT ~ NOSORT + 1 ; 237400 NCOLS ~ EVENTCOL[NOSORT,1] ; 237500 FOR L ~ 1 STEP 1 UNTIL NCOLS DO 237600 COLSN[L] ~ EVENTCOL[NOSORT,L+1] ; 237700 TAPESORT(NTAPES,NCPR,NCOLS,COLSN,SORTARRAYSIZE,SWF[RE], 237800 SWF[WR],FALSE,0,BSAVE) ; 237900 TP ~ RE ; RE ~ WR ; WR ~ TP ; 238000 GO TO ORIGIN ; 238100 END ; 238200 IF BLOCPARAM[NOBLOCK] = 2 THEN 238300 BEGIN 238400 COMMENT SORT NEW EVENT TAPE FOR MERGING DURING AN UPDATE WITH 238500 CHANGE RUN ; 238600 NOSORT ~ NOSORT + 1 ; 238700 NCOLS ~ 1 ; COLSN[1] ~ 1 ; 238800 TAPESORT(NTAPES,NCPR,NCOLS,COLSN,SORTARRAYSIZE,SWF[NE], 238900 SWF[WR],FALSE,0,FALSE) ; 239000 TP ~ NE ; NE ~ WR ; WR ~ TP ; 239100 GO TO ORIGIN ; 239200 END ; 239300 COMMENT SORT ACTIVITY TAPE ; 239400 IF BSAVA THEN 239500 BEGIN 239600 INST[2,0] ~ FILENAMES[RD] ; TYPEOUT(SPOOUT,INST[2,*]) ; 239700 END ; 239800 RSORTNUM~ RSORTNUM + 1 ; 239900 NCOLS ~ SORTCOL[RSORTNUM,1] ; 240000 FOR L ~ 1 STEP 1 UNTIL NCOLS DO 240100 COLSN[L] ~ SORTCOL[RSORTNUM,L+1] ; 240200 TAPESORT(NTAPES,NWPR,NCOLS,COLSN,SORTARRAYSIZE,SWF[RD], 240300 SWF[WR],TRUE,0,BSAVA) ; 240400 TP ~ RD ; RD ~ WR ; WR ~ TP ; 240500 COMMENT FILL GLOBAL ARRAYS AFTER SORTING ; 240600 BEGIN 240700 TEMPKEY ~ 0 ; 240800 LOOP: READ(SWF[RD],*,TREC)[EOF] ; 240900 KEY ~ TEMPKEY ~ TEMPKEY + 1 ; 241000 RIRJ[KEY.[30:9],KEY.[39:9]] ~ RRIJ ; 241100 GO TO LOOP ; 241200 EOF: REWIND(SWF[RD]) ; 241300 END ; 241400 END SORT BLOCK ; 241500 GO TO ORIGIN ; 241600 BLOCK5: BEGIN 241700 COMMENT NETANAL BLOCK ; 241800 COMMENT 241900 DEFINITIONS OF VARIABLES IN NETANAL BLOCK 242000 TE,TI TEMPORARY ARRAYS USED IN FORWARD AND BACKWARD 242100 PASSES 242200 MN LATEST ALLOWABLE TIME FOR EVENT TO MEET SCHEDULE 242300 MX MAXIMUM TOTAL TIME LEADING TO EVENT 242400 TEMP,TEMP1,TEMP2,K,L LOCAL VARIABLES USED FOR INDEXING 242500 ARRAYS 242600 SEVENS LARGEST PERMISSABLE REAL NUMBER ON B5000 242700 ; 242800 ARRAY TE,TI[0:NOEVNROW,0:NOEVNCOL] ; 242900 REAL MN,MX ; 243000 REAL SEVENS ; 243100 INTEGER K,L,TEMP,TEMP1,TEMP2 ; 243200 DEFINE DRI = RRIJ.[8:9],RRIJ.[17:9]#, 243300 DRJ = RRIJ.[30:9],RRIJ.[39:9]# ; 243400 LABEL LL2 ; 243410 LABEL LL3,LL4,LL5,LL7,EOF ; 243500 LABEL LOOP ; 243600 LABEL LOOP2,LOOP3,LOOP4,LOOP5,EOF2,EOF3,EOF4,EOF5,LL10,LL11, 243700 LL12,LL13,LL14,L4 ; 243800 SWITCH SW1 ~ LL3,LL7,LL2,LL4 ; 243900 SWITCH SW2 ~ LL10,LL11,LL12,LL13 ; 244000 SEVENS ~ 549755813887 ; SEVENS.[3:6] ~ 63 ; 244100 FOR K ~ 0 STEP 1 UNTIL NOEVNROW DO 244200 FOR L ~ 0 STEP 1 UNTIL NOEVNCOL DO 244300 TE[K,L] ~ TI[K,L] ~ 0 ; 244400 COMMENT PERFORM THE FORWARD PASS ; 244500 LOOP: READ(SWF[RD],*,TREC)[EOF] ; 244600 IF ASD = 0 THEN GO TO LL4 ; 244700 GO TO SW1[ASD] ; 244800 COMMENT COMPUTE EARLIEST START AND SUMS OF VARIANCES FOR ACTIVITY; 244900 LL2: TI[DRI] ~ ADAYS ; 245000 LL3: MX ~ ADAYS + ET ; ES ~ ADAYS ; 245010 SVAR ~ VAR ; GO TO LL5 ; 245100 LL7: ES ~ ADAYS - ET ; MX ~ ADAYS ; SVAR ~ 0 ; GO TO LL5 ; 245200 LL4: ES ~ TI[DRI] ; MX ~ ES + ET ; SVAR ~ TE[DRI] + VAR ; 245300 LL5: IF TI[DRJ] < MX THEN 245400 BEGIN 245500 TI[DRJ] ~ MX ; TE[DRJ] ~ SVAR 245600 END ; 245700 COMMENT UPDATE ACTIVITY TAPE WITH EARLIEST START AND SUMS OF 245800 VARIANCES ; 245900 WRITE(SWF[WR],*,TREC) ; 246000 GO TO LOOP ; 246100 EOF: REWIND(SWF[RD]) ; 246200 TP ~ RD ; RD ~ WR ; WR ~ TP ; 246300 IF EVENTTAPE THEN 246400 BEGIN 246500 COMMENT UPDATE EVENT TAPE WITH EARLIEST OCCURRENCE AND SUMS OF 246600 VARIANCES ; 246700 LOOP2: READ(SWF[RE],*,EREC)[EOF2] ; 246800 EEO ~ TI[RN.[30:9],RN.[39:9]] ; 246900 EVAR ~ TE[RN.[30:9],RN.[39:9]] ; 247000 WRITE(SWF[WR],*,EREC) ; 247100 GO TO LOOP2 ; 247200 EOF2: REWIND(SWF[RE]) ; REWIND(SWF[WR]) ; 247300 TP ~ WR ; WR ~ RE ; RE ~ TP ; 247400 END ; 247500 COMMENT PERFORM BACKWARD PASS ; 247600 FOR K ~ 0 STEP 1 UNTIL NOEVNROW DO 247700 FOR L ~ 0 STEP 1 UNTIL NOEVNCOL DO 247800 TE[K,L] ~ SEVENS ; 247900 FOR K ~ 1 STEP 1 UNTIL EK DO 248000 BEGIN 248100 TEMP ~ REEV[K] ; 248200 TEMP1 ~ TEMP.[30:9] ; TEMP2 ~ TEMP.[39:9] ; 248300 TE[TEMP1,TEMP2] ~ TI[TEMP1,TEMP2] 248400 END ; 248500 LOOP3: READ REVERSE(SWF[RD],*,TREC)[EOF3] ; 248600 IF ASD = 0 THEN GO TO LL12 ; 248700 GO TO SW2[ASD] ; 248800 COMMENT COMPUTE LATEST FINISH FOR ACTIVITY ; 248900 LL10: MN ~ ADAYS ; GO TO LL14 ; 249000 LL11: MN ~ ADAYS-ET ; GO TO LL14 ; 249100 LL13: TE[DRJ] ~ ADAYS ; 249200 LL12: MN ~ TE[DRJ] - ET ; 249300 LL14: IF (TE[DRI] > MN) THEN TE[DRI] ~ MN ; 249400 GO TO LOOP3 ; 249500 EOF3: REWIND(SWF[RD]) ; 249600 COMMENT UPDATE ACTIVITY TAPE WITH LATEST FINISH AND SLACK ; 249700 LOOP4: READ(SWF[RD],*,TREC)[EOF4] ; 249800 IF ASD = 2 THEN 249900 BEGIN 250000 LF ~ ADAYS ; SL ~ 0 ; GO TO L4 250100 END ; 250200 LF ~ TE[DRJ] ; SL ~ LF - ES - ET ; 250300 L4: WRITE(SWF[WR],*,TREC) ; 250400 GO TO LOOP4 ; 250500 EOF4: REWIND(SWF[RD]) ; REWIND(SWF[WR]) ; 250600 TP ~ RD ; RD ~ WR ; WR ~ TP ; 250700 IF EVENTTAPE THEN 250800 BEGIN 250900 COMMENT UPDATE EVENT TAPE WITH LATEST OCCURRENCE AND SLACK ; 251000 LOOP5: READ(SWF[RE],*,EREC)[EOF5] ; 251100 LEO ~ TE[RN.[30:9],RN.[39:9]] ; 251200 SLCK ~ LEO - EEO ; 251300 WRITE(SWF[WR],*,EREC) ; 251400 GO TO LOOP5 ; 251500 EOF5: REWIND(SWF[RE]) ; REWIND(SWF[WR]) ; 251600 TP ~ WR ; WR ~ RE ; RE ~ TP ; 251700 END ; 251800 PURGE(SWF[WR],1) ; 251900 END NETANAL BLOCK ; 252000 GO TO ORIGIN ; 252100 BLOCK6: BEGIN 252200 COMMENT LIST BLOCK ; 252300 COMMENT 252400 DEFINITIONS OF VARIABLES IN LIST BLOCK 252500 TLINE TOTAL NUMBER PRINTED LINES PERMITTED PER PAGE 252600 PAGEN PAGE NUMBER 252700 MOS MONTH NUMBER OF NETWORK START DATE 252800 DAS DAY OF THE MONTH OF NETWORK START DATE 252900 YRS YEAR OF NETWORK START DATE 253000 MOR MONTH NUMBER OF REPORT DATE 253100 DAR DAY OF THE MONTH OF NETWORK REPORT DATE 253200 YRR YEAR OF NETWORK REPORT DATE 253300 MOE MONTH NUMBER OF ACTIVITY START DATE 253400 DAE DAY OF THE MONTH OF ACTIVITY START DATE 253500 YRE YEAR OF ACTIVITY START DATE 253600 MOF MONTH NUMBER OF ACTIVITY FINISH DATE 253700 DAF DAY OF THE MONTH OF ACTIVITY FINISH DATE 253800 YRF YEAR OF ACTIVITY FINISH DATE 253900 DAA DAY OF THE MONTH OF ACTIVITY DATE 254000 MOA MONTH NUMBER OF ACTIVITY DATE 254100 YRA YEAR OF ACTIVITY DATE 254200 NLINE NUMBER OF LINES PRINTED ON PAGE BY PRINTER 254300 TEMPI LOCAL VARIABLE 254400 PDTA NUMBER OF ACTIVITIES LEADING INTO A SUCCESSOR 254500 EVENT 254600 SUTA NUMBER OF ACTIVITIES LEADING FROM A SUCCESSOR 254700 EVENT 254800 ACTA NUMBER OF ACTIVITIES LEADING INTO A SUCCESSOR 254900 EVENT WHICH HAVE BEEN COMPLETED 255000 DEPTDIG NUMBER OF DIGITS IN DEPARTMENT NUMBER 255100 DEPT DEPARTMENT NUMBER 255200 OLDDEPT DEPARTMENT NUMBER OF PREVIOUS EVENT 255300 DC FLAG DENOTING WHICH ACTIVITIES ARE TO BE LISTED 255400 0 ALL ACTIVITIES 255500 1 DUMMY ACTIVITES OMITTED 255600 2 COMPLETED ACTIVITES OMITTED 255700 3 DUMMY AND COMPLETED ACTIVITES OMITTED 255800 DEPTIJ FLAG DENOTING TYPE OF ACTIVITY DEPARTMENT 255900 REPORTS 256000 0 NO DEPARTMENT REPORTS 256100 1 REPORTS BY DEPARTMENT OF PREDECESSOR EVENT 256200 2 REPORTS BY DEPARTMENT OF SUCCESSOR EVENT 256300 NINES 9999999999 256400 MILESTONE MILESTONE EVENT NUMBER 256500 PEC FLAG, P DENOTING THAT ALL PRECEDING ACTIVITIES 256600 HAVE BEEN COMPLETED 256700 ATYPE TYPE OF ACTIVITY DATE 256800 PROB PROBABILITY OF MEETING A SHEDULE DATE 256900 BOOL2 BOOLEAN FLAG, TRUE IF ACTIVITY DATE IS NOT VALID 257000 BDUM BOOLEAN FLAG, TRUE IF DUMMY ACTIVITIES ARE TO 257100 BE OMITTED FROM LISTING 257200 BCOMP BOOLEAN FLAG, TRUE IF COMPLETED ACTIVITIES ARE 257300 TO BE OMITTED FROM LISTING 257400 BDUMCOMP BOOLEAN FLAG, TRUE IF DUMMY AND COMPLETED 257500 ACTIVITIES ARE TO BE OMITTED FROM LISTING 257600 MSLIST BOOLEAN FLAG, TRUE IF MILESTONE REPORTS ARE TO 257700 BE GENERATED 257800 DEPTLIST BOOLEAN FLAG, TRUE IF EVENT DEPARTMENT REPORTS 257900 ARE TO BE GENERATED 258000 DPM ARRAY CONTAINING NUMBER OF DAYS IN EACH MONTH 258100 MONTH ARRAY CONTAINING ABBREVIATION OF EACH MONTH 258200 TITLE ARRAY CONTAINING TITLE OF MILESTONE REPORT 258300 ; 258400 INTEGER TLINE,PAGEN,MOS,DAS,YRS,MOR,DAR,YRR,MOE,DAE,YRE,MOF,DAF, 258500 YRF,NLINE,PDTA,SUTA,ACTA,TEMPI ; 258600 INTEGER DEPTDIG,DEPT,OLDDEPT ; 258700 BOOLEAN BOOL2 ; 258800 INTEGER ARRAY DPM[0:12] ; 258900 ALPHA ARRAY MONTH[0:12] ; 259000 LIST OUT1(FOR LL ~ 1 STEP 1 UNTIL 13 DO NETNAME[LL],PAGEN) ; 259100 LIST OUTH(FOR LL ~ 1 STEP 1 UNTIL 13 DO NETNAME[LL]), 259200 OUTHA(DAS,MONTH[MOS],YRS,NOACT,RUN,DAR,MONTH[MOR],YRR, 259300 NOEVN) ; 259400 FORMAT OUT FORM1("NETWORK NAME",X6,13A6,X14,"PAGE",I6) ; 259500 FORMAT OUT FORMH(////////////////////"NETWORK NAME",X6,13A6//), 259600 FORMHA("NETWORK START DATE",I5,X1,A3,I3,X8,"NUMBER OF ", 259700 "ACTIVITIES",I11,X10,"RUN NUMBER",I11//"NETWORK ", 259800 "REPORT DATE",I4,X1,A3,I3,X8,"NUMBER OF EVENTS",I15); 259900 PROCEDURE PACK(DAYS,SDAYS,WDPW,DPM,MO,DA,YR,BOOL) ; 260000 COMMENT THIS PROCEDURE COMPUTES THE MONTH NO, DAY, AND YEAR OF A 260100 DATE SPECIFIED IN NUMBER OF WORKING DAYS FROM A GIVEN 260200 DATE ; 260300 COMMENT 260400 DEFINITIONS OF VARIABLES IN PROCEDURE PACK 260500 DAYS DATE TO BE PACKED GIVEN IN NUMBER OF WORKING 260600 DAYS FROM A GIVEN DATE SDAYS 260700 SDAYS NUMBER OF WORKING DAYS FROM 1/1/62 TO A GIVEN 260800 DATE 260900 WDPW NUMBER OF WORKING DAYS PER WEEK 261000 MO MONTH NUMBER OF DATE DAYS 261100 DA DAY OF THE MONTH OF DATE DAYS 261200 YR YEAR OF DATE DAYS 261300 BOOL BOOLEAN FLAG, TRUE IF DAYS IS NOT A VALID DATE 261400 DPM ARRAY CONTAINING NUMBER OF DAYS IN EACH MONTH 261500 TDAYS NUMBER OF WORKING DAYS FROM 1/1/62 UNTIL DAYS 261600 TEMP NUMBER OF WORK WEEKS IN TDAYS 261700 TTDAY NUMBER OF ACTUAL DAYS FROM 1/1/62 UNTIL DAYS 261800 C NUMBER OF YEARS FROM 1/1/61 UNTIL DAYS 261900 K NUMBER OF YEARS FROM LAST LEAP YEAR 262000 M NUMBER OF MONTHS IN DATE OF DAYS 262100 ; 262200 VALUE DAYS,SDAYS,WDPW ; 262300 INTEGER DAYS,SDAYS,WDPW,MO,DA,YR ; 262400 BOOLEAN BOOL ; 262500 INTEGER ARRAY DPM[0] ; 262600 BEGIN 262700 INTEGER TDAYS,TEMP,TTDAY,C,K,M ; 262800 LABEL T1,T2,T4,L1,L2,L3 ; 262900 TDAYS ~ DAYS + SDAYS ; 263000 TEMP ~ TDAYS MOD WDPW ; 263100 TTDAY ~ (TDAYS DIV WDPW) | 7 + TEMP ; 263200 IF TEMP = 0 THEN TTDAY ~ TTDAY - 2 ; 263300 IF TTDAY < 0 THEN 263400 BEGIN 263500 DA ~ 1 ; MO ~ 1 ; YR ~ 62 ; 263600 BOOL ~ TRUE ; GO TO L3 263700 END ; 263800 IF TTDAY > 6940 THEN 263900 BEGIN 264000 DA ~ 31 ; MO ~ 12 ; YR ~ 80 ; 264100 BOOL ~ TRUE ; GO TO L3 264200 END ; 264300 TTDAY ~ TTDAY + 365 ; 264400 C ~ 0 ; 264500 T1: K ~ 0 ; 264600 T2: IF TTDAY { 365 THEN GO TO T4 ; 264700 TTDAY ~ TTDAY - 365 ; 264800 K ~ K + 1 ; C ~ C + 1 ; 264900 IF K ! 3 THEN GO TO T2 ; 265000 IF TTDAY > 366 THEN 265100 BEGIN 265200 TTDAY ~ TTDAY - 366 ; C ~ C + 1 ; GO TO T1 265300 END ; 265400 T4: YR ~ 61 + C ; 265500 IF (YR MOD 4) ! 0 THEN 265600 BEGIN 265700 M ~ 1 ; GO TO L1 265800 END ; 265900 IF TTDAY { 31 THEN 266000 BEGIN 266100 MO ~ 1 ; GO TO L2 266200 END ; 266300 TTDAY ~ TTDAY - 31 ; 266400 IF TTDAY { 29 THEN 266500 BEGIN 266600 MO ~ 2 ; GO TO L2 266700 END ; 266800 TTDAY ~ TTDAY - 29 ; M ~ 3 ; 266900 L1: FOR MO ~ M STEP 1 UNTIL 12 DO 267000 BEGIN 267100 IF TTDAY { DPM[MO] THEN GO TO L2 ; 267200 TTDAY ~ TTDAY - DPM[MO] 267300 END ; 267400 L2: DA ~ TTDAY ; BOOL ~ FALSE ; 267500 L3: END PACK ; 267600 PROCEDURE UPACK(MODAYR,MO,DA,YR) ; 267700 COMMENT THIS PROCEDURE UNPACKS DATE MODAYR INTO MONTH NO., DAY, 267800 AND YEAR ; 267900 COMMENT 268000 DEFINITIONS OF VARIABLES IN PROCEDURE UPACK 268100 MODAYR SIX DIGIT DATE TO BE UNPACKED 268200 MO MONTH NUMBER OF MODAYR 268300 DA DAY OF THE MONTH OF MODAYR 268400 YR YEAR OF MODAYR 268500 ; 268600 VALUE MODAYR ; 268700 INTEGER MODAYR,MO,DA,YR ; 268800 BEGIN 268900 YR ~ MODAYR MOD 100 ; 269000 MO ~ MODAYR DIV 10000 ; 269100 DA ~ (MODAYR DIV 100) MOD 100 269200 END UPACK ; 269300 FILL DPM[*] WITH 0,31,28,31,30,31,30,31,31,30,31,30,31 ; 269400 FILL MONTH[*] WITH " ","JAN","FEB","MAR","APR","MAY", 269500 "JUN","JUL","AUG","SEP","OCT","NOV","DEC" ; 269600 UPACK(SDATE,MOS,DAS,YRS) ; UPACK(RDATE,MOR,DAR,YRR) ; 269700 IF (BLOCPARAM[NOBLOCK].[9:3] = 0) THEN 269800 BEGIN 269900 COMMENT BLOCK TO LIST ACTIVITIES ; 270000 INTEGER DAA,MOA,YRA ; 270100 INTEGER DC,DEPTIJ ; 270200 ALPHA PEC,ATYPE ; 270300 REAL PROB ; 270400 BOOLEAN BDUM,BCOMP ; 270500 BOOLEAN BDUMCOMP ; 270600 LABEL L1,L2,L5,L6,L7,LL1,LL2,LL3,LL4,EOF ; 270700 LABEL D1,D2,D3,D4,D5,D6 ; 270800 SWITCH SW1 ~ LL1,LL2,LL3,LL4 ; 270900 SWITCH SW2 ~ L6,D1,D2 ; 271000 SWITCH SW3 ~ L1,D4,D5 ; 271100 LIST OUT6(FOR LL ~ 2 STEP 1 UNTIL 5 DO ITEMNAME[SORTCOL 271200 [RSORTNUM,LL]]), 271300 OUTR(FOR LL ~ 1 STEP 1 UNTIL 4 DO REMARKS[LL]), 271400 OUT2(KEY,I,J,ET,VAR,DAA,MONTH[MOA],YRA,ATYPE,DAF, 271500 MONTH[MOF],YRF,SL,ES+ET,SVAR,PDTA,SUTA,ACTA,RANKI, 271600 PEC), 271700 OUT3(KEY,I,J,ET,VAR,DAE,MONTH[MOE],YRE,DAF,MONTH[MOF], 271800 YRF,SL,ES+ET,SVAR,PDTA,SUTA,ACTA,RANKI,PEC), 271900 OUT4(KEY,I,J,ET,DAA,MONTH[MOA],YRA,ATYPE,PDTA,SUTA,ACTA, 272000 RANKI,PEC), 272100 OUT5(KEY,I,J,ET,VAR,DAA,MONTH[MOA],YRA,ATYPE,DAE, 272200 MONTH[MOE],YRE,SL,ET+ES,SVAR,PDTA,SUTA,ACTA,RANKI, 272300 PEC,PROB) ; 272400 FORMAT OUT FORM6("DEPARTMENT REPORTS BY DEPARTMENT OF PREDECESSOR ", 272500 "EVENT SORTED BY",4(X2,A6)//), 272600 FORM7("DEPARTMENT REPORTS BY DEPARTMENT OF SUCCESSOR ", 272700 "EVENT SORTED BY",4(X2,A6)//), 272800 FORM8("LISTING OF ACTIVITIES SORTED BY",4(X2,A6)//), 272900 FORM9("LISTING OF ACTIVITIES BY DEPARTMENT OF ", 273000 "PREDECESSOR EVENT",X26,"DEPARTMENT NUMBER",I10), 273100 FORM10("LISTING OF ACTIVITIES BY DEPARTMENT OF SUCCESSOR", 273200 " EVENT",X28,"DEPARTMENT NUMBER",I10), 273300 FORMR(4A6), 273400 FORMDC("DUMMY AND COMPLETED ACTIVITIES ARE OMITTED FROM 273500 LISTING."), 273600 FORMC("COMPLETED ACTIVITIES ARE OMITTED FROM LISTING."), 273700 FORMD("DUMMY ACTIVITIES ARE OMITTED FROM LISTING."), 273800 HEAD(" ACTIVITY DESCRIPTION EXP./ACT",X7,"ACTIVITY ", 273900 "DATE EARLIEST LATEST",X9,"EXPECTED",X7,"PRE SUC", 274000 " ACT"/" KEY PREDECESSOR SUCCESSOR DURATION VAR. ", 274100 " DATE TYPE START FINISH SLACK COMP. ", 274200 "VAR. TAL TAL TAL RANK PROB"/), 274300 FORM2(I5,2I11,2F7.1,I3,X1,A3,I3,X1,A3,X10,I4,X1,A3,I3, 274400 3F7.1,3I4,I5,X1,A1), 274500 FORM3(I5,2I11,2F7.1,X14,I3,X1,A3,I3,I4,X1,A3,I3,3F7.1, 274600 3I4,I5,X1,A1), 274700 FORM4(I5,2I11,F7.1,X7,I3,X1,A3,I3,X1,A3,X42,3I4,I5,X1,A1), 274800 FORM5(I5,2I11,2F7.1,I3,X1,A3,I3,X1,A3,I3,X1,A3,I3,X11, 274900 3F7.1,3I4,I5,X1,A1,F4.2) ; 275000 REAL PROCEDURE NORMPROB(SCHED,EXPT,SVAR) ; 275100 COMMENT THIS PROCEDURE COMPUTES THE PROBABILITY OF MEETING 275200 SCHEDULE COMPLETIONS ; 275300 COMMENT 275400 DEFINITIONS OF VARIABLES IN PROCEDURE NORMPROB 275500 SCHED NUMBER OF WORKING DAYS FROM NETWORK START DATE 275600 UNTIL ACTIVITY SCHEDULE DATE 275700 EXPT NUMBER OF WORKING DAYS FROM NETWORK START DATE 275800 UNTIL EXPECTED FINISH OF ACTIVITY 275900 SVAR SUM OF THE VARIANCES ALONG MOST CRITICAL PATH 276000 LEADING TO GIVEN ACTIVITY 276100 V,Y,Z LOCAL VARIABLES TO PROCEDURE 276200 ; 276300 VALUE SCHED,EXPT,SVAR ; 276400 REAL SCHED,EXPT,SVAR ; 276500 BEGIN 276600 REAL V,Y,Z ; 276700 V ~ (SCHED - EXPT)/(SQRT(SVAR)) ; 276800 Y ~ ABS(V)/1.4142136 ; 276900 Z ~ SIGN(V) ; 277000 IF Y > 50.0 THEN NORMPROB ~ 0.5 | (1 + Z) ELSE 277100 NORMPROB ~ 0.5 | (1.0 + Z | (1.0/((((0.078108 | Y + 277200 0.000972) | Y + 0.230389) | Y + 0.278393) | Y + 1.0)*4)) 277300 END NORMPROB ; 277400 BDUM ~ BCOMP ~ BDUMCOMP ~ FALSE ; 277500 DC ~ BLOCPARAM[NOBLOCK].[42:6] ; 277600 IF (DC = 3) THEN BDUMCOMP ~ BCOMP ~ BDUM ~ TRUE ELSE 277700 IF (DC = 1) THEN BDUM ~ TRUE ELSE 277800 IF (DC =2) THEN BCOMP ~ TRUE ; 277900 NLINE ~ TLINE ~ 13 ; PAGEN ~ 0 ; 278000 COMMENT WRITE TITLE PAGE ; 278100 WRITE(PRINTER[PAGE]) ; 278200 WRITE(PRINTER,FORMH,OUTH) ; 278300 DEPTIJ ~ BLOCPARAM[NOBLOCK].[16:3] ; 278400 GO TO SW2[DEPTIJ + 1] ; 278500 L6: WRITE(PRINTER,FORM8,OUT6) ; GO TO L7 ; 278600 D1: WRITE(PRINTER,FORM6,OUT6) ; GO TO D3 ; 278700 D2: WRITE(PRINTER,FORM7,OUT6) ; 278800 D3: DEPTDIG ~ BLOCPARAM[NOBLOCK].[20:3] ; 278900 IF (DEPTDIG = 0) THEN DEPTDIG ~ 4 ; 279000 OLDDEPT ~ 10 * DEPTDIG ; 279100 DEPTDIG ~ 10 * (10 - DEPTDIG) ; 279200 L7: WRITE(PRINTER,FORMHA,OUTHA) ; 279300 COMMENT READ ACTIVITY RECORD ; 279400 L2: READ(SWF[RD],*,TREC)[EOF] ; 279500 IF (ASD = 2) AND BCOMP THEN GO TO L2 ; 279600 IF BDUM AND ((ET = 0) AND (VAR = 0)) THEN GO TO L2 ; 279700 GO TO SW3[DEPTIJ + 1] ; 279800 D4: DEPT ~ I DIV DEPTDIG ; GO TO D6 ; 279900 D5: DEPT ~ J DIV DEPTDIG ; 280000 D6: IF (DEPT ! OLDDEPT) THEN 280100 BEGIN 280200 OLDDEPT ~ DEPT ; 280300 NLINE ~ 13 ; PAGEN ~ 0 ; 280400 END ; 280500 L1: NLINE ~ NLINE + 1 ; 280600 IF NLINE > TLINE THEN 280700 BEGIN 280800 COMMENT WRITE HEADING ; 280900 PAGEN ~ PAGEN + 1 ; NLINE ~ 1 ; 281000 WRITE(PRINTER[PAGE]) ; 281100 WRITE(PRINTER[DBL],FORM1,OUT1) ; 281200 IF (DEPTIJ = 1) THEN WRITE(PRINTER[DBL],FORM9,DEPT) ELSE 281300 IF (DEPTIJ = 2) THEN WRITE(PRINTER[DBL],FORM10,DEPT) ; 281400 IF BDUMCOMP THEN WRITE(PRINTER[DBL],FORMDC) ELSE 281500 IF BCOMP THEN WRITE(PRINTER[DBL],FORMC) ELSE 281600 IF BDUM THEN WRITE(PRINTER[DBL],FORMD) ; 281700 WRITE(PRINTER,HEAD) ; 281800 END ; 281900 PDTA ~ TAL.[30:9] ; 282000 SUTA ~ TAL.[21:9] ; 282100 ACTA ~ TAL.[39:9] ; 282200 IF TAL < 0 THEN PEC ~ "P" ELSE PEC ~ " " ; 282300 COMMENT COMPUTE ACTIVITY EARLIEST START DATE ; 282400 IF ES > ENTIER(ES) THEN TEMPI ~ ENTIER(ES) + 1 ELSE 282500 TEMPI ~ ENTIER(ES) ; 282600 PACK(TEMPI,SDAYS,WDPW,DPM,MOE,DAE,YRE,BOOL2) ; 282700 COMMENT COMPUTE ACTIVITY LATEST FINISH DATE ; 282800 IF LF > ENTIER(LF) THEN TEMPI ~ ENTIER(LF) + 1 ELSE 282900 TEMPI ~ ENTIER(LF) ; 283000 PACK(TEMPI,SDAYS,WDPW,DPM,MOF,DAF,YRF,BOOL2) ; 283100 WRITE(PRINTER,FORMR,OUTR) ; 283200 L5: IF ASD ! 0 THEN 283300 BEGIN 283400 TEMPI ~ ADAYS ; 283500 COMMENT COMPUTE ACTIVITY DATE AND LIST ACTIVITY RECORD ; 283600 PACK(TEMPI,SDAYS,WDPW,DPM,MOA,DAA,YRA,BOOL2) ; 283700 GO TO SW1[ASD] ; 283800 LL1: ATYPE ~ "ST." ; WRITE(PRINTER[DBL],FORM2,OUT2) ; 283900 GO TO L2 ; 284000 LL2: ATYPE ~ "COM" ; WRITE(PRINTER[DBL],FORM4,OUT4) ; 284100 GO TO L2 ; 284200 LL3: ATYPE ~ "DIR" ; WRITE(PRINTER[DBL],FORM2,OUT2) ; 284300 GO TO L2 ; 284400 LL4: ATYPE ~ "SCH" ; 284500 IF SVAR ! 0 THEN 284600 PROB ~ NORMPROB(ADAYS,ET+ES,SVAR) ELSE PROB ~ 0 ; 284700 WRITE(PRINTER[DBL],FORM5,OUT5) ; GO TO L2 284800 END ; 284900 WRITE(PRINTER[DBL],FORM3,OUT3) ; 285000 GO TO L2 ; 285100 EOF: REWIND(SWF[RD]) ; 285200 GO TO ORIGIN 285300 END ; 285400 BEGIN 285500 COMMENT BLOCK TO LIST EVENTS ; 285600 INTEGER NINES,MILESTONE ; 285700 BOOLEAN MSLIST,DEPTLIST ; 285800 ALPHA ARRAY TITLE[0:12] ; 285900 FILE IN MSCARDS(2,10) ; 286000 LABEL LOOP,EOF ; 286100 LABEL L1,L2 ; 286200 LIST OUT2(EVNO,FOR LL ~ 1 STEP 1 UNTIL 4 DO DSCPT[LL],DAE, 286300 MONTH[MOE],YRE,DAF,MONTH[MOF],YRF,SLCK,EVAR,RANKE, 286400 PDTA,SUTA,ACTA), 286500 OUT3(FOR LL ~ 2 STEP 1 UNTIL 5 DO EVENTITEM[EVENTCOL 286600 [NOSORT,LL]]), 286700 TITLELIST(FOR LL ~ 1 STEP 1 UNTIL 12 DO TITLE[LL]) ; 286800 FORMAT IN MSTITLE(12A6), 286900 MSFORM(I10) ; 287000 FORMAT OUT HEAD(" EVENT",X11,"EVENT",X22,"EARLIEST ", 287100 "LATEST",X13,"TOTAL",X8,"PRE SUC ACT"/" NUMBER", 287200 X7,"DESCRIPTION",X18,"OCCURRENCE OCCURRENCE", 287300 " SLACK VARIANCE RANK TAL TAL TAL"/), 287400 FORM2(I10,X1,4A6,X11,I2,X1,A3,I3,I4,X1,A3,I3,2F8.1,I7, 287500 3I4), 287600 FORM3(I10,X1,4A6," STARTING ",I2,X1,A3,I3,I4,X1,A3,I3, 287700 2F8.1,I7,3I4), 287800 FORM4(I10,X1,4A6," ENDING ",I2,X1,A3,I3,I4,X1,A3,I3, 287900 2F8.1,I7,3I4), 288000 FORM5("DEPARTMENT REPORTS OF EVENTS"//), 288100 FORM6("MILESTONE REPORTS"//), 288200 FORM7("LISTING OF EVENTS SORTED BY",4(X2,A6)//), 288300 FORM8("MILESTONE EVENT NUMBER",I10," NOT ON EVENT TAPE"), 288400 FORM9("DEPARTMENT NUMBER",I10,X4,"EVENT REPORT"), 288500 FORM10("MILESTONE REPORT ",12A6) ; 288600 DEPTLIST ~ MSLIST ~ FALSE ; 288700 NLINE ~ TLINE ~ 25 ; PAGEN ~ 0 ; 288800 NINES ~ 9999999999 ; 288900 COMMENT WRITE TITLE PAGE ; 289000 WRITE(PRINTER[PAGE]) ; WRITE(PRINTER,FORMH,OUTH) ; 289100 IF (BLOCPARAM[NOBLOCK].[16:3] = 1) THEN 289200 BEGIN 289300 DEPTLIST ~ TRUE ; 289400 DEPTDIG ~ BLOCPARAM[NOBLOCK].[20:3] ; 289500 IF (DEPTDIG = 0) THEN DEPTDIG ~ 4 ; 289600 OLDDEPT ~ 10 * DEPTDIG ; 289700 DEPTDIG ~ 10 * (10 - DEPTDIG) ; 289800 WRITE(PRINTER[DBL],FORM5) ; 289900 END 290000 ELSE IF (BLOCPARAM[NOBLOCK].[16:3] = 2) THEN 290100 BEGIN 290200 MSLIST ~ TRUE ; 290300 WRITE(PRINTER,FORM6) ; 290400 READ(MSCARDS,MSTITLE,TITLELIST)[EOF] ; 290500 END 290600 ELSE WRITE(PRINTER,FORM7,OUT3) ; 290700 WRITE(PRINTER,FORMHA,OUTHA) ; 290800 COMMENT READ EVENT RECORD ; 290900 LOOP: READ(SWF[RE],*,EREC)[EOF] ; 291000 IF DEPTLIST THEN 291100 BEGIN 291200 DEPT ~ EVNO DIV DEPTDIG ; 291300 IF DEPT ! OLDDEPT THEN 291400 BEGIN 291500 OLDDEPT ~ DEPT ; 291600 NLINE ~ 25 ; PAGEN ~ 0 ; 291700 END ; 291800 END 291900 ELSE IF MSLIST THEN 292000 BEGIN 292100 COMMENT READ MILESTONE CARDS ; 292200 L1: READ(MSCARDS,MSFORM,MILESTONE)[EOF] ; 292300 IF(MILESTONE = NINES) THEN 292400 BEGIN 292500 READ(MSCARDS,MSTITLE,TITLELIST)[EOF] ; 292600 NLINE ~ 25 ; PAGEN ~ 0 ; 292700 EVNO ~ 0 ; 292800 REWIND(SWF[RE]) ; 292900 GO TO L1 ; 293000 END ; 293100 L2: IF (EVNO < MILESTONE) THEN 293200 BEGIN 293300 READ(SWF[RE],*,EREC)[EOF] ; 293400 GO TO L2 ; 293500 END ; 293600 IF (EVNO > MILESTONE) THEN 293700 BEGIN 293800 WRITE(PRINTER[DBL],FORM8,MILESTONE) ; 293900 GO TO L1 ; 294000 END ; 294100 END ; 294200 NLINE ~ NLINE + 1 ; 294300 IF NLINE > TLINE THEN 294400 BEGIN 294500 COMMENT WRITE HEADING ; 294600 PAGEN ~ PAGEN + 1 ; NLINE ~ 1 ; 294700 WRITE(PRINTER[PAGE]) ; WRITE(PRINTER[DBL],FORM1,OUT1) ; 294800 IF DEPTLIST THEN WRITE(PRINTER[DBL],FORM9,DEPT) ELSE 294900 IF MSLIST THEN WRITE(PRINTER[DBL],FORM10,TITLELIST) ; 295000 WRITE(PRINTER,HEAD) ; 295100 END ; 295200 PDTA ~ TALLY.[30:9] ; 295300 SUTA ~ TALLY.[21:9] ; 295400 ACTA ~ TALLY.[39:9] ; 295500 COMMENT COMPUTE EARLIEST EVENT OCCURRENCE DATE ; 295600 TEMPI ~ ENTIER(EEO) ; 295700 IF (EEO > TEMPI) THEN TEMPI ~ TEMPI + 1 ; 295800 PACK(TEMPI,SDAYS,WDPW,DPM,MOE,DAE,YRE,BOOL2) ; 295900 COMMENT COMPUTE LATEST EVENT OCCURRENCE DATE ; 296000 TEMPI ~ ENTIER(LEO) ; 296100 IF (LEO > TEMPI) THEN TEMPI ~ TEMPI + 1 ; 296200 PACK(TEMPI,SDAYS,WDPW,DPM,MOF,DAF,YRF,BOOL2) ; 296300 COMMENT LIST EVENT RECORD ; 296400 IF PDTA = 0 THEN 296500 WRITE(PRINTER[DBL],FORM3,OUT2) ELSE 296600 IF SUTA = 0 THEN 296700 WRITE(PRINTER[DBL],FORM4,OUT2) ELSE 296800 WRITE(PRINTER[DBL],FORM2,OUT2) ; 296900 GO TO LOOP ; 297000 EOF: REWIND(SWF[RE]) ; 297100 END ; 297200 END ; 297300 GO TO ORIGIN ; 297400 BLOCK7: BEGIN 297500 COMMENT PLOT BLOCK ; 297600 COMMENT 297700 DEFINITIONS OF VARIABLES IN PLOT BLOCK 297800 PARA FLAG DENOTING INTERVAL OF GRAPH 297900 1 DAYS 298000 2 WEEKS 298100 3 MONTHS 298200 4 QUARTERS 298300 MOS MONTH NUMBER OF NETWORK START DATE 298400 DAS DAY OF THE MONTH OF NETWORK START DATE 298500 YRS YEAR OF NETWORK START DATE 298600 MOR MONTH NUMBER OF REPORT DATE 298700 DAR DAY OF THE MONTH OF REPORT DATE 298800 YRR YEAR OF REPORT DATE 298900 PAGEN PAGE NUMBER OF GRAPH 299000 TLINE TOTAL NUMBER OF PRINTED LINES ALLOWED PER PAGE 299100 NLINE NUMBER OF LINES PRINTED ON PAGE BY PRINTER 299200 PDATE GRAPH STARTING DATE 299300 MOP MONTH NUMBER OF GRAPH STARTING DATE 299400 DAP DAY OF THE MONTH OF GRAPH STARTING DATE 299500 YRP YEAR OF GRAPH STARTING DATE 299600 PDAYS NUMBER OF WORKING DAYS FROM 1/1/62 UNTIL GRAPH 299700 STARTING DATE 299800 CPDATE CORRECTED GRAPH STARTING DATE 299900 QP QUARTER OF GRAPH START DATE 300000 PY YEAR FOR HEADING OF GRAPH BY QUARTERS 300100 SWER FLAG DENOTING TYPE OF ERROR IN GRAPH STARTING 300200 DATE 300300 DC FLAG DENOTING WHICH ACTIVITIES ARE TO BE PLOTTED 300400 0 ALL ACTIVITIES ARE TO BE PLOTTED 300500 1 DUMMY ACTIVITIES ARE TO BE OMITTED 300600 2 COMPLETED ACTIVITES ARE TO BE OMITTED 300700 3 DUMMY AND COMPLETED ACTIVITES ARE TO BE 300800 OMITTED 300900 DEPT DEPARTMENT NUMBER OF CURRENT EVENT 301000 DEPTIJ FLAG DENOTING TYPE OF DEPARTMENT GRAPHS 301100 0 NO DEPARTMENT GRAPHS 301200 1 GRAPHS BY DEPARTMENT OF PREDECESSOR EVENT 301300 2 GRAPHS BY DEPARTMENT OF SUCCESSOR EVENT 301400 DEPTDIG NUMBER OF DIGITS IN DEPARTMENT NUMBER FIELD 301500 OLDDEPT DEPARTMENT NUMBER OF PREVIOUS EVENT 301600 BDUM BOOLEAN FLAG, TRUE IF DUMMY ACTIVITIES ARE TO BE 301700 OMITTED FROM GRAPH 301800 BCOMP BOOLEAN FLAG, TRUE IF COMPLETED ACTIVITIES ARE 301900 TO BE OMITTED FROM GRAPH 302000 BDUMCOMP BOOLEAN FLAG, TRUE IF BOTH DUMMY AND COMPLETED 302100 ACTIVITIES ARE TO BE OMITTED FROM LISTING 302200 DEPTTITLE BOOLEAN FLAG, TRUE IF TITLE FOR DEPARTMENT 302300 REPORTS HAS JUST BEEN WRITTEN 302400 WD INTERVAL OF GRAPH IF BY WEEKS OR DAYS 302500 Y ARRAY CONTAINING YEARS FOR HEADING OF GRAPH BY 302600 MONTHS 302700 DPM ARRAY CONTAINING NUMBER OF DAYS IN EACH MONTH 302800 MONTH ARRAY CONTAINING ABBREVIATION OF EACH MONTH 302900 M ARRAY CONTAINING INITIAL OF EACH MONTH 303000 EST START TIME OF ACTIVITY IN WHOLE WORKING DAYS 303100 LFT FINISH TIME OF ACTIVITY IN WHOLE WORKING DAYS 303200 MOE MONTH NUMBER OF ACTIVITY START DATE 303300 DAE DAY OF THE MONTH OF ACTIVITY START DATE 303400 YRE YEAR OF ACTIVITY START DATE 303500 MOF MONTH NUMBER OF ACTIVITY FINISH DATE 303600 DAF DAY OF THE MONTH OF ACTIVITY FINISH DATE 303700 YRF YEAR OF ACTIVITY FINISH DATE 303800 STAR GRAPH COLUMN NUMBER OF ACTIVITY START 303900 FIN GRAPH COLUMN NUMBER OF ACTIVITY FINISH 304000 DUR GRAPH COLUMN NUMBER OF LAST INTERVAL OF ACTIVITY 304100 DURATION 304200 N COLUMN NUMBER OF ACTIVITY FINISH 304300 CH COLUMN NUMBER OF ACTIVITY START 304400 BOOL2 BOOLEAN FLAG, TRUE IF ACTIVITY START DATE OR 304500 FINISH DATE IS NOT A VALID CALENDAR DATE OR 304600 ACTIVITY DURATION EXTENDS BEYOND 12/31/80 304700 BOOL3 BOOLEAN FLAG, TRUE IF FIN OR DUR IS GREATER 304800 THAN 66 304900 BOOL4 BOOLEAN FLAG, TRUE IF ACTIVITY FINISH DATE IS 305000 EARLIER THAN GRAPH STARTING DATE 305100 BOOL5 BOOLEAN FLAG, TRUE IF ACTIVITY START DATE IS 305200 EARLIER THAN GRAPH STARTING DATE 305300 BOOL6 BOOLEAN FLAG, TRUE IF ACTIVITY START IS BEYOND 305400 BOUNDS OF GRAPH 305500 BEYOND LETTER TO APPEAR IN THE COLUMN TO THE RIGHT OF 305600 THE FIRST GRAPHICAL LINE FOR ACTIVITY 305700 CONT LETTER TO APPEAR IN THE COLUMN TO THE RIGHT OF 305800 THE SECOND GRAPHICAL LINE FOR ACTIVITY 305900 ALPH LETTER TO APPEAR IN COLUMN FOR ACTIVITY START 306000 DATE 306100 BETA LETTER TO APPEAR IN COLUMN FOR ACTIVITY FINISH 306200 DATE 306300 BUFF1 ARRAY CONTAINING FIRST LINE OF GRAPHICAL OUTPUT 306400 FOR ACTIVITY 306500 BUFF2 ARRAY CONTAINING SECOND LINE OF GRAPHICAL OUTPUT 306600 FOR ACTIVITY 306700 E ARRAY CONTAINING TYPE OF ACTIVITY START DATE 306800 F ARRAY CONTAINING TYPE OF ACTIVITY FINISH DATE 306900 PPDAYS LOCAL VARIABLE USED IN COMPUTING DUR,STAR, AND 307000 FIN WHEN GRAPH BY DAYS 307100 WKP,WKE,WKF,TEMP LOCAL VARIABLES USED IN COMPUTING DUR, 307200 STAR, AND FIN WHEN GRAPH BY WEEKS 307300 YRES,YRFS,DMO,DDA,DYR,DYRS,QE,QF,DQ LOCAL VARIABLES USED 307400 IN COMPUTING DUR, STAR, AND FIN WHEN GRAPH BY 307500 MONTHS OR QUARTERS 307600 NN INDEX OF ARRAY BUFF1 307700 LL,MM INDICES USED IN LISTS 307800 ; 307900 INTEGER LL,MM,NN,PARA,MOS,DAS,YRS,MOR,DAR,YRR,PAGEN,TLINE, 308000 NLINE,PDATE,MOP,DAP,YRP,PDAYS,CPDATE,QP,PY ; 308100 INTEGER SWER ; 308200 INTEGER DC,DEPT,DEPTIJ,DEPTDIG,OLDDEPT ; 308300 BOOLEAN BDUM,BCOMP ; 308400 BOOLEAN BDUMCOMP ; 308500 BOOLEAN DEPTTITLE ; 308600 ALPHA WD ; 308700 INTEGER ARRAY Y[0:7],DPM[0:12] ; 308800 ALPHA ARRAY MONTH[0:12],M[0:12] ; 308900 LABEL HPL1A,HPL2A,HPL3A,HPL1,HPL2,HPL3,ERR,L1 ; 309000 LABEL START ; 309100 LABEL D1,D2,D3,D4,D5,HPLA,HPLAA ; 309200 SWITCH SW1 ~ HPL1A,HPL1A,HPL2A,HPL3A ; 309300 SWITCH SW6 ~ HPL1,HPL1,HPL2,HPL3 ; 309400 SWITCH SWD1 ~ D1,D2,D3 ; 309500 LIST OPR1(FOR LL ~ 1 STEP 1 UNTIL 13 DO NETNAME[LL]), 309600 OPR2(FOR LL ~ 2 STEP 1 UNTIL 5 DO ITEMNAME[SORTCOL 309700 [RSORTNUM,LL]]), 309800 OPR5(DAS,MONTH[MOS],YRS,NOACT,RUN,DAR,MONTH[MOR],YRR, 309900 NOEVN), 310000 OPR3(FOR LL ~ 1 STEP 1 UNTIL 13 DO NETNAME[LL],PAGEN,DAS, 310100 MONTH[MOS],YRS,DAR,MONTH[MOR],YRR) ; 310200 FORMAT OUT FPR1(////////////////////"NETWORK NAME",X6,13A6///), 310300 FPR2("A GRAPH OF THE NETWORK SORTED BY",4(X2,A6)///), 310400 FPR5("NETWORK START DATE",I4,X1,A3,I3,X10,"NUMBER OF ", 310500 "ACTIVITIES ",I10,X10,"RUN NUMBER",I10//"NETWORK ", 310600 "REPORT DATE",I3,X1,A3,I3,X10,"NUMBER OF EVENTS", 310700 I15), 310800 FPR6("DEPARTMENT GRAPHS BY DEPARTMENT OF PREDECESSOR ", 310900 "EVENT SORTED BY",4(X2,A6)///), 311000 FPR7("DEPARTMENT GRAPHS BY DEPARTMENT OF SUCCESSOR EVENT", 311100 "SORTED BY",4(X2,A6)///), 311200 FPR8("GRAPH OF ACTIVITIES BY DEPARTMENT OF PREDECESSOR ", 311300 "EVENT",X39,"DEPARTMENT NUMBER",I10), 311400 FPR9("GRAPH OF ACTIVITIES BY DEPARTMENT OF SUCCESSOR " 311500 "EVENT",X41,"DEPARTMENT NUMBER",I10), 311600 FORMDC("DUMMY AND COMPLETED ACTIVITIES ARE OMITTED FROM ", 311700 "THE GRAPH."), 311800 FORMC("COMPLETED ACTIVITIES ARE OMITTED FROM THE GRAPH."), 311900 FORMD("DUMMY ACTIVITIES ARE OMITTED FROM THE GRAPH."), 312000 FPR3(13A6,X33,"PAGE",I5/"NETWORK START DATE",I3,X1,A3,I3, 312100 X10,"NETWORK REPORT DATE",I3,X1,A3,I3) ; 312200 PROCEDURE UPACK(MODAYR,MO,DA,YR) ; 312300 COMMENT THIS PROCEDURE UNPACKS DATE MODAYR INTO MONTH NO., DAY, 312400 AND YEAR ; 312500 COMMENT 312600 FOR DEFINITIONS OF VARIABLES IN PROCEDURE UPACK SEE LIST 312700 BLOCK 312800 ; 312900 VALUE MODAYR ; 313000 INTEGER MODAYR,MO,DA,YR ; 313100 BEGIN 313200 YR ~ MODAYR MOD 100 ; 313300 MO ~ MODAYR DIV 10000 ; 313400 DA ~ (MODAYR DIV 100) MOD 100 313500 END UPACK ; 313600 START: PARA ~ PDATE ~ 0 ; 313700 BDUM ~ BCOMP ~ BDUMCOMP ~ FALSE ; 313800 DEPTTITLE ~ FALSE ; 313900 PARA.[45:3] ~ BLOCPARAM[NOBLOCK].[9:3] ; 314000 PDATE ~ BLOCPARAM[NOBLOCK].[24:24] ; 314100 DC ~ BLOCPARAM[NOBLOCK].[12:3] ; 314200 IF (DC = 3) THEN BDUMCOMP ~ BCOMP ~ BDUM ~ TRUE ELSE 314300 IF (DC = 1) THEN BDUM ~ TRUE ELSE 314400 IF (DC = 2) THEN BCOMP ~ TRUE ; 314500 UPACK(SDATE,MOS,DAS,YRS) ; 314600 UPACK(RDATE,MOR,DAR,YRR) ; 314700 FILL MONTH[*] WITH " ","JAN","FEB","MAR","APR","MAY", 314800 "JUN","JUL","AUG","SEP","OCT","NOV","DEC" ; 314900 FILL DPM[*] WITH 0,31,28,31,30,31,30,31,31,30,31,30,31 ; 315000 COMMENT WRITE TITLE PAGE ; 315100 WRITE(PRINTER[PAGE]) ; 315200 WRITE(PRINTER,FPR1,OPR1) ; 315300 DEPTIJ ~ BLOCPARAM[NOBLOCK].[16:3] ; 315400 GO TO SWD1[DEPTIJ + 1] ; 315500 D1: WRITE(PRINTER,FPR2,OPR2) ; GO TO D5 ; 315600 D2: WRITE(PRINTER,FPR6,OPR2) ; GO TO D4 ; 315700 D3: WRITE(PRINTER,FPR7,OPR2) ; 315800 D4: DEPTDIG ~ BLOCPARAM[NOBLOCK].[20:3] ; 315900 IF (DEPTDIG = 0) THEN DEPTDIG ~ 4 ; 316000 OLDDEPT ~ 10 * DEPTDIG ; 316100 DEPTDIG ~ 10 * (10 - DEPTDIG) ; 316200 D5: WRITE(PRINTER,FPR5,OPR5) ; 316300 COMMENT COMPUTE STARTING DATE OF GRAPH ; 316400 IF PDATE = 0 THEN PDATE ~ SDATE ; 316500 IF PDATE ! SDATE THEN 316600 BEGIN 316700 FORMAT OUT PLOTERROR("INVALID PLOT DATE. DATE CORRECTED TO ", 316800 "NEAREST VALID DATE") ; 316900 PROCEDURE UNPACK(MODAYR,SDAYS,WDPW,DPM,MO,DA,YR,DAYS,CMODAYR,SWER) ; 317000 COMMENT THIS PROCEDURE UNPACKS DATE MODAYR INTO MONTH NO., DAY, 317100 AND YEAR AND CALCULATES NO. OF WORKING DAYS FROM SDAYS ; 317200 COMMENT 317300 FOR DEFINITIONS OF VARIABLES IN PROCEDURE UNPACK SEE 317400 AUDIT BLOCK 317500 ; 317600 VALUE MODAYR,SDAYS,WDPW ; 317700 INTEGER MODAYR,SDAYS,WDPW,MO,DA,YR,DAYS,CMODAYR,SWER ; 317800 INTEGER ARRAY DPM[0] ; 317900 BEGIN 318000 INTEGER TEMP,YEARS,TYEARS,LYEARS,RYEARS,YDAYS,MDAYS,I,WEEKS, 318100 REMDA ; 318200 BOOLEAN BOOL ; 318300 LABEL L1,L2,L3,L4,L5,L6,L7 ; 318400 BOOL ~ FALSE ; 318500 COMMENT UNPACK MODAYR INTO MONTH NO., DAY, AND YEAR ; 318600 YR ~ MODAYR MOD 100 ; 318700 SWER ~ 1 ; 318800 MO ~ MODAYR DIV 10000 ; 318900 DA ~ MODAYR DIV 100 MOD 100 ; 319000 COMMENT CHECK VALIDITY OF DATE ; 319100 IF YR } 62 THEN GO TO L1 ; 319200 YR ~ 62 ; MO ~ DA ~ 1 ; 319300 BOOL ~ TRUE ; GO TO L6 ; 319400 L1: IF YR { 80 THEN GO TO L2 ; 319500 YR ~ 80 ; MO ~ 12 ; DA ~ 31 ; 319600 BOOL ~ TRUE ; GO TO L6 ; 319700 L2: IF MO } 1 THEN GO TO L3 ; 319800 MO ~ DA ~ 1 ; BOOL ~ TRUE ; GO TO L6 ; 319900 L3: IF MO { 12 THEN GO TO L4 ; 320000 MO ~ 12 ; DA ~ 31 ; BOOL ~ TRUE ; GO TO L6 ; 320100 L4: IF DA } 1 THEN GO TO L5 ; 320200 DA ~ 1 ; BOOL ~ TRUE ; GO TO L6 ; 320300 L5: IF DA { DPM[MO] THEN GO TO L6 ; 320400 TEMP ~ YR MOD 4 ; 320500 IF (MO = 2) AND (TEMP = 0) AND (DA = 29) THEN GO TO L6 ; 320600 DA ~ DPM[MO] ; BOOL ~ TRUE ; 320700 COMMENT CALCULATE NO.OF WORKING DAYS SINCE SDAYS ; 320800 L6: YEARS ~ YR - 62 ; 320900 IF (YEARS = 0) AND (MO = 1) THEN 321000 BEGIN 321100 DAYS ~ DA ; GO TO L7 321200 END ; 321300 TYEARS ~ YEARS + 1 ; 321400 LYEARS ~ TYEARS DIV 4 ; 321500 RYEARS ~ YEARS - LYEARS ; 321600 YDAYS ~ (365 | RYEARS)+(366 | LYEARS) ; 321700 MDAYS ~ 0 ; 321800 FOR I ~ 1 STEP 1 UNTIL MO-1 DO MDAYS ~ MDAYS + DPM[I] ; 321900 IF (YR MOD 4 = 0) AND (MO > 2) THEN MDAYS ~ MDAYS + 1 ; 322000 DAYS ~ YDAYS + MDAYS + DA ; 322100 L7: CMODAYR ~ 0 ; 322200 COMMENT CHECK THAT DATE IS A WORKING DAY ; 322300 WEEKS ~ DAYS DIV 7 ; 322400 REMDA ~ DAYS - (WEEKS | 7) ; 322500 DAYS ~ (WEEKS | WDPW) + REMDA - SDAYS ; 322600 IF BOOL THEN CMODAYR ~ MO | 10000 + DA | 100 + YR ; 322700 IF ( ( WDPW ! 7) AND((REMDA > WDPW) OR (REMDA = 0))) 322800 THEN 322900 BEGIN 323000 IF BOOL THEN SWER ~ 4 ELSE SWER ~ 3 323100 END ; 323200 IF BOOL THEN SWER ~ 2 323300 END UNPACK ; 323400 UNPACK(PDATE,0,WDPW,DPM,MOP,DAP,YRP,PDAYS,CPDATE,SWER) ; 323500 IF SWER = 4 OR SWER = 2 THEN WRITE(PRINTER,PLOTERROR) 323600 END 323700 ELSE 323800 BEGIN 323900 PDAYS ~ SDAYS ; MOP ~ MOS ; DAP ~ DAS ; YRP ~ YRS 324000 END ; 324100 COMMENT SET PARAMETERS FOR HEADINGS OF GRAPHS ; 324200 PAGEN ~ 0 ; TLINE ~ 12 ; 324300 GO TO SW1[PARA] ; 324400 HPL1A: IF (PARA = 2) THEN WD ~ "WEEKS" ELSE WD ~ " DAYS" ; 324500 GO TO HPLAA ; 324600 HPL2A: FOR NN ~ 1 STEP 1 UNTIL 7 DO Y[NN] ~ YRP + NN - 1 ; 324700 FILL M[*] WITH " ","J","F","M","A","M","J","J","A","S", 324800 "O","N","D" ; 324900 GO TO HPLAA ; 325000 HPL3A: QP ~ MOP DIV 3 ; 325100 IF (MOP MOD 3 > 0) THEN QP ~ QP + 1 ; 325200 PY ~ YRP ; 325300 IF (QP { 2) THEN PY ~ PY - 1 ; 325400 HPLAA: IF (DEPTIJ ! 0) THEN GO TO L1 ; 325500 HPLA: WRITE(PRINTER[PAGE]) ; NLINE ~ 0 ; 325600 PAGEN ~ PAGEN + 1 ; WRITE(PRINTER[DBL],FPR3,OPR3) ; 325700 IF (DEPTIJ = 1) THEN WRITE(PRINTER[DBL],FPR8,DEPT) ELSE 325800 IF (DEPTIJ = 2) THEN WRITE(PRINTER[DBL],FPR9,DEPT) ; 325900 IF BDUMCOMP THEN WRITE(PRINTER[DBL],FORMDC) ELSE 326000 IF BCOMP THEN WRITE(PRINTER[DBL],FORMC) ELSE 326100 IF BDUM THEN WRITE(PRINTER[DBL],FORMD) ; 326200 GO TO SW6[PARA] ; 326300 COMMENT WRITE PROPER HEADING FOR GRAPH ; 326400 HPL1: BEGIN 326500 COMMENT WRITE HEADING FOR GRAPH BY DAYS OR WEEKS ; 326600 LIST OPL11(WD,DAP,MONTH[MOP],YRP) ; 326700 FORMAT OUT FPL11("GRAPH BY ",A5," BEGINNING AT",I4,X1,A3,I3,X23, 326800 "11111111112222222222333333333344444444445555555555", 326900 "6666666"/"PREDECESSOR SUCCESSOR",X4,"ACTIVITY ", 327000 "DESCRIPTION",X6,"123456789012345678901234567890", 327100 "123456789012345678901234567890123456"/), 327200 FPL12("PLOT DATE NOT A WORKING DAY. GRAPH BEGINS AT " 327300 "FIRST WORKING DAY AFTER PLOT DATE") ; 327400 WRITE(PRINTER,FPL11,OPL11) ; 327500 IF SWER = 3 THEN WRITE(PRINTER[DBL],FPL12) ; 327600 GO TO L1 327700 END ; 327800 HPL2: BEGIN 327900 COMMENT WRITE HEADING FOR GRAPH BY MONTHS ; 328000 LABEL W1,W2,W3,W4,W5,W6,W7,W8,W9,W10,W11,W12,W13,W14 ; 328100 SWITCH SW2 ~ W1,W2,W3,W4,W5,W6,W7,W8,W9,W10,W11,W12 ; 328200 LIST OPL21(DAP,MONTH[MOP],YRP,FOR LL ~ 1 STEP 1 UNTIL 6 DO 328300 Y[LL]), 328400 OPL22(DAP,MONTH[MOP],YRP,FOR LL ~ 2 STEP 1 UNTIL 6 DO 328500 Y[LL]), 328600 OPL23(DAP,MONTH[MOP],YRP,FOR LL ~ 2 STEP 1 UNTIL 7 DO 328700 Y[LL]), 328800 OPL24(FOR LL ~ MOP STEP 1 UNTIL 12 DO M[LL],FOR MM ~ 1 328900 STEP 1 UNTIL 4 DO FOR LL ~ 1 STEP 1 UNTIL 12 DO 329000 M[LL],FOR LL ~ 1 STEP 1 UNTIL 5+MOP DO M[LL]), 329100 OPL25(FOR LL ~ MOP STEP 1 UNTIL 12 DO M[LL],FOR MM ~ 1 329200 STEP 1 UNTIL 5 DO FOR LL ~ 1 STEP 1 UNTIL 12 DO 329300 M[LL],FOR LL ~ 1 STEP 1 UNTIL MOP-7 DO M[LL]) ; 329400 FORMAT OUT JAN("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I7,4I12,I9), 329500 FEB("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I6,4I12,I10), 329600 MAR("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I6,I11,3I12,I10), 329700 APR("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I5,I11,3I12,I11), 329800 MAY("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I5,I10,3I12,I11), 329900 JUN("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I4,I10,4I12), 330000 JUL("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I4,I9,4I12), 330100 AUG("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I3,I9,4I12), 330200 SEP("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I3,I8,4I12), 330300 OTR("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I10,4I12,I1), 330400 NOV("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I9,4I12,I8), 330500 DEC("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I8,4I12,I9), 330600 FPL25("PREDECESSOR SUCCESSOR",X4,"ACTIVITY DESCRIPTION", 330700 X6,66A1) ; 330800 GO TO SW2[MOP] ; 330900 W1: WRITE(PRINTER,JAN,OPL21) ; 331000 GO TO W14 ; 331100 W2: WRITE(PRINTER,FEB,OPL21) ; 331200 GO TO W14 ; 331300 W3: WRITE(PRINTER,MAR,OPL21) ; 331400 GO TO W14 ; 331500 W4: WRITE(PRINTER,APR,OPL21) ; 331600 GO TO W14 ; 331700 W5: WRITE(PRINTER,MAY,OPL21) ; 331800 GO TO W14 ; 331900 W6: WRITE(PRINTER,JUN,OPL21) ; 332000 GO TO W14 ; 332100 W7: WRITE(PRINTER,JUL,OPL21) ; 332200 GO TO W14 ; 332300 W8: WRITE(PRINTER,AUG,OPL21) ; 332400 GO TO W13 ; 332500 W9: WRITE(PRINTER,SEP,OPL21) ; 332600 GO TO W13 ; 332700 W10: WRITE(PRINTER,OTR,OPL22) ; 332800 GO TO W13 ; 332900 W11: WRITE(PRINTER,NOV,OPL23) ; 333000 GO TO W13 ; 333100 W12: WRITE(PRINTER,DEC,OPL23) ; 333200 W13: WRITE(PRINTER[DBL],FPL25,OPL25) ; 333300 GO TO L1 ; 333400 W14: WRITE(PRINTER[DBL],FPL25,OPL24) ; 333500 GO TO L1 333600 END ; 333700 IF QP { 2 THEN PY ~ PY - 1 ; 333800 HPL3: BEGIN 333900 COMMENT WRITE HEADING FOR GRAPH BY QUARTERS ; 334000 LABEL V1,V2,V3,V4,V5 ; 334100 SWITCH SW3 ~ V1,V2,V3,V4 ; 334200 LIST OPL31(DAP,MONTH[MOP],YRP,FOR LL ~ 1 STEP 1 UNTIL 16 DO 334300 PY + LL), 334400 OPL32(DAP,MONTH[MOP],YRP,FOR LL ~ 1 STEP 1 UNTIL 17 DO 334500 PY + LL), 334600 OPL34(FOR LL ~ QP STEP 1 UNTIL 4 DO LL,FOR MM ~ 1 STEP 1 334700 UNTIL 15 DO FOR LL ~ 1 STEP 1 UNTIL 4 DO LL,FOR LL ~ 334800 1 STEP 1 UNTIL QP+1 DO LL), 334900 OPL35(4,FOR MM ~ 1 STEP 1 UNTIL 16 DO FOR LL ~ 1 STEP 1 335000 UNTIL 4 DO LL,1) ; 335100 FORMAT OUT FPL31("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I3,15I4), 335200 FPL32("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I2,16I4), 335300 FPL33("GRAPH BEGINS AT",I4,X1,A3,I3,X26,I5,15I4), 335400 FPL34("GRAPH BEGINS AT",I4,X1,A3,I3,X26,16I4), 335500 FPL35("PREDECESSOR SUCCESSOR",X4,"ACTIVITY DESCRIPTION", 335600 X6,66I1) ; 335700 GO TO SW3[QP] ; 335800 V1: WRITE(PRINTER,FPL31,OPL31) ; 335900 GO TO V5 ; 336000 V2: WRITE(PRINTER,FPL32,OPL32) ; 336100 GO TO V5 ; 336200 V3: WRITE(PRINTER,FPL33,OPL31) ; 336300 GO TO V5 ; 336400 V4: WRITE(PRINTER,FPL34,OPL31) ; 336500 WRITE(PRINTER[DBL],FPL35,OPL35) ; 336600 GO TO L1 ; 336700 V5: WRITE(PRINTER[DBL],FPL35,OPL34) 336800 END ; 336900 L1: BEGIN 337000 INTEGER EST,LFT,MOE,DAE,YRE,MOF,DAF,YRF,STAR,FIN,DUR,N,CH ; 337100 INTEGER PPDAYS,WKP,WKE,WKF,TEMP,YRES,YRFS,DMO,DDA,DYR,DYRS,QE,QF, 337200 DQ ; 337300 BOOLEAN BOOL2,BOOL3,BOOL4,BOOL5,BOOL6 ; 337400 ALPHA BEYOND,CONT,ALPH,BETA ; 337500 ALPHA ARRAY BUFF1[0:66],BUFF2[0:66],E[0:3],F[0:3] ; 337600 LABEL L2,L6,L7,L3,S1,S2,S3,S4,S5,S6,EOF ; 337700 LABEL LOOP ; 337800 LABEL D6,D7,D8,D9 ; 337900 SWITCH SW4 ~ S1,S2,S2,S3,S1 ; 338000 SWITCH SW5 ~ S4,S4,S5,S4,S6 ; 338100 SWITCH SWD2 ~ D9,D6,D7 ; 338200 LIST OPR4(I,J,FOR LL ~ 1 STEP 1 UNTIL 4 DO REMARKS[LL],FOR LL ~ 338300 1 STEP 1 UNTIL 66 DO BUFF1[LL],BEYOND,FOR LL ~ 1,2,3 338400 DO E[LL],DAE,MONTH[MOE],YRE,FOR LL ~ 1,2,3 DO F[LL], 338500 DAF,MONTH[MOF],YRF,FOR LL ~ 1 STEP 1 UNTIL 66 DO 338600 BUFF2[LL],CONT) ; 338700 FORMAT OUT FPR4(I10,I12,X3,4A6,X3,66A1,X1,A1/3A5,I3,X1,A3,I3,X2,3A5, 338800 I2,X1,A3,I3,X1,66A1,X1,A1/) ; 338900 PROCEDURE PACK(DAYS,SDAYS,WDPW,DPM,MO,DA,YR,BOOL) ; 339000 COMMENT THIS PROCEDURE COMPUTES THE MONTH NO., DAY, AND YEAR OF 339100 A DATE DAYS GIVEN BY NO. OF WORKING DAYS FROM SDAYS ; 339200 COMMENT 339300 FOR DEFINITIONS OF VARIABLES IN PROCEDURE PACK SEE LIST 339400 BLOCK 339500 ; 339600 VALUE DAYS,SDAYS,WDPW ; 339700 INTEGER DAYS,SDAYS,WDPW,MO,DA,YR ; 339800 BOOLEAN BOOL ; 339900 INTEGER ARRAY DPM[0] ; 340000 BEGIN 340100 INTEGER TDAYS,TEMP,TTDAY,C,K,M ; 340200 LABEL T1,T2,T4,L1,L2,L3 ; 340300 TDAYS ~ DAYS + SDAYS ; 340400 TEMP ~ TDAYS MOD WDPW ; 340500 TTDAY ~ (TDAYS DIV WDPW) | 7 + TEMP ; 340600 IF TEMP = 0 THEN TTDAY ~ TTDAY - 2 ; 340700 IF TTDAY < 0 THEN 340800 BEGIN 340900 DA ~ 1 ; MO ~ 1 ; YR ~ 62 ; 341000 BOOL ~ TRUE ; GO TO L3 341100 END ; 341200 IF TTDAY > 6940 THEN 341300 BEGIN 341400 DA ~ 31 ; MO ~ 12 ; YR ~ 80 ; 341500 BOOL ~ TRUE ; GO TO L3 341600 END ; 341700 TTDAY ~ TTDAY + 365 ; 341800 C ~ 0 ; 341900 T1: K ~ 0 ; 342000 T2: IF TTDAY { 365 THEN GO TO T4 ; 342100 TTDAY ~ TTDAY - 365 ; 342200 K ~ K + 1 ; C ~ C + 1 ; 342300 IF K ! 3 THEN GO TO T2 ; 342400 IF TTDAY > 366 THEN 342500 BEGIN 342600 TTDAY ~ TTDAY - 366 ; C ~ C + 1 ; GO TO T1 342700 END ; 342800 T4: YR ~ 61 + C ; 342900 IF (YR MOD 4) ! 0 THEN 343000 BEGIN 343100 M ~ 1 ; GO TO L1 343200 END ; 343300 IF TTDAY { 31 THEN 343400 BEGIN 343500 MO ~ 1 ; GO TO L2 343600 END ; 343700 TTDAY ~ TTDAY - 31 ; 343800 IF TTDAY { 29 THEN 343900 BEGIN 344000 MO ~ 2 ; GO TO L2 344100 END ; 344200 TTDAY ~ TTDAY - 29 ; M ~ 3 ; 344300 L1: FOR MO ~ M STEP 1 UNTIL 12 DO 344400 BEGIN 344500 IF TTDAY { DPM[MO] THEN GO TO L2 ; 344600 TTDAY ~ TTDAY - DPM[MO] 344700 END ; 344800 L2: DA ~ TTDAY ; BOOL ~ FALSE ; 344900 L3: END PACK ; 345000 IF DEPTTITLE THEN 345100 BEGIN 345200 DEPTTITLE ~ FALSE ; GO TO D9 ; 345300 END ; 345400 COMMENT READ ACTIVITY RECORD ; 345500 LOOP: READ(SWF[RD],*,TREC)[EOF] ; 345600 IF (ASD = 2) AND BCOMP THEN GO TO LOOP ; 345700 IF BDUM AND ((ET = 0) AND (VAR = 0)) THEN GO TO LOOP ; 345800 GO TO SWD2[DEPTIJ + 1] ; 345900 D6: DEPT ~ I DIV DEPTDIG ; GO TO D8 ; 346000 D7: DEPT ~ J DIV DEPTDIG ; 346100 D8: IF (DEPT ! OLDDEPT) THEN 346200 BEGIN 346300 OLDDEPT ~ DEPT ; 346400 DEPTTITLE ~ TRUE ; 346500 PAGEN ~ 0 ; GO TO HPLA ; 346600 END ; 346700 D9: BOOL2 ~ BOOL3 ~ BOOL4 ~ BOOL5 ~ BOOL6 ~ FALSE ; 346800 BEYOND ~ CONT ~ " " ; 346900 COMMENT COMPUTE ACTIVITY EARLIEST START DATE ; 347000 EST ~ ENTIER(ES) ; 347100 IF ES > EST THEN EST ~ EST + 1 ; 347200 PACK(EST,SDAYS,WDPW,DPM,MOE,DAE,YRE,BOOL2) ; 347300 COMMENT COMPUTE ACTIVITY LATEST FINISH DATE ; 347400 LFT ~ ENTIER(LF) ; 347500 IF LF > LFT THEN LFT ~ LFT + 1 ; 347600 PACK(LFT,SDAYS,WDPW,DPM,MOF,DAF,YRF,BOOL2) ; 347700 DUR ~ ENTIER(ET) ; 347800 DUR ~ DUR + EST ; 347900 IF PARA = 1 THEN 348000 BEGIN 348100 COMMENT COMPUTE DUR, STAR, AND FIN FOR GRAPH BY DAYS ; 348200 PPDAYS ~ PDAYS - SDAYS ; 348300 DUR ~ DUR - PPDAYS ; 348400 STAR ~ EST - PPDAYS + 1 ; 348500 FIN ~ LFT - PPDAYS + 1 ; GO TO L2 348600 END ; 348700 IF PARA = 2 THEN 348800 BEGIN 348900 COMMENT COMPUTE DUR, STAR, AND FIN FOR GRAPH BY WEEKS ; 349000 WKP ~ PDAYS DIV WDPW ; 349100 IF PDAYS MOD WDPW > 0 THEN WKP ~ WKP + 1 ; 349200 WKE ~ (SDAYS + EST) DIV WDPW ; 349300 IF (SDAYS + EST) MOD WDPW > 0 THEN WKE ~ WKE + 1 ; 349400 STAR ~ WKE - WKP + 1 ; 349500 WKF ~ (SDAYS + LFT) DIV WDPW ; 349600 IF (SDAYS + LFT) MOD WDPW > 0 THEN WKF ~ WKF + 1 ; 349700 FIN ~ WKF - WKP + 1 ; 349800 DUR ~ DUR + SDAYS ; 349900 TEMP ~ DUR MOD WDPW ; 350000 DUR ~ DUR DIV WDPW ; 350100 IF TEMP > 0 THEN DUR ~ DUR + 1 ; 350200 DUR ~ DUR - WKP ; 350300 GO TO L2 350400 END ; 350500 YRES ~ YRE - YRP ; 350600 YRFS ~ YRF - YRP ; 350700 PACK(DUR,SDAYS,WDPW,DPM,DMO,DDA,DYR,BOOL2) ; 350800 DYRS ~ DYR - YRP ; 350900 IF PARA = 3 THEN 351000 BEGIN 351100 COMMENT COMPUTE DUR, STAR, AND FIN FOR GRAPH BY MONTHS ; 351200 STAR ~ MOE + YRES | 12 - MOP + 1 ; 351300 FIN ~ MOF + YRFS | 12 - MOP + 1 ; 351400 DUR ~ DMO + DYRS | 12 - MOP ; 351500 GO TO L2 351600 END ; 351700 COMMENT COMPUTE DUR, STAR, AND FIN FOR GRAPH BY QUARTERS ; 351800 QE ~ MOE DIV 3 ; 351900 IF MOE MOD 3 > 0 THEN QE ~ QE + 1 ; 352000 STAR ~ QE + YRES | 4 - QP + 1 ; 352100 QF ~ MOF DIV 3 ; 352200 IF MOF MOD 3 > 0 THEN QF ~ QF + 1 ; 352300 FIN ~ QF + YRFS | 4 - QP + 1 ; 352400 DQ ~ DMO DIV 3 ; 352500 IF DMO MOD 3 > 0 THEN DQ ~ DQ + 1 ; 352600 DUR ~ DQ + DYRS | 4 - QP ; 352700 COMMENT SET PARAMETERS FOR PRINTING GRAPH ; 352800 L2: FOR NN ~ 1 STEP 1 UNTIL 66 DO BUFF1[NN] ~ BUFF2[NN] ~ 352900 " " ; 353000 IF FIN < 1 THEN BOOL4 ~ TRUE ; 353100 IF STAR < 1 THEN 353200 BEGIN 353300 BOOL5 ~ TRUE ; 353400 BEYOND ~ IF EST > LFT THEN "$" ELSE IF ET > 0 THEN "X" 353500 ELSE IF FIN > STAR THEN "S" ELSE " " ; 353600 IF BOOL4 AND (DUR < 1) THEN GO TO SW4[ASD+1] ; 353700 END ; 353800 IF STAR > 66 THEN 353900 BEGIN 354000 BOOL6 ~ TRUE ; 354100 BEYOND ~ IF (ET ! 0) THEN (IF FIN } STAR THEN "X" 354200 ELSE "$") ELSE (IF FIN > STAR THEN "S" ELSE (IF FIN 354300 < STAR THEN "$" ELSE " ")) ; 354400 GO TO L3 354500 END ; 354600 IF FIN > 66 THEN BOOL3 ~ TRUE ; 354700 IF STAR < 0 THEN STAR ~ 0 ; 354800 IF FIN < 0 THEN FIN ~ 0 ; 354900 N ~ FIN - 1 ; 355000 IF (FIN = STAR) AND (FIN > 0) THEN N ~ STAR ; 355100 IF (ET > 0) THEN IF (ASD = 2) THEN N ~ DUR ~ FIN 355200 ELSE IF (DUR = STAR - 1) THEN DUR ~ STAR ; 355300 IF LFT < EST THEN N ~ 0 ; 355400 IF N > 66 THEN 355500 BEGIN 355600 BOOL3 ~ TRUE ; N ~ 66 355700 END ; 355800 IF DUR > 66 THEN 355900 BEGIN 356000 BOOL3 ~ TRUE ; DUR ~ 66 356100 END ; 356200 CH ~ IF STAR > 0 THEN STAR ELSE 1 ; 356300 IF N < DUR THEN 356400 BEGIN 356500 FOR NN ~ CH STEP 1 UNTIL N DO BUFF1[NN] ~ "X" ; 356600 FOR NN ~ IF N } CH THEN N+1 ELSE CH 356700 STEP 1 UNTIL DUR DO BUFF1[NN] ~ "$" ; 356800 GO TO L3 356900 END ; 357000 FOR NN ~ CH STEP 1 UNTIL DUR DO BUFF1[NN] ~ "X" ; 357100 FOR NN ~ IF DUR } CH THEN DUR+1 ELSE CH 357200 STEP 1 UNTIL N DO BUFF1[NN] ~ "S" ; 357300 L3: IF BOOL3 AND NOT BOOL5 THEN BEYOND ~ BUFF1[66] ; 357400 GO TO SW4[ASD + 1] ; 357500 S1: ALPH ~ "E" ; E[1] ~ "EXPEC" ; 357600 E[2] ~ "TED S" ; E[3] ~ "TART " ; 357700 GO TO SW5[ASD + 1] ; 357800 S2: ALPH ~ "A" ; E[1] ~ "ACTUA" ; 357900 E[2] ~ "L STA" ; E[3] ~ "RT " ; 358000 GO TO SW5[ASD + 1] ; 358100 S3: ALPH ~ "D" ; E[1] ~ "DIREC" ; 358200 E[2] ~ "TED S" ; E[3] ~ "TART " ; 358300 GO TO SW5[ASD + 1] ; 358400 S4: BETA ~ "L" ; F[1] ~ "LATES" ; 358500 F[2] ~ "T FIN" ; F[3] ~ "ISH " ; 358600 GO TO L6 ; 358700 S5: BETA ~ "C" ; F[1] ~ "COMPL" ; 358800 F[2] ~ "ETED " ; F[3] ~ " " ; 358900 GO TO L6 ; 359000 S6: BETA ~ "S" ; F[1] ~ "SCHED" ; 359100 F[2] ~ ". FIN" ; F[3] ~ "ISH " ; 359200 L6: IF (STAR = FIN) OR ((BOOL5 OR BOOL6) AND (BOOL4 OR 359300 (FIN > 66))) THEN 359400 BEGIN 359500 ALPH ~ "*" ; 359600 IF BOOL5 OR BOOL6 THEN CONT ~ ALPH 359700 ELSE BUFF2[STAR] ~ ALPH ; 359800 GO TO L7 359900 END ; 360000 IF BOOL5 OR BOOL6 THEN CONT ~ ALPH 360100 ELSE BUFF2[STAR] ~ ALPH ; 360200 IF BOOL4 OR (FIN = 67) THEN 360300 BEGIN 360400 BEYOND ~ " " ; CONT ~ BETA 360500 END 360600 ELSE IF (NOT BOOL3 OR (BUFF1[66] = "$")) 360700 THEN BUFF2[FIN] ~ BETA 360800 ELSE CONT ~ BETA ; 360900 L7: IF BOOL2 THEN CONT ~ "X" ; 361000 WRITE(PRINTER,FPR4,OPR4) ; 361100 NLINE ~ NLINE + 1 ; 361200 IF(NLINE > TLINE) AND (KEY < NOACT) THEN GO TO HPLA ; 361300 GO TO LOOP ; 361400 EOF: REWIND(SWF[RD]) ; 361500 END 361600 END PLOT BLOCK ; 361700 GO TO ORIGIN ; 361800 FINISH: BEGIN 361900 COMMENT BLOCK TO SAVE ALL THE CURRENT VALUES OF ALL THE GLOBAL 362000 VARIABLES AND ARRAYS WHICH ARE REQUIRED FOR AN UPDATE 362100 RUN ; 362200 COMMENT 362300 DEFINITIONS OF VARIABLES IN FINISH BLOCK 362400 NLINE NUMBER OF LINES PRINTED 362500 TLINE TOTAL NUMBER OF LINES PERMITTED PER PAGE 362600 MM,NN,KK INDICES FOR ARRAYS 362700 ; 362800 INTEGER MM ; 362900 LABEL LNE ; 363000 FOR MM ~ 1 STEP 1 UNTIL 5 DO 363100 IF NOT ((RD = MM) OR (WR = MM) OR (SC = MM) OR (RE = MM)) 363200 THEN 363300 BEGIN 363400 NE ~ MM ; GO TO LNE ; 363500 END ; 363600 COMMENT WRITE SAVE RECORDS TAPE ; 363700 LNE: FOR MM ~ 1 STEP 1 UNTIL 5 DO 363800 SORTCOL[0,MM] ~ SORTCOL[RSORTNUM,MM] ; 363900 FOR MM ~ 1 STEP 1 UNTIL 5 DO 364000 EVENTCOL[0,MM] ~ EVENTCOL[NOSORT,MM] ; 364100 WRITE(PERTC,*,SAVEREC1) ; 364200 FOR K ~ 0 STEP 1 UNTIL NOACTROW DO 364300 WRITE(PERTC,*,SAVEREC2) ; 364400 FOR K ~ 0 STEP 1 UNTIL NOEVNROW DO 364500 WRITE(PERTC,*,SAVEREC3) ; 364600 REWIND(PERTC) ; 364700 IF BLOC[NOBLOCK] ! 8 THEN 364800 BEGIN 364900 COMMENT LIST SAVE RECORDS AND ACTIVITY TAPES IF PROGRAM WAS NOT 365000 COMPLETED BECAUSE OF DATA ERRORS ; 365100 FORMAT OUT FORM1("SAVE RECORDS TAPE"), 365200 FORM2("NETWORK NAME",X6,13A6,X6,"RUN",I6//"NETWORK START", 365300 " DATE",I7," SDAYS",I7,X10,"NETWORK REPORT DATE",I6, 365400 " RDAYS",I7//"MAX NO ACTIVITIES",I7," MAX NO ", 365500 "EVENTS",I7," CHAIN LENGTH",I7," MAX NO ", 365600 "ENDING EVENTS",I7/"MAX NO STARTING EVENTS",I7,X4, 365700 "NO WORKING DAYS PER WEEK",I2," NO ACTIVITIES",I7, 365800 " NO EVENTS",I7/"NOACTROW",I4," NOACTCOL",I4,X4, 365900 "NOEVNROW",I4," NOEVNCOL",I4," MIN EVENT",I11, 366000 " MAX EVENT",I11/"NO ACTIVITY SORTKEYS",I2,X2, 366100 "SORTKEY NOS",4I3," NO EVENT SORTKEYS",I2,X2, 366200 "SORTKEY NOS",4I3,/"TAPE KEYS SAVE RECORDS TAPE", 366300 I2," ACTIVITY TAPE",I2," EVENT TAPE",I2,X2, 366400 "SCRATCH TAPES",2I2), 366500 FORM3("RENUMBERED ACTIVITY PREDECESSOR AND SUCCESSOR ", 366600 "EVENTS"), 366700 FORM4(5(3I7,X3)), 366800 FORM5("EVENT NUMBERS"), 366900 FORM6(6(I6,I11,X3)), 367000 FORM7("ACTIVITY TAPE"), 367100 FORM8(" KEY ACTIVITY DESCRIPTION"/X17,"I",X10,"J ", 367200 "RENUM I RENUM J ET VAR ASD ADAYS ES ", 367300 "LF SL SVAR RANK",X7,"TALLIES"/), 367400 FORM9(I6,X1,4A6/X6,2I11,2I8,2F7.1,I3,I6,4F7.1,I7,X3,A1, 367500 3I4/) ; 367600 LIST OUT4(FOR LL ~ 1 STEP 1 UNTIL NOACT DO [LL,RIRJ[LL.[30:9], 367700 LL.[39:9]].[4:22],RIRJ[LL.[30:9],LL.[39:9]].[26:22]]), 367800 OUT6(FOR LL ~ 1 STEP 1 UNTIL NOEVN DO [LL,EVENT[LL.[30:9], 367900 LL.[39:9]]]), 368000 OUT9(KEY,FOR LL ~ 1 STEP 1 UNTIL 4 DO REMARKS[LL],I,J, 368100 RRIJ.[4:22],RRIJ.[26:22],ET,VAR,ASD,ADAYS,ES,LF,SL, 368200 SVAR,RANKI,IF TAL < 0 THEN "-" ELSE "+",TAL.[21:9], 368300 TAL.[30:9],TAL.[39:9]) ; 368400 INTEGER NLINE,TLINE ; 368500 LABEL LOOP,EOF ; 368600 COMMENT LIST SAVE RECORDS ; 368700 WRITE(PRINTER[PAGE]) ; WRITE(PRINTER[DBL],FORM1) ; 368800 WRITE(PRINTER,FORM2,SAVEREC1) ; 368900 WRITE(PRINTER[DBL]) ; WRITE(PRINTER[DBL],FORM3) ; 369000 WRITE(PRINTER,FORM4,OUT4) ; WRITE(PRINTER[DBL]) ; 369100 WRITE(PRINTER[DBL],FORM5) ; WRITE(PRINTER,FORM6,OUT6) ; 369200 NLINE ~ TLINE ~ 14 ; 369300 COMMENT LIST ACTIVITY RECORDS ; 369400 LOOP: READ(SWF[RD],*,TREC)[EOF] ; 369500 IF NLINE = TLINE THEN 369600 BEGIN 369700 COMMENT PRINT HEADING ; 369800 WRITE(PRINTER[PAGE]) ; WRITE(PRINTER[DBL],FORM7) ; 369900 WRITE(PRINTER,FORM8) ; 370000 NLINE ~ 0 ; 370100 END ; 370200 WRITE(PRINTER,FORM9,OUT9) ; 370300 NLINE ~ NLINE + 1 ; 370400 GO TO LOOP ; 370500 EOF: REWIND(SWF[RD]) ; 370600 END ; 370700 BEGIN 370800 COMMENT LIST BLOCKS OF PERT PROGRAM WHICH HAVE BEEN EXECUTED 370900 SUCCESSFULLY ; 371000 INTEGER MM ; 371100 INTEGER KK ; 371200 INTEGER NN ; 371300 LABEL LFIN2,LFIN3,LFIN4,LFIN5,LFIN6,LFIN7,LFIN ; 371400 LABEL LFINA,LFINI,LFINJ,LFINE,LFIND,LFINM,LFING,LFINGI,LFINGJ ; 371500 LIST LIST3(FOR LL ~ 2 STEP 1 UNTIL 5 DO 371600 ITEMNAME[SORTCOL[KK,LL]]), 371700 LIST3E(FOR LL ~ 2 STEP 1 UNTIL 5 DO EVENTITEM 371800 [EVENTCOL[NN,LL]]), 371900 LIST6(IF (BLOCPARAM[MM].[9:3] = 1) THEN "DAYS " 372000 ELSE IF (BLOCPARAM[MM].[9:3] = 2) THEN "WEEKS " 372100 ELSE IF (BLOCPARAM[MM].[9:3] = 3) THEN "MONTHS" 372200 ELSE "QTRS ",IF (BLOCPARAM[MM].[24:24] = 0) THEN 372300 SDATE ELSE BLOCPARAM[MM].[24:24]) ; 372400 FORMAT OUT FIN1("INPUT AUDIT EXECUTED SUCCESSFULLY"), 372500 FIN2("RANK EXECUTED SUCCESSFULLY"), 372600 FIN3A("SORT OF ACTIVITIES BY ",4(A6,X1),"EXECUTED", 372700 " SUCCESSFULLY"), 372800 FIN3E("SORT OF EVENTS BY ",4(A6,X1),"EXECTUED ", 372900 "SUCCESSFULLY"), 373000 FIN4("NETANAL EXECUTED SUCCESSFULLY"), 373100 FIN5A("LIST OF ACTIVITIES EXECUTED SUCCESSFULLY"), 373200 FIN5DAI("DEPARTMENT REPORTS BY DEPARTMENT OF PREDECESSOR", 373300 " EVENT EXECUTED SUCCESSFULLY"), 373400 FIN5DAJ("DEPARTMENT REPORTS BY DEPARTMENT OF SUCCESSOR ", 373500 "EVENT EXECUTED SUCCESSFULLY"), 373600 FIN5E("LIST OF EVENTS EXECUTED SUCCESSFULLY"), 373700 FIN5DE("DEPARTMENT REPORTS OF EVENTS EXECUTED ", 373800 "SUCCESSFULLY"), 373900 FIN5M("MILESTONE REPORTS EXECUTED SUCCESSFULLY"), 374000 FIN6("PLOT BY ",A6," BEGINNING AT ",I6," EXECUTED ", 374100 "SUCCESSFULLY"), 374200 FIN6DI("DEPARTMENT GRAPHS BY DEPARTMENT OF PREDECESSOR ", 374300 "EVENT BY ",A6," BEGINNING AT ",I6," EXECUTED ", 374400 "SUCCESSFULLY"), 374500 FIN6DJ("DEPARTMENT GRAPHS BY DEPARTMENT OF SUCCESSOR ", 374600 "EVENT BY ",A6," BEGINNING AT ",I6," EXECUTED ", 374700 "SUCCESSFULLY"), 374800 FIN7("JOB COMPLETED"), 374900 FIN8("JOB NOT COMPLETED BECAUSE OF ERRORS NOTED ABOVE") ; 375000 SWITCH SWFIN ~ LFIN,LFIN2,LFIN3,LFIN4,LFIN5,LFIN6,LFIN7 ; 375100 SWITCH SW2 ~ LFINA,LFINI,LFINJ,LFINE,LFIND,LFINM ; 375200 SWITCH SW3 ~ LFING,LFINGI,LFINGJ ; 375300 KK ~ 0 ; 375400 NN ~ 0 ; 375500 WRITE(PRINTER[PAGE]) ; 375600 FOR MM ~ 1 STEP 1 UNTIL NOBLOCK - 1 DO 375700 BEGIN 375800 GO TO SWFIN[BLOC[MM]] ; 375900 LFIN2: WRITE(PRINTER[DBL],FIN1) ; GO TO LFIN ; 376000 LFIN3: WRITE(PRINTER[DBL],FIN2) ; GO TO LFIN ; 376100 LFIN4: IF (BLOCPARAM[MM] } 1) THEN 376200 BEGIN 376300 NN ~ NN + 1 ; WRITE(PRINTER[DBL],FIN3E,LIST3E) ; 376400 END 376500 ELSE 376600 BEGIN 376700 KK ~ KK + 1 ; WRITE(PRINTER[DBL],FIN3A,LIST3) ; 376800 END ; 376900 GO TO LFIN ; 377000 LFIN5: WRITE(PRINTER[DBL],FIN4) ; GO TO LFIN ; 377100 LFIN6: GO TO SW2[BLOCPARAM[MM].[16:3] + (3 | BLOCPARAM[MM].[9:3]) 377200 + 1] ; 377300 LFINA: WRITE(PRINTER[DBL],FIN5A) ; GO TO LFIN ; 377400 LFINI: WRITE(PRINTER[DBL],FIN5DAI) ; GO TO LFIN ; 377500 LFINJ: WRITE(PRINTER[DBL],FIN5DAJ) ; GO TO LFIN ; 377600 LFINE: WRITE(PRINTER[DBL],FIN5E) ; GO TO LFIN ; 377700 LFIND: WRITE(PRINTER[DBL],FIN5DE) ; GO TO LFIN ; 377800 LFINM: WRITE(PRINTER[DBL],FIN5M) ; GO TO LFIN ; 377900 LFIN7: GO TO SW3[BLOCPARAM[MM].[16:3] + 1] ; 378000 LFING: WRITE(PRINTER[DBL],FIN6,LIST6) ; GO TO LFIN ; 378100 LFINGI: WRITE(PRINTER[DBL],FIN6DI,LIST6) ; GO TO LFIN ; 378200 LFINGJ: WRITE(PRINTER[DBL],FIN6DJ,LIST6) ; GO TO LFIN ; 378300 LFIN: END ; 378400 IF BLOC[NOBLOCK] = 8 THEN WRITE(PRINTER,FIN7) 378500 ELSE WRITE(PRINTER,FIN8) ; 378600 END 378700 END 378800 END ; 378900 COMMENT WRITE SPO MESSAGES TO TELL WHICH TAPES SHOULD BE SAVED FOR 379000 AN UPDATE RUN ; 379100 INST[1,0] ~ FILENAMES[SC] ; 379200 TYPEOUT(SPOOUT,INST[1,*]) ; TYPEOUT(SPOOUT,INST[4,*]) ; 379300 INST[2,0] ~ FILENAMES[RD] ; 379400 TYPEOUT(SPOOUT,INST[2,*]) ; TYPEOUT(SPOOUT,INST[4,*]) ; 379500 IF EVENTTAPE THEN 379600 BEGIN 379700 INST[3,0] ~ FILENAMES[RE] ; 379800 TYPEOUT(SPOOUT,INST[3,*]) ; TYPEOUT(SPOOUT,INST[4,*]) ; 379900 END ; 380000 ENDOFPROG: END . 380100