BEGIN 1000 COMMENT JOHN R. KESSLER 2000 PROFESSIONAL SERVICES DEPARTMENT 3000 BURROUGHS CORPORATION 4000 10-19-63 5000 AN ALGOL PROGRAM FOR SOLVING NON-HOMOGENEOUS 6000 LINEAR EQUATIONS. 7000 ***** MEANING OF MAIN VARIABLES ***** 8000 A[I,J] MATRIX ENTRIES 9000 AI[I,J] ROW INDICES FOR MATRIX ENTRIES 10000 B[I] CURRENT RIGHT HAND SIDE 11000 BBB BBB + 1 = NUMBER OF RIGHT HAND SIDES YET 12000 TO BE SOLVED FOR 13000 BH[I] COLUMN NUMBERS IN ROWS UPON WHICH THEY PIVOTED 14000 BL1 IF "TRUE" DUMP TRANSFORMATION VECTORS PERIODICALLY 15000 BL2 INDICATES RESTART IF "TRUE" 16000 BL3 INDICATES RESTART IN MIDDLE OF PROGRAM IF "TRUE" 17000 BOOL1 IF "TRUE" THEN RESTART USING DUMPED DATA 18000 BOOL2 IF "TRUE" OUTPUT AFTER A COLUMN IS ENTERED 19000 CNAME[I] COLUMN NAMES 20000 CNO[I] COLUMN DENSITIES 21000 DC[I] NAMES OF COLUMNS DELETED 22000 E[I,J] TRANSFORMATION ENTRIES 23000 EI[I,J] ROW INDICES FOR TRANSFORMATION ENTRIES 24000 INDEX NUMBER OF COLUMN CURRENTLY BEING UPDATED 25000 IT ROW NUMBER OF PIVOT 26000 K ROW INDEX FOR FIRST EMPTY ENTRY IN E[I,J] 27000 L COLUMN INDEX FOR FIRST EMPTY ENTRY IN E[I,J] 28000 M TOTAL NUMBER OF ROWS 29000 N TOTAL NUMBER OF COLUMNS 30000 NR NUMBER OF COLUMNS ENTERED 31000 RH[I] NAMES OF RIGHT HAND SIDES TO BE SOLVED FOR 32000 RJ[I] NAMES OF ROWS DELETED 33000 RNAME[I] ROW NAMES 34000 SCN[I] COLUMN NUMBERS, SORTED BY DENSITY 35000 TALLY[I] ROW DENSITIES OF COLUMNS NOT ENTERED 36000 TE[I] TRANSFORMATION VECTOR STARTING POSITION IN E[I,J], 37000 CONTAINS PIVOT POSITION ASSOCIATED WITH VECTOR 38000 TOL1 TOLERANCE 39000 TOL2 TOLERANCE 40000 TW NUMBER OF COLUMNS TEMPORARILY SKIPPED 41000 W[I] COLUMN STARTING POSITIONS IN A[I,J], CONTAINS FLAG 42000 INDICATING WHETHER COLUMN ENTERED 43000 ; 44000 FILE IN CARD(1,10); 45000 FILE OUT PRINTER 1(1,15); 46000 FILE OUT TPR 2(1,1023); 47000 FORMAT IN ALPH(A6), 48000 ALP (A6,X4,A6), 49000 FO3(A6,X4,2F10.7), 50000 TO1(A6,X6,3F12.10), 51000 CCI(A6,X4,A6), 52000 FOT(A6,X2,I4,X6,I4), 53000 CH(2A6,F12.6), 54000 AL(12A6); 55000 FORMAT OUT FO4("IMPROPER MATRIX - NOT SQUARE"//), 56000 IT1("NUMBER OF COLUMN NUMBER OF NUMBER OF", 57000 " ROW NAME ROW NUMBER ", 58000 " NUMBER OF"), 59000 IT2("ITERATIONS ENTERED COLUMNS ENTERED COLUMNS ", 60000 "SKIPPED OF PIVOT OF PIVOT VALUE OF PIVOT ", 61000 "TRANSFORMATION ENTRIES"/), 62000 FIT(X3,I4,X5,A6,X8,I4,X13,I4,X9,A6,X6,I4,X6, 63000 E17.10,X9,I5), 64000 FORI("ROWS OF INVERSE"//), 65000 FOX(///"THE FOLLOWING IS THE",I4,"TH ROW OF THE" 66000 " INVERSE CORRESPONDING TO ROW ",A6//), 67000 FO2("NO SOLUTION - SINGULAR"//), 68000 FO11("A ROW HAS NO ELEMENTS"/), 69000 FO5("RANK NOT GIVEN"//), 70000 PCH(2A6,F12.6), 71000 KK("(",I4,")",X3,A6," = ",E17.10/), 72000 FO7(E17.10/), 73000 CONT(A6,X20,"CONTROL CARD"/), 74000 FOS(A6,X2,I4,X6,I4,X4,"CONTROL CARD"/), 75000 FRR("FREQUENCY ",I4," CONTROL CARD"/), 76000 RES("RESTART CONTROL CARD"/), 77000 FOF(A6,X4,A6), 78000 FOC(A6,X4,2F10.7), 79000 CCO(A6,X4,A6,X10,"CONTROL CARD"/), 80000 PRIN(A6,X4,"PRINTER",X9,"CONTROL CARD"/), 81000 TO3("TOLERANCE VALUES: TOL1 = ",F12.10,X4,"TOL2 = ", 82000 F12.10,X4,"TOL3 = ",F12.10), 83000 CONT2(A6), 84000 PR((4(" [",I4,",",I4,"]=",E17.10)/)/), 85000 FOE("IN LIEU OF THE CORRECT CARD, THE FOLLOWING CARD", 86000 " WAS PRESENT",//12A6), 87000 INH("INHIBIT CORE CHECK CONTROL CARD"/), 88000 MEM("MEMORY",X6,I4,X10,"CONTROL CARD"/), 89000 OUTCORE(///"********** OUT OF CORE"), 90000 RETO("TOLERANCES SET TO ZERO"/), 91000 FO11A("A COLUMN HAS NO ELEMENTS"//), 92000 FO1(/////"SOLUTION: ",A6//), 93000 FO6("FROM WHERE IS DATA TO BE READ"//), 94000 FO10("END OF PROGRAM."//); 95000 FORMAT TIM(/"* TIME = ",F10.3/); 96000 REAL ZEROTIME; 97000 ALPHA ARRAY HEAD[0:11]; 98000 REAL ARRAY RESTART[0:10]; 99000 INTEGER I,RR; 100000 ALPHA CONTROL; 101000 LABEL STOP,SS; 102000 LABEL L1; 103000 LABEL ENDPROGRAM; 104000 REAL RK1,RK2; 105000 BOOLEAN BOOL1; 106000 SS: READ (CARD[NO],ALPH ,CONTROL); 107000 IF CONTROL = "HEADIN" THEN 108000 BEGIN 109000 LABEL M1; 110000 READ (CARD ,AL ,CONTROL); 111000 M1: READ (CARD ,AL , FOR I ~ 0 STEP 1 UNTIL 11 DO 112000 HEAD[I]); 113000 IF HEAD[0] ! "END " THEN 114000 BEGIN 115000 WRITE(PRINTER,AL,FOR I ~ 0 STEP 1 UNTIL 11 DO HEAD[I]); 116000 GO TO M1; 117000 END; 118000 END; 119000 WRITE(PRINTER[DBL]); 120000 BOOL1 ~ FALSE; 121000 READ(CARD[NO],ALPH,CONTROL); 122000 IF CONTROL = "RESTAR" THEN 123000 COMMENT THE PROGRAM WILL RESTART USING DATA PREVIOUSLY DUMPED 124000 AT THE END OF THE INPUT PROCEDURES. ; 125000 BEGIN 126000 FILE IN TPR(1,1023); 127000 READ(CARD,ALPH,CONTROL); 128000 WRITE(PRINTER,RES); 129000 READ(TPR,11,RESTART[*]); 130000 RK1 ~ RESTART[5]; 131000 RK2 ~ RESTART[6]; 132000 BOOL1 ~ TRUE; 133000 GO TO L1; 134000 END; 135000 COMMENT THE COMPUTER WILL STOP IF THE "RANK" CARD IS NOT PRESENT.; 136000 READ(CARD[NO],ALPH,CONTROL); 137000 IF CONTROL = "RANK " THEN 138000 BEGIN 139000 READ(CARD,FOT,CONTROL,RK1,RK2); 140000 WRITE(PRINTER[DBL],FOS,CONTROL,RK1,RK2); 141000 END 142000 ELSE 143000 BEGIN 144000 READ(CARD,AL,FOR I ~ 0 STEP 1 UNTIL 11 DO HEAD[I]); 145000 WRITE(PRINTER,FOE,FOR I ~ 0 STEP 1 UNTIL 11 DO HEAD[I]); 146000 WRITE (PRINTER,FO5); 147000 GO TO STOP; 148000 END; 149000 L1: BEGIN 150000 INTEGER FLAG,J,NR,H,RKM,M,N,RT,SQ,RL,F,INDEX,AA,IT,K,L,BBB; 151000 INTEGER CST,FREQ; 152000 LABEL ENT,SEARCH,ENT1,EXTRACT,OUTPUT,M7,M8,RAN,TRAN; 153000 REAL X,Y,XX,YY,T1,T2,P,Q,R,S,TOL1,TOL2,SUM,RS ; 154000 REAL Z,ZZ,DET,TG,SU,TW,SUT; 155000 REAL TEMP,MINE,MAXE; 156000 REAL TOL3; 157000 BOOLEAN BL1,BL2,BL3; 158000 BOOLEAN BL4,BL5; 159000 LABEL LL; 160000 BOOLEAN BOOL2; 161000 ARRAY DUMPT[0:10]; 162000 LABEL DUMP1; 163000 ALPHA AC,AD,AE,DL; 164000 ARRAY A,AI[0:7,0:1022],E,EI[0:31,0:1022],TALLY,V,B,BH[0:RK1], 165000 W,TE[0:RK2],FF[0:10,0:1]; 166000 INTEGER ARRAY U[0:40]; 167000 INTEGER ARRAY CNO[-1:RK2],COUNT,SCN[0:RK2]; 168000 ALPHA ARRAY CON[0:10],SG,RNAME,RJ,RH[0:RK1],DC,CNAME[0:RK2]; 169000 PROCEDURE UPDATE(J); 170000 COMMENT THIS PROCEDURE UPDATES THE CHOSEN COLUMN DURING THE STAGES 171000 PRIOR TO INITIALLY FINDING A SOLUTION. IT IS ALSO USED TO 172000 FIND ANY ADDITIONAL SOLUTIONS USING THE SAME "A" BUT 173000 DIFFERENT "B".; 174000 VALUE J; 175000 INTEGER J; 176000 BEGIN 177000 LABEL BB; 178000 IF FLAG = 0 THEN 179000 GO TO BB; 180000 X ~ W[J].[35:3]; 181000 Y ~ W[J].[38:10]; 182000 BB: XX ~ X; 183000 YY ~ W[J+1].[38:10] - 1; 184000 FOR I ~ 0 STEP 1 UNTIL RKM DO V[I] ~ 0; 185000 COMMENT EXPAND THE COLUMN ; 186000 IF YY < Y THEN 187000 BEGIN 188000 XX ~ X + 1; 189000 FOR I ~ Y STEP 1 UNTIL 1022 DO 190000 V[AI[X,I]] ~ A[X,I]; 191000 FOR I ~ 0 STEP 1 UNTIL YY DO 192000 V[AI[XX,I]] ~ A[XX,I]; 193000 END 194000 ELSE 195000 FOR I ~ Y STEP 1 UNTIL YY DO 196000 V[AI[X,I]] ~ A[X,I]; 197000 COMMENT UPDATE THE EXPANDED COLUMN ; 198000 FOR I ~ 0 STEP 1 UNTIL NR - 1 DO 199000 BEGIN 200000 S ~ TE[I]; 201000 P ~ S.[23:10]; 202000 T2 ~ V[P]; 203000 IF ABS(T2) > TOL1 THEN 204000 BEGIN 205000 V[P] ~ 0; 206000 Q ~ S.[33:5]; 207000 R ~ S.[38:10]; 208000 RS ~ TE[I+1].[38:10] - 1; 209000 IF RS } R THEN 210000 FOR F ~ R STEP 1 UNTIL RS DO 211000 V[EI[Q,F]] ~ E[Q,F] | T2 + V[EI[Q,F]] 212000 ELSE 213000 BEGIN 214000 S ~ Q + 1; 215000 FOR F ~ R STEP 1 UNTIL 1022 DO 216000 V[EI[Q,F]] ~ E[Q,F] | T2 + V[EI[Q,F]]; 217000 FOR F ~ 0 STEP 1 UNTIL RS DO 218000 V[EI[S,F]] ~ E[S,F] | T2 + V[EI[S,F]]; 219000 END; 220000 END; 221000 END; 222000 END; 223000 COMMENT THE FOLLOWING PROCEDURES ARE STANDARD FOR INPUT.; 224000 PROCEDURE RWID(X, Y); 225000 FILE X, Y; 226000 COMMENT READ THE ROW ID FROM X, MAKE ALL THE DELETIONS ACCORDING 227000 TO DELETE CONTROL, CONSTRUCT THE TABLE OF SLACK TYPE SG 228000 AND THE CORRESPONDING LIST OF RNAME THE SELECTED ROW 229000 NAMES. WRITE OUT SELECTIONS OPTIONALLY. 230000 CALLS ON NO OTHER PROCEDURES. 231000 CALLED BY INPUT. ; 232000 BEGIN 233000 INTEGER G, H, I, J, K, P, Q; 234000 ALPHA D; 235000 LABEL R1, R2, R3, R4, R5, R6; 236000 FORMAT IN Z(A5,I1,10A6); 237000 FORMAT OUT T(A5,I1,10A6), 238000 TT(11A6), 239000 MESS(/"THE INDICATOR CARD ROW ID HAS NOT BEEN FOUND. ", 240000 "INSTEAD THE FOLLOWING CARD WAS ENCOUNTERED: "/ 241000 A5, I1, 10A6/"GET OFF THE B-5000."/); 242000 ALPHA ARRAY S, R, A, B[0:5]; 243000 LIST V(D, P, FOR I ~ 1 STEP 1 UNTIL (IF P=0 THEN 1 ELSE P) DO 244000 [S[I], R[I]]), 245000 W(D, K, FOR Q ~ 1 STEP 1 UNTIL K DO [A[Q], B[Q]]); 246000 FORMAT OUT MESS1(/"THE COMBINED NUMBER OF FUNCTIONALS AND ", 247000 "CONSTRAINTS WAS GIVEN AS M = ", I3/"THE SAME NUMBER ", 248000 "COMPUTED FROM DATA IS M = ", I3, I5/); 249000 J ~ K ~ 0; 250000 R1: READ(X, Z, V); 251000 IF D.[18:6] = "*" THEN 252000 BEGIN 253000 IF RT = 1 THEN WRITE(Y,T,V); GO TO R1 254000 END; 255000 IF D ! "ROW I" THEN 256000 BEGIN 257000 WRITE(PRINTER, MESS, V); GO TO ENDPROGRAM 258000 END; 259000 D ~ "ROW ID"; 260000 IF RT = 1 THEN 261000 WRITE(Y,TT,V); 262000 R2: READ(X, Z, V); 263000 IF D.[18:6] = "*" THEN 264000 BEGIN 265000 IF RT = 1 THEN WRITE(Y,Z,V); GO TO R2; 266000 END; 267000 IF D = "END " THEN 268000 BEGIN 269000 IF RT = 0 THEN GO TO R6 ELSE GO TO R5 270000 END; 271000 COMMENT IF THE COUNTER IS BLANK, THIS MEANS ONE ROW NAME; 272000 IF P = 0 THEN P ~ 1; 273000 FOR I ~ 1 STEP 1 UNTIL P DO 274000 BEGIN 275000 COMMENT RT IS A FLAG FOR WRITING. 276000 RL IS THE NUMBER OF DELETED ROWS; 277000 IF RL = 0 THEN 278000 BEGIN 279000 R3: IF J ~ J+1 = U[5] THEN 280000 COMMENT INSERT A BLANK RNAME CORRESPONDING TO INFEASIBILITY; 281000 BEGIN 282000 SG[J] ~ " "; RNAME[J] ~ "INFEAS"; GO TO R3 283000 END; 284000 SG[J] ~ S[I]; RNAME[J] ~ R[I]; 285000 IF RT ! 0 THEN 286000 COMMENT SELECTED ROWS ARE WRITTEN OUT ON TAPE; 287000 BEGIN 288000 IF K } 5 THEN 289000 BEGIN 290000 WRITE(Y, T, W); K ~ 0 291000 END; 292000 K ~ K + 1; B[K] ~ R[I]; A[K] ~ S[I]; GO TO R4 293000 END 294000 END ELSE 295000 BEGIN 296000 COMMENT THERE ARE DELETED ROWS. RL IS THE NUMBER OF ROWS WHICH 297000 WERE REJECTED BY THE CONTROL CARD DELETE. RJ IS THE LIST; 298000 FOR H ~ 1 STEP 1 UNTIL RL DO 299000 IF R[I] = RJ[H] THEN GO TO R4; 300000 GO TO R3; 301000 END; 302000 R4: END; 303000 COMMENT READ A NEW RECORD; 304000 GO TO R2; 305000 COMMENT THE END OF THE ROW ID RECORDS IS ENCOUNTERED. 306000 WRITE THE LAST BUFFER AND THE END CARD; 307000 R5: D ~ " "; WRITE(Y,T,W); D ~ "END "; WRITE(Y,TT,V); 308000 R6: WRITE(PRINTER, MESS1, M,J); M ~ J 309000 END; 310000 PROCEDURE MATRIXREAD(X, Y); 311000 FILE X, Y; 312000 COMMENT MATRIXREAD WILL READ THE COEFFICIENT MATRIX FROM FILE X, 313000 CHOOSE A SUBSET OF ROWS AND COLUMNS, CONSTRUCT THE SLACK 314000 VECTORS IF NEEDED. 315000 IT WILL WRITE ON FILE Y IF SO SIGNALLED BY THE RT FLAG. 316000 CALLED BY THE INPUT ROUTINE. 317000 CALLS ON NO OTHER PROCEDURES; 318000 BEGIN 319000 INTEGER C,G,H,I,J,K,L,P,R,T,V ; 320000 ALPHA SL, IC, CN, RN, TM, CA, FL ; 321000 REAL Q; 322000 LABEL M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11, M12, M13, 323000 M14, M15, M16, M17, M18, M19, M20, M21; 324000 LIST ML(IC, CN, RN, Q); 325000 FORMAT IN MN(3A6, F12.6); 326000 FORMAT OUT MT(3A6, F12.6), 327000 MISSUM1("/TOO MANY VECTORS OR ELEMENTS. ROWS = ", I4, 328000 " COLUMNS = ",I4," ELEMENTS = "I4,",",I5/"GET OFF THE", 329000 " B5000"/), 330000 MISSUM2(/"THE FOLLOWING UNKNOWN MATRIX CARD SAYS: "/ 331000 3A6,F12.5,/"GET OFF THE B 5000"/) , 332000 MISSUM3(/"ILLEGAL CHARACTER IN ROW NAME ENTRY"/A6,", ", 333000 A6/ "TREAT THIS AS AN EQUALITY CONSTRAINT."/), 334000 MISSUM4(/"THE PROBLEM HAS ", I4, " ROWS AND ",I4, 335000 " COLUMNS. ",I4," MATRIX ENTRIES AND ",I3," R.H.S.",I1/), 336000 MISSUM5(/"THE FOLLOWING ROWS ARE NOT CONSIDERED IN THIS", 337000 " PROBLEM."/), 338000 MISSUM6(X20, I3,". ", A6), 339000 MISSUM7(/"INSTEAD OF THE MATRIX INDICATOR, THE FOLLOWING", 340000 " UNKNOWN CARD WAS ENCOUNTERED"/3A6, F12.5/"GET OFF " 341000 "THE B-5000."/), 342000 MISSUM8(/"THE FOLLOWING SPLIT VECTOR WAS ENCOUNTERED"/ 343000 3A6, F12.5/ "ITS TWO PORTIONS ARE PRECEDED BY THE ", 344000 "FOLLOWING VECTORS: ", A6, " AND ", A6/), 345000 MISSUM9(/"THE FOLLOWING VECTOR: ", A6, " WAS DELETED ", 346000 "BECAUSE IT WAS FOUND TO BE EMPTY."/); 347000 K ~ H ~ N ~ L ~ P ~ C ~ 0; G ~ 0; SL ~ "/ "; 348000 SUT ~ 0; 349000 K ~ -1; 350000 T ~ 0; 351000 M1: READ(X, MN, ML); 352000 IF IC.[12:6] = "*" THEN GO TO M2; 353000 IF IC = "MATRIX" THEN GO TO M3; 354000 COMMENT THE MATRIX INDICATOR IS NOT FOUND; 355000 WRITE(PRINTER, MISSUM7, ML); GO TO ENDPROGRAM; 356000 M2: IF RT = 1 THEN 357000 WRITE(Y, MT, ML); 358000 GO TO M1; 359000 M3: IF RT = 1 THEN 360000 WRITE(Y, MT, ML); 361000 M4: READ(X, MN, ML); 362000 COMMENT TEST THE INDICATOR FOR BLANKS; 363000 IF IC = " " THEN 364000 COMMENT TEST FOR NEW VECTOR. BLANK SIGNIFIES SAME VECTOR; 365000 BEGIN 366000 IF N > 0 THEN 367000 BEGIN 368000 COMMENT T = 2 SIGNIFIES THAT A RIGHT HAND SIDE WAS ENCOUNTERED. 369000 IN THIS CASE THE COLUMN NAMES ARE MEANINGLESS. NEW VECTORS 370000 OF THE RHS ARE RECOGNIZED BY THE INDICATOR FIELD ONLY; 371000 IF (CNAME[L] = CN) OR (CN = " ") OR (T = 2) THEN 372000 GO TO M9 373000 END; 374000 COMMENT TEST WHETHER THIS NEW VECTOR IS IN THE LIST OF DELETED 375000 VECTORS DC[V], THEIR NUMBER IS SQ; 376000 M5: FOR V ~ 1 STEP 1 UNTIL SQ DO 377000 IF CN = DC[V] THEN 378000 BEGIN 379000 COMMENT SKIP ALL THE ENTRIES OF THIS COLUMN; 380000 TM ~ CN; 381000 M6: READ(X, MN, ML); 382000 IF IC = " " THEN 383000 BEGIN 384000 IF (TM = CN) OR (CN = " ") THEN GO TO M6 385000 ELSE GO TO M5 386000 END; 387000 GO TO M13 388000 END; 389000 COMMENT WAS THIS "NEW" VECTOR ENCOUNTERED BEFORE. SPLIT VECTOR; 390000 FOR J ~ 1 STEP 1 UNTIL L - 1 DO 391000 IF CN = CNAME[J] THEN 392000 BEGIN 393000 FL ~ " SPLIT" ; 394000 M7: TM ~ CN; WRITE(PRINTER, MISSUM8, IC, CN, RN, Q, CNAME[J-1] 395000 , CNAME[L]); 396000 GO TO M6 397000 END; 398000 COMMENT IS THIS A COLUMN IN WHICH ALL THE ROWS HAVE BEEN DELETED; 399000 IF G = 1 THEN 400000 BEGIN 401000 IF P = 0 THEN 402000 WRITE(PRINTER, MISSUM9, CNAME[L]); GO TO M8 403000 END; 404000 COMMENT BUMP THE VECTOR COUNT N, THIS IS NOT A REJECTED COLUMN; 405000 IF L { M AND L ! 0 THEN 406000 BEGIN 407000 CNO[L-1] ~ SUT; COUNT[SUT] ~ COUNT[SUT] + 1; 408000 SUT ~ 0; 409000 END; 410000 L ~ N ~ N + 1; G ~ 1; 411000 M8: IF L { 1022 THEN CNAME[L] ~ CN ELSE GO TO M10; 412000 COMMENT THE FIRST ENTRY OF A RHS DOES NOT HAVE A ROW NAME; 413000 IF (IC = "FIRST ") OR (IC = "NEXT B") THEN GO TO M4; 414000 COMMENT SEARCH THE ROW ID TABLE AND FIND THE INDEX OF THIS ENTRY; 415000 M9: FOR I ~ 1 STEP 1 UNTIL M DO 416000 IF RNAME[I] = RN THEN 417000 COMMENT TEST WHETHER THERE ARE TOO MANY ELEMENTS; 418000 BEGIN 419000 IF K ~ K + 1 > 1022 THEN 420000 BEGIN 421000 K ~ 0; IF H ~ H+1 > 7 THEN GO TO M10 422000 END; 423000 IF G = 1 THEN GO TO M11 ELSE GO TO M12; 424000 M10: WRITE(PRINTER, MISSUM1, M, N, H, K); 425000 GO TO ENDPROGRAM 426000 END; 427000 COMMENT A REJECTED ROW HAS BEEN FOUND. CHECK WHETHER IT WAS 428000 ALREADY FOUND BEFORE. IF NOT ADD TO THE LIST OF REJECTED 429000 ROW NAMES; 430000 FOR R ~ 1 STEP 1 UNTIL C DO 431000 IF RJ[R] = RN THEN GO TO M4; 432000 RJ[C ~ C+1] ~ RN; GO TO M4; 433000 COMMENT STORE THIS ELEMENT, ITS LOCATION AND ITS INDEX; 434000 M11: W[L-1].[38:10] ~ K; W[L-1].[35:3] ~ H; G ~ 2; 435000 M12: AI[H,K] ~ I - 1; A[H,K] ~ Q; CN ~ CNAME[L]; 436000 TEMP ~ ABS(A[H,K]); SUT ~ SUT + 1; 437000 IF TEMP ! 0 THEN 438000 BEGIN 439000 IF TEMP > MAXE THEN MAXE ~ TEMP; 440000 IF TEMP < MINE THEN MINE ~ TEMP; 441000 END; 442000 GO TO M3; 443000 END; 444000 COMMENT THE INDICATOR FIELD IS NOT BLANK. IGNORE * REMARKS; 445000 M13: IF IC.[12:6] = "*" THEN GO TO M3; 446000 IF IC = "FIRST " THEN GO TO M14; 447000 IF IC = "NEXT B" THEN GO TO M17; 448000 IF IC = "EOF " THEN GO TO M20; 449000 WRITE(PRINTER, MISSUM2, ML); GO TO ENDPROGRAM; 450000 M14: CNO[L-1] ~ SUT; COUNT[SUT] ~ COUNT[SUT] + 1; 451000 BEGIN 452000 M16: END; 453000 COMMENT CONSTRUCT RIGHT HAND SIDES. G=1 IS FOR LAST VECTOR EMPTY; 454000 T ~ 1; 455000 M17: IF G = 1 THEN 456000 BEGIN 457000 IF T = 1 THEN L ~ N ~ N - 1 ELSE P ~ P - 1; G ~ 2; 458000 WRITE(PRINTER, MISSUM9, CNAME[L+1]) 459000 END ; 460000 IF T = 1 THEN GO TO M18 ELSE GO TO M19; 461000 COMMENT PRINT THE PROBLEM SIZE BEFORE AND AFTER CONSTRUCTING THE 462000 RIGHT HAND SIDES; 463000 M18: WRITE(PRINTER, MISSUM4, M, N, H|1022+ K,P); 464000 IF T = 1 THEN T ~ 2 ELSE GO TO M21; 465000 M19: IF RT = 1 THEN 466000 WRITE(Y, MT, IC, CN, RN); 467000 P ~ P + 1; 468000 L ~ N + P; G ~ 1; GO TO M5; 469000 COMMENT FINISHED READING. TIE THINGS UP AND PRINT PROBLEM SIZE; 470000 M20: IF RT = 1 THEN 471000 WRITE(Y, MT, IC, CN, RN); 472000 U[18].[35:3] ~ H; U[18].[38:10] ~ K; 473000 IF G = 1 THEN 474000 BEGIN 475000 P ~ P - 1; L ~ N + P; WRITE(PRINTER,MISSUM9,CNAME[L+1]) 476000 END; 477000 U[28] ~ P; CNAME[L+1] ~ "EOF "; CNAME[0] ~ "ARTFCL"; 478000 IF K ~ K + 1 > 1022 THEN 479000 BEGIN 480000 IF H ~ H+1{7 THEN K ~ 0 ELSE GO TO M10 481000 END; 482000 W[L].[38:10] ~ K; W[L].[35:3] ~ H; GO TO M18; 483000 COMMENT PRINT OUT THE EXPLICITELY REJECTED ROWS IF SO DESIRED; 484000 M21: IF DL = " PRINT" AND C >0 THEN 485000 BEGIN 486000 WRITE(PRINTER, MISSUM5); 487000 WRITE(PRINTER, MISSUM6, FOR R ~ 1 STEP 1 UNTIL C DO 488000 [R, RJ[R]]) 489000 END ; 490000 IF FL = " SPLIT" THEN GO TO ENDPROGRAM 491000 END; 492000 PROCEDURE PRICES; 493000 COMMENT THIS PROCEDURE FINDS THE DESIRED ROWS OF THE INVERSE. 494000 IT WILL ALSO SOLVE FOR CORRESPONDING ROWS OF THE 495000 IDENTITY MATRIX (I.E., THAT MATRIX RESULTING FROM 496000 MATRIX MULTIPLYING THE MATRIX AND ITS INVERSE).; 497000 BEGIN 498000 INTEGER G,B; 499000 FORMAT OUT INVCK(5(" [",I4,"] ",E16.9)/); 500000 FORMAT YT(//"THE FOLLOWING IS THE",I4,"TH ROW OF THE MATRIX", 501000 "PRODUCT OF THE DATA MATRIX WITH ITS INVERSE"/); 502000 INTEGER CHK; 503000 REAL PP,RR,UU,VV,WW,KK; 504000 ARRAY L,K[0:M]; 505000 ALPHA ARRAY INV[0:M]; 506000 LABEL AG; 507000 CHK ~ 0; 508000 WRITE(PRINTER,FORI); 509000 READ(CARD,ALPH,CONTROL); 510000 AG: READ(CARD,ALPH,CONTROL); 511000 IF CONTROL = "CHECK " THEN 512000 COMMENT FIND CORRESPONDING ROWS OF THE IDENTITY MATRIX ; 513000 BEGIN 514000 CHK ~ 1; 515000 WRITE(PRINTER,CONT,CONTROL); 516000 GO TO AG; 517000 END; 518000 IF CONTROL ! "ALL " THEN 519000 COMMENT SOLVE FOR THE ENTIRE INVERSE ; 520000 BEGIN 521000 IF CONTROL ! "END " THEN 522000 BEGIN 523000 FOR I ~ 1 STEP 1 UNTIL M DO 524000 IF RNAME[I] = CONTROL THEN 525000 INV[I-1] ~ CONTROL; 526000 WRITE(PRINTER,CONT2,CONTROL); 527000 GO TO AG; 528000 END; 529000 END 530000 ELSE 531000 BEGIN 532000 WRITE(PRINTER,CONT,CONTROL); 533000 READ(CARD,ALPH,CONTROL); 534000 FOR I ~ 1 STEP 1 UNTIL M DO 535000 INV[I-1] ~ RNAME[I]; 536000 END; 537000 COMMENT THE FOLLOWING SECTION SOLVES FOR A ROW OF THE INVERSE ; 538000 FOR I ~ 0 STEP 1 UNTIL RKM DO 539000 IF INV[I] ! 0 THEN 540000 BEGIN 541000 FOR G ~ 0 STEP 1 UNTIL M DO 542000 K[G] ~ 0; 543000 FOR J ~ 0 STEP 1 UNTIL RKM DO 544000 IF BH[J] = I THEN 545000 K[J] ~ 1; 546000 FOR G ~ NR STEP -1 UNTIL 1 DO 547000 BEGIN 548000 PP ~ TE[G].[38:10] - 1; 549000 UU ~ TE[G-1].[38:10]; 550000 VV ~ TE[G-1].[33:5]; 551000 WW ~ TE[G-1].[23:10]; 552000 KK ~ 0; 553000 IF PP < UU THEN 554000 BEGIN 555000 RR ~ VV + 1; 556000 FOR B ~ UU STEP 1 UNTIL 1022 DO 557000 KK ~ KK + K[EI[VV,B]] | E[VV,B]; 558000 FOR B ~ 0 STEP 1 UNTIL PP DO 559000 KK ~ KK + K[EI[RR,B]] | E[RR,B]; 560000 END 561000 ELSE 562000 FOR B ~ UU STEP 1 UNTIL PP DO 563000 KK ~ KK + K[EI[VV,B]] | E[VV,B]; 564000 K[WW] ~ KK; 565000 END; 566000 WRITE(PRINTER,FOX,I+1,INV[I]); 567000 WRITE(PRINTER,PR,FOR B~0 STEP 1 UNTIL RKM DO 568000 [I+1,B+1,K[B]]); 569000 COMMENT THE FOLLOWING SECTION SOLVES FOR A ROW OF THE 570000 IDENTITY MATRIX ; 571000 IF CHK = 1 THEN 572000 BEGIN 573000 FOR J ~ 0 STEP 1 UNTIL RKM DO 574000 BEGIN 575000 PP ~ W[J].[35:3]; 576000 UU ~ W[J].[38:10]; 577000 VV ~ W[J+1].[38:10] - 1; 578000 KK ~ 0; 579000 IF VV } UU THEN 580000 FOR F ~ UU STEP 1 UNTIL VV DO 581000 KK ~ KK + K[AI[PP,F]] | A[PP,F] 582000 ELSE 583000 BEGIN 584000 FOR F ~ UU STEP 1 UNTIL 1022 DO 585000 KK ~ KK + K[AI[PP,F]] | A[PP,F]; 586000 FOR F ~ 0 STEP 1 UNTIL VV DO 587000 KK ~ KK + K[AI[PP+1,F]] | A[PP+1,F]; 588000 END; 589000 V[J] ~ KK; 590000 END; 591000 WRITE(PRINTER,YT,I+1); 592000 WRITE(PRINTER,INVCK,FOR F~0 STEP 1 UNTIL RKM DO 593000 [F+1,V[F]]); 594000 END; 595000 END; 596000 END; 597000 PROCEDURE ERROR(SOL); 598000 COMMENT THIS PROCEDURE SOLVES AND PRINTS THE RESULT OF 599000 SUBTRACTING THE MATRIX PRODUCT OF THE SOLUTION AND THE 600000 COEFFICIENT MATRIX FROM THE RIGHT HAND SIDE ; 601000 VALUE SOL; 602000 ARRAY SOL[0]; 603000 BEGIN 604000 ARRAY ER[0:RKM]; 605000 REAL R,B,C,D,RHSFG; 606000 FORMAT KK("(",I4,")",X3,A6," ERROR = ",E17.10/); 607000 FORMAT SK(//"ERRORS RESULTING FROM SUBTRACTING THE MATRIX", 608000 "PRODUCT OF THE DATA MATRIX AND THE SOLUTION FROM THE", 609000 " RIGHT HAND SIDE"//); 610000 FORMAT TK("**** MAXIMUM ERROR FOUND FOR ROW ",A6, 611000 " , ERROR = ",E16.9," ****"/); 612000 FOR I~0 STEP 1 UNTIL RKM DO ER[I] ~ 0; 613000 IF BBB ! -1 THEN 614000 BEGIN 615000 FOR I ~ M+1 STEP 1 UNTIL N DO 616000 IF CNAME[I] = RH[BBB] THEN 617000 RHSFG ~ I - 1 618000 END 619000 ELSE 620000 RHSFG ~ M; 621000 FOR I ~ 0 STEP 1 UNTIL RKM DO 622000 BEGIN 623000 R ~ W[I].[35:3]; 624000 B ~ W[I].[38:10]; 625000 C ~ W[I+1].[38:10] - 1; 626000 IF C } B THEN 627000 FOR J ~ B STEP 1 UNTIL C DO 628000 ER[AI[R,J]] ~ ER[AI[R,J]] + A[R,J] | SOL[I] 629000 ELSE 630000 BEGIN 631000 D ~ R + 1; 632000 FOR J ~ B STEP 1 UNTIL 1022 DO 633000 ER[AI[R,J]] ~ ER[AI[R,J]] + A[R,J] | SOL[I]; 634000 FOR J ~ 0 STEP 1 UNTIL C DO 635000 ER[AI[D,J]] ~ ER[AI[D,J]] + A[D,J] | SOL[I]; 636000 END; 637000 END; 638000 FOR I ~ 0 STEP 1 UNTIL RKM DO V[I] ~ 0; 639000 R ~ W[RHSFG].[35:3]; 640000 B ~ W[RHSFG].[38:10]; 641000 C ~ W[RHSFG+1].[38:10] - 1; 642000 IF C } B THEN 643000 FOR J ~ B STEP 1 UNTIL C DO 644000 V[AI[R,J]] ~ A[R,J] 645000 ELSE 646000 BEGIN 647000 D ~ R + 1; 648000 FOR J ~ B STEP 1 UNTIL 1022 DO 649000 V[AI[R,J]] ~ A[R,J]; 650000 FOR J ~ 0 STEP 1 UNTIL C DO 651000 V[AI[D,J]] ~ A[D,J]; 652000 END; 653000 WRITE(PRINTER,SK); 654000 FOR I ~ 0 STEP 1 UNTIL RKM DO 655000 WRITE(PRINTER,KK,I+1,RNAME[I+1],(ER[I] - V[I])); 656000 R ~ 0; 657000 COMMENT THE LARGEST ERROR IS FOUND AND SEPARATELY PRINTED ; 658000 FOR I ~ 0 STEP 1 UNTIL RKM DO 659000 IF ABS(ER[I] - V[I]) > R THEN 660000 BEGIN 661000 R ~ ABS(ER[I] - V[I]); 662000 B ~ I; 663000 END; 664000 WRITE(PRINTER,TK,RNAME[B+1],R); 665000 END; 666000 NR ~ 0; 667000 SU ~ 3333; 668000 FOR F ~ 0 STEP 1 UNTIL RK1 DO BH[F] ~ SU; 669000 RL ~ 0; 670000 SQ ~ 0; 671000 FLAG ~0; 672000 TOL1 ~ 0.0001; 673000 TOL3 ~ 0.000001; 674000 XX ~ 0; 675000 BBB ~ -1; 676000 DET ~ 1; 677000 FOR I ~ 0 STEP 1 UNTIL 40 DO 678000 U[I] ~ 9999; 679000 BL1 ~ BL2 ~ BL3 ~ FALSE; 680000 TW ~ 0; 681000 BL5 ~ TRUE; 682000 MAXE ~ 0; MINE ~ @+50; 683000 IF BOOL1 THEN 684000 COMMENT THE PROGRAM IS RESTARTED USING NECESSARY DATA 685000 PREVIOUSLY DUMPED AFTER THE END OF THE INPUT PROCEDURES ; 686000 BEGIN 687000 FILE IN TPR(1,1023); 688000 READ(TPR,11,RESTART[*]); 689000 IT ~ RESTART[1]; 690000 M ~ RESTART[2]; 691000 N ~ RESTART[3]; 692000 BBB ~ RESTART[4]; 693000 TOL1 ~ RESTART[7]; 694000 TOL2 ~ RESTART[8]; 695000 RKM ~ M - 1; 696000 FOR I ~ 0 STEP 1 UNTIL IT DO 697000 BEGIN 698000 A[I,0] ~ A[I,0]; 699000 READ(TPR,1023,A[I,*]); 700000 END; 701000 FOR I ~ 0 STEP 1 UNTIL IT DO 702000 BEGIN 703000 AI[I,0] ~ AI[I,0]; 704000 READ(TPR,1023,AI[I,*]); 705000 END; 706000 READ(TPR,RK1,TALLY[*]); 707000 READ(TPR,RK1,B[*]); 708000 READ(TPR,RK1,RNAME[*]); 709000 READ(TPR,RK2,W[*]); 710000 READ(TPR,RK2,CNAME[*]); 711000 READ(TPR,RK2,SCN[*]); 712000 BL2 ~ TRUE; 713000 END; 714000 READ(CARD[NO],ALPH,CONTROL); 715000 IF CONTROL = "RESUME" THEN 716000 COMMENT THE PROGRAM IS RESUMED AT THE POINT AT WHICH THE 717000 TRANSFORMATION VECTORS WERE LAST DUMPED ; 718000 BEGIN 719000 FILE IN TPX(1,1023); 720000 READ(CARD,ALPH,CONTROL); 721000 WRITE(PRINTER[DBL],CONT,CONTROL); 722000 READ(TPX,11,DUMPT[*]); 723000 K ~ DUMPT[1]; 724000 L ~ DUMPT[2]; 725000 CST ~ DUMPT[3]; 726000 NR ~ DUMPT[4]; 727000 TW ~ DUMPT[5]; 728000 RK1 ~ DUMPT[6]; 729000 RK2 ~ DUMPT[7]; 730000 TOL1 ~ DUMPT[8]; 731000 TOL2 ~ DUMPT[9]; 732000 READ(TPX,RK1,TALLY[*]); 733000 READ(TPX,RK1,B[*]); 734000 READ(TPX,RK1,BH[*]); 735000 READ(TPX,RK2,W[*]); 736000 READ(TPX,RK2,TE[*]); 737000 READ(TPX,RK2,SCN[*]); 738000 FOR I ~ 0 STEP 1 UNTIL K DO 739000 BEGIN 740000 E[I,0] ~ E[I,0]; 741000 READ(TPX,1023,E[I,*]); 742000 END; 743000 FOR I ~ 0 STEP 1 UNTIL K DO 744000 BEGIN 745000 EI[I,0] ~ EI[I,0]; 746000 READ(TPX,1023,EI[I,*]); 747000 END; 748000 BL3 ~ TRUE; 749000 END; 750000 IF BL2 THEN GO TO DUMP1; 751000 READ (CARD[NO],ALPH,CONTROL); 752000 IF CONTROL = "DELETE" THEN 753000 BEGIN 754000 LABEL M1; 755000 READ (CARD,ALPH,CONTROL); 756000 WRITE(PRINTER,CONT,CONTROL); 757000 M1: READ (CARD[NO],ALPH,CONTROL); 758000 IF CONTROL ! "END " THEN 759000 BEGIN 760000 READ (CARD,ALP,AC,AD); 761000 WRITE(PRINTER,FOF,AC,AD); 762000 IF AC = "ROW " THEN 763000 RJ[RL ~ RL + 1] ~ AD 764000 ELSE 765000 DC[SQ ~ SQ + 1] ~ AD; 766000 GO TO M1; 767000 END; 768000 READ(CARD,ALPH,CONTROL); 769000 WRITE(PRINTER[DBL]); 770000 END; 771000 BEGIN 772000 FILE OUT TAPE1 2(1,10); 773000 FORMAT INP(//"THE INPUT CONTROL CARD IS NOT PRESENT."), 774000 REA(/"READ DATA CONTROL CARD"/), 775000 REAE(/"READ DATA CONTROL CARD NOT PRESENT"); 776000 BOOLEAN BLA,BLB,BLC,BLD; 777000 BLA ~ BLB ~ BLC ~ BLD ~ FALSE; 778000 READ(CARD,CCI,AC,AD); 779000 IF AC = "INPUT " THEN 780000 BEGIN 781000 WRITE(PRINTER,CCO,AC,AD); 782000 IF AD = "CARD " THEN 783000 BLA ~ TRUE; 784000 END 785000 ELSE 786000 BEGIN 787000 WRITE(PRINTER,INP); 788000 GO TO STOP; 789000 END; 790000 READ(CARD[NO],CCI,AC,AD); 791000 IF AC = "PRINT " THEN 792000 BEGIN 793000 READ(CARD,CCI,AC,AD); 794000 IF AD = "PRINTE" THEN 795000 BEGIN 796000 WRITE(PRINTER,PRIN,AC); 797000 BLB ~ TRUE; 798000 END 799000 ELSE 800000 WRITE(PRINTER,CCO,AC,AD); 801000 DL ~ "PRINT "; 802000 END; 803000 READ(CARD[NO],CCI,AC,AD); 804000 IF AC = "WRITE " THEN 805000 BEGIN 806000 READ(CARD,CCI,AC,AD); 807000 IF AD = "PRINTE" THEN 808000 BEGIN 809000 WRITE(PRINTER,PRIN,AC); 810000 BLC ~ TRUE; 811000 END 812000 ELSE 813000 WRITE(PRINTER,CCO,AC,AD); 814000 RT ~ 1; 815000 END; 816000 READ(CARD,CCI,AC,AD); 817000 IF AC = "READ D" THEN 818000 WRITE(PRINTER,REA) 819000 ELSE 820000 BEGIN 821000 WRITE(PRINTER,REAE); 822000 GO TO STOP; 823000 END; 824000 IF BLA THEN 825000 BEGIN 826000 IF BLB THEN 827000 BEGIN 828000 RWID(CARD,PRINTER); 829000 MATRIXREAD(CARD,PRINTER); 830000 END 831000 ELSE 832000 BEGIN 833000 RWID(CARD,TAPE1); 834000 MATRIXREAD(CARD,TAPE1); 835000 END; 836000 END 837000 ELSE 838000 BEGIN 839000 FILE IN TAPEB(1,10); 840000 READ(CARD[NO],ALP,AC,AD); 841000 IF AC = "LOCATE" THEN 842000 BEGIN 843000 LABEL T; 844000 READ(CARD,ALP,AC,AD); 845000 T: READ(TAPEB,ALPH,CONTROL); 846000 IF CONTROL ! AD THEN 847000 GO TO T; 848000 END; 849000 IF BLB THEN 850000 BEGIN 851000 RWID(TAPEB,PRINTER); 852000 MATRIXREAD(TAPEB,PRINTER); 853000 END 854000 ELSE 855000 BEGIN 856000 RWID(TAPEB,TAPE1); 857000 MATRIXREAD(TAPEB,TAPE1); 858000 END; 859000 END; 860000 END; 861000 H ~ U[28]; 862000 IF M ! N THEN 863000 COMMENT THAT THE MATRIX IS NOT SQUARE WILL BE PRINTED AND THE 864000 PROGRAM WILL HALT. ; 865000 BEGIN 866000 WRITE (PRINTER,FO4); 867000 GO TO STOP; 868000 END; 869000 N ~ N + U[28]; 870000 TOL2 ~ ABS(MINE / MAXE); 871000 DUMP1: 872000 WRITE(PRINTER[DBL]); 873000 READ(CARD[NO],TO1,AC,R,S,RS); 874000 IF AC = "TOLERA" THEN 875000 BEGIN 876000 FORMAT TO2("TOLERANCES CONTROL CARD"/); 877000 READ(CARD,TO1,AC,R,S,RS); 878000 WRITE(PRINTER,TO2); 879000 TOL1 ~ R; 880000 TOL2 ~ S; 881000 TOL3 ~ RS; 882000 END; 883000 WRITE(PRINTER,TO3,TOL1,TOL2,TOL3); 884000 WRITE(PRINTER[DBL]); 885000 READ (CARD[NO],ALPH,CONTROL); 886000 IF CONTROL = "CHANGE" THEN 887000 COMMENT APPROPRIATE COEFFICIENT MATRIX ENTRIES ARE GIVEN 888000 NEW VALUES ; 889000 BEGIN 890000 LABEL RET; 891000 INTEGER RW,CLM; 892000 REAL VAL; 893000 READ(CARD,ALPH,CONTROL); 894000 WRITE(PRINTER,CONT,CONTROL); 895000 RET: READ(CARD,CH,AC,AD,VAL); 896000 IF AC ! "END " THEN 897000 BEGIN 898000 WRITE(PRINTER,PCH,AC,AD,VAL); 899000 FOR I ~ 1 STEP 1 UNTIL M DO 900000 IF RNAME[I] = AD THEN 901000 RW ~ I - 1; 902000 FOR I ~ 1 STEP 1 UNTIL N DO 903000 IF CNAME[I] = AC THEN 904000 CLM ~ I - 1; 905000 X ~ W[CLM].[35:3]; 906000 Y ~ W[CLM].[38:10]; 907000 XX ~ W[CLM+1].[35:3]; 908000 YY ~ W[CLM+1].[38:10] - 1; 909000 IF YY = -1 THEN XX ~ XX - 1; 910000 FOR I ~ X STEP 1 UNTIL XX DO 911000 FOR J ~ 0 STEP 1 WHILE (I!XX OR J{YY) AND J{1022 DO 912000 IF J}Y OR I!X THEN 913000 IF AI[I,J] = RW THEN 914000 A[I,J] ~ VAL; 915000 GO TO RET; 916000 END; 917000 WRITE(PRINTER[DBL]); 918000 END; 919000 RKM ~ M - 1; 920000 COMMENT THIS SECTION CHECKS TO FIND IF ANY COLUMN IS EMPTY. 921000 EMPTY MEANS THAT NO ENTRY IS LARGER THAN A TOLERANCE, 922000 TOL1. IF A COLUMN IS FOUND EMPTY THE NUMBER AND NAME 923000 OF THIS COLUMN WILL BE PRINTED AND THE PROGRAM WILL 924000 HALT. ; 925000 FOR I ~ 0 STEP 1 UNTIL RKM DO 926000 BEGIN 927000 F ~ 0; 928000 IT ~ W[I].[35:3]; 929000 INDEX ~ W[I].[38:10]; 930000 L ~ W[I+1].[38:10] - 1; 931000 IF L < INDEX THEN 932000 BEGIN 933000 K ~ IT + 1; 934000 FOR J ~ INDEX STEP 1 UNTIL 1022 DO 935000 IF ABS(A[IT,J]) > TOL1 THEN 936000 F ~ F + 1; 937000 FOR J~0 STEP 1 UNTIL L DO IF ABS(A[K,J]) > TOL1 THEN 938000 F ~ F + 1; 939000 END 940000 ELSE 941000 FOR J ~ INDEX STEP 1 UNTIL L DO 942000 IF ABS(A[IT,J]) > TOL1 THEN 943000 F ~ F + 1; 944000 IF F = 0 THEN 945000 BEGIN 946000 WRITE(PRINTER,FO11A); 947000 WRITE(PRINTER,CONT,CNAME[I+1]); 948000 GO TO STOP; 949000 END; 950000 END; 951000 FOR I ~ 0 STEP 1 UNTIL RKM DO 952000 TALLY[I] ~ 0; 953000 COMMENT THIS SECTION CHECKS TO FIND IF ANY ROW IS EMPTY. EMPTY 954000 MEANS THAT NO ENTRY IS LARGER THAN A TOLERANCE, TOL1. 955000 IF A ROW IS FOUND EMPTY, THE NUMBER AND NAME OF THIS ROW 956000 WILL BE PRINTED AND THE PROGRAM WILL HALT. THIS 957000 SECTION ALSO FINDS THE DENSITIES OF THE ROWS. ; 958000 BEGIN 959000 IT ~ W[M].[33:5]; 960000 INDEX ~ W[M].[38:10] - 1; 961000 IF INDEX = -1 THEN IT ~ IT - 1; 962000 FOR I ~ 0 STEP 1 UNTIL IT DO 963000 IF I ! IT THEN 964000 BEGIN 965000 FOR J ~ 0 STEP 1 UNTIL 1022 DO 966000 IF ABS(A[I,J]) > TOL1 THEN 967000 TALLY[AI[I,J]] ~ TALLY[AI[I,J]] + 1; 968000 END 969000 ELSE 970000 FOR J ~ 0 STEP 1 UNTIL INDEX DO 971000 IF ABS(A[I,J]) > TOL1 THEN 972000 TALLY[AI[IT,J]] ~ TALLY[AI[I,J]] + 1; 973000 FOR I ~ 0 STEP 1 UNTIL RKM DO 974000 IF TALLY[I] = 0 THEN 975000 BEGIN 976000 WRITE(PRINTER,FO11); 977000 WRITE(PRINTER,CONT,RNAME[I+1]); 978000 GO TO STOP; 979000 END; 980000 END; 981000 READ(CARD[NO],ALPH,CONTROL); 982000 IF CONTROL = "FACTOR" THEN 983000 COMMENT APPROPRIATE COLUMNS WILL BE MULTIPLIED BY THE GIVEN 984000 FACTORS. ; 985000 BEGIN 986000 LABEL REPSOL; 987000 FORMAT FR("THE SOLUTION FOR COLUMN ",A6," MUST BE MULTIPLIED BY", 988000 " @",I4," TO OBTAIN THE CORRECT RESULTS."/); 989000 READ(CARD,ALPH,CONTROL); 990000 WRITE(PRINTER[DBL],CONT,CONTROL); 991000 REPSOL: READ(CARD,FOT,CONTROL,Z,ZZ); 992000 IF CONTROL ! "END " THEN 993000 BEGIN 994000 FOR I ~ 1 STEP 1 UNTIL M DO 995000 IF CNAME[I] = CONTROL THEN 996000 BEGIN 997000 WRITE(PRINTER,FR,CNAME[I],Z); 998000 Q ~ W[I-1].[35:3]; 999000 R ~ W[I-1].[38:10]; 1000000 RS ~ W[I].[38:10] - 1; 1001000 IF RS}R THEN 1002000 FOR J ~ R STEP 1 UNTIL RS DO 1003000 A[Q,J] ~ A[Q,J] | 10*Z 1004000 ELSE 1005000 BEGIN 1006000 FOR J ~ R STEP 1 UNTIL 1022 DO 1007000 A[Q,J] ~ A[Q,J] | 10*Z; 1008000 FOR J ~ 0 STEP 1 UNTIL RS DO 1009000 A[Q+1,J] ~ A[Q+1,J] | 10*Z; 1010000 END; 1011000 GO TO REPSOL 1012000 END; 1013000 END; 1014000 END; 1015000 READ (CARD[NO],ALPH,CONTROL); 1016000 IF CONTROL = "RHS " THEN 1017000 COMMENT THE PROGRAM WILL SOLVE FOR ALL OF THE DESIRED RIGHT 1018000 HAND SIDES. IF THIS CONTROL CARD IS NOT PRESENT THE 1019000 PROGRAM WILL SOLVE THE EQUATIONS USING THE FIRST RIGHT 1020000 HAND SIDE. ; 1021000 BEGIN 1022000 READ(CARD,ALPH,CONTROL); 1023000 WRITE(PRINTER,CONT,CONTROL); 1024000 M7: READ (CARD[NO],ALPH,CONTROL); 1025000 IF CONTROL ! "END " THEN 1026000 BEGIN 1027000 READ(CARD,ALPH,RH[BBB ~ BBB + 1]); 1028000 WRITE(PRINTER,CONT2,RH[BBB]); 1029000 GO TO M7; 1030000 END 1031000 ELSE 1032000 READ(CARD,ALPH,CONTROL); 1033000 WRITE(PRINTER[DBL]); 1034000 END; 1035000 FOR I ~ 0 STEP 1 UNTIL RKM DO B[I] ~ 0; 1036000 IF BBB = -1 THEN 1037000 BEGIN 1038000 FLAG ~ 1; 1039000 UPDATE(M); 1040000 FOR I ~ 0 STEP 1 UNTIL RKM DO 1041000 B[I] ~ V[I]; 1042000 FLAG ~ 0; 1043000 AE ~ CNAME[M+1]; 1044000 END 1045000 ELSE 1046000 FOR I ~ M + 1 STEP 1 UNTIL N DO 1047000 IF CNAME[I] = RH[BBB] THEN 1048000 BEGIN 1049000 AE ~ CNAME[I]; 1050000 FLAG ~ 1; 1051000 UPDATE(I-1); 1052000 FOR F ~ 0 STEP 1 UNTIL RKM DO 1053000 B[F] ~ V[F]; 1054000 FLAG ~ 0; 1055000 I ~ N ; 1056000 END; 1057000 IF NOT BL2 THEN 1058000 BEGIN 1059000 COMMENT THE COLUMNS ARE SORTED BY THEIR DENSITIES. ; 1060000 FOR I ~ 1 STEP 1 UNTIL M DO 1061000 COUNT[I] ~ COUNT[I] + COUNT[I-1]; 1062000 FOR I ~ 0 STEP 1 UNTIL RKM DO 1063000 BEGIN 1064000 SCN[COUNT[CNO[I]]] ~ I; 1065000 COUNT[CNO[I]] ~ COUNT[CNO[I]] - 1; 1066000 END; 1067000 END; 1068000 READ(CARD[NO],ALPH,CONTROL); 1069000 IF CONTROL = "DUMP " THEN 1070000 COMMENT THE INITIALIZED MATRICES WILL BE DUMPED AT THIS POINT. ; 1071000 BEGIN 1072000 RESTART[1] ~ IT ~ W[N].[35:3]; 1073000 RESTART[2] ~ M; 1074000 RESTART[3] ~ N; 1075000 RESTART[4] ~ BBB; 1076000 RESTART[5] ~ RK1; 1077000 RESTART[6] ~ RK2; 1078000 RESTART[7] ~ TOL1; 1079000 RESTART[8] ~ TOL2; 1080000 WRITE(TPR,11,RESTART[*]); 1081000 FOR I ~ 0 STEP 1 UNTIL IT DO 1082000 BEGIN 1083000 A[I,0] ~ A[I,0]; 1084000 WRITE(TPR,1023,A[I,*]); 1085000 END; 1086000 FOR I ~ 0 STEP 1 UNTIL IT DO 1087000 BEGIN 1088000 AI[I,0] ~ AI[I,0]; 1089000 WRITE(TPR,1023,AI[I,*]); 1090000 END; 1091000 WRITE(TPR,RK1,TALLY[*]); 1092000 WRITE(TPR,RK1,B[*]); 1093000 WRITE(TPR,RK1,RNAME[*]); 1094000 WRITE(TPR,RK2,W[*]); 1095000 WRITE(TPR,RK2,CNAME[*]); 1096000 WRITE(TPR,RK2,SCN[*]); 1097000 READ(CARD,ALPH,CONTROL); 1098000 WRITE(PRINTER[DBL],CONT,CONTROL); 1099000 END; 1100000 READ(CARD[NO],FOT,CONTROL,FREQ); 1101000 IF CONTROL = "FREQUE" THEN 1102000 COMMENT THE TRANSFORMATION VECTORS WILL BE PERIODICALLY 1103000 DUMPED. ; 1104000 BEGIN 1105000 READ(CARD,FOT,CONTROL,FREQ); 1106000 WRITE(PRINTER,FRR,FREQ); 1107000 BL1 ~ TRUE; 1108000 END; 1109000 READ(CARD[NO],FOT,CONTROL,RS); 1110000 IF CONTROL = "MEMORY" THEN 1111000 BEGIN 1112000 READ(CARD,FOT,CONTROL,RS); 1113000 WRITE(PRINTER,MEM,RS); 1114000 MAXE ~ 16000 + (RS - 4) | 2000; 1115000 END 1116000 ELSE 1117000 MAXE ~ 24000; 1118000 BL4 ~ TRUE; 1119000 READ(CARD[NO],ALPH,CONTROL); 1120000 IF CONTROL = "INHIBI" THEN 1121000 BEGIN 1122000 READ(CARD,ALPH,CONTROL); 1123000 WRITE(PRINTER,INH); 1124000 BL4 ~ FALSE; 1125000 END; 1126000 AA ~ 0; 1127000 BOOL2 ~ FALSE; 1128000 READ(CARD[NO],ALPH,CONTROL); 1129000 IF CONTROL = "OUTPUT" THEN 1130000 COMMENT AFTER A COLUMN IS ENTERED A LINE OF OUTPUT WILL OCCUR. ; 1131000 BEGIN 1132000 READ(CARD,ALPH,CONTROL); 1133000 WRITE(PRINTER[DBL],CONT,CONTROL); 1134000 BOOL2 ~ TRUE; 1135000 END; 1136000 IF BOOL2 THEN 1137000 BEGIN 1138000 WRITE(PRINTER,IT1); 1139000 WRITE(PRINTER,IT2); 1140000 END; 1141000 ZEROTIME ~ TIME(1); 1142000 WRITE(PRINTER,TIM,0); 1143000 IF BL3 THEN GO TO ENT; 1144000 BEGIN 1145000 COMMENT THIS SECTION SEARCHES FOR A SUITABLE COLUMN FROM "A" TO 1146000 ENTER THE BASIS.; 1147000 CST ~ 0; 1148000 COMMENT HAVE ALL THE COLUMNS BEEN ENTERED. ; 1149000 ENT: IF NR = M THEN GO TO OUTPUT; 1150000 COMMENT HAVE ALL THE COLUMNS BEEN ENTERED THAT CAN BE BY THE 1151000 FIRST METHOD FOR SELECTING PIVOTS. ; 1152000 SEARCH: IF NR + TW = M THEN 1153000 COMMENT ATTEMPT TO ENTER THE REMAINING COLUMNS BY THE SECOND 1154000 METHOD OF SELECTING PIVOTS. ; 1155000 BEGIN 1156000 IF BL5 THEN 1157000 WRITE(PRINTER,RETO); 1158000 BL5 ~ FALSE; 1159000 FOR J ~ 0 STEP 1 UNTIL RKM DO 1160000 IF W[J].[25:10] ! 1023 THEN 1161000 BEGIN 1162000 FLAG ~ 1 ; 1163000 UPDATE(J); 1164000 FLAG ~ 0; 1165000 INDEX ~ J; 1166000 SUM ~ 0; IT ~ -1; 1167000 COMMENT FIND THE LARGEST AVAILABLE PIVOT. ; 1168000 FOR I ~ 0 STEP 1 UNTIL RKM DO 1169000 IF ABS(V[I]) > SUM AND BH[I] = SU THEN 1170000 BEGIN 1171000 SUM ~ ABS(V[I]); IT ~ I; 1172000 END; 1173000 COMMENT IF A PIVOT HAS NOT BEEN FOUND GO TO THE OUTPUT 1174000 SECTION. ; 1175000 IF IT = -1 THEN GO TO OUTPUT; 1176000 TW ~ TW - 1; 1177000 BH[IT] ~ J; 1178000 W[J].[25:10] ~ 1023; 1179000 GO TO TRAN; 1180000 END; 1181000 END; 1182000 CST ~ CST + 1; 1183000 COMMENT SELECT THE NEXT COLUMN FROM THE LIST OF SORTED COLUMNS. ; 1184000 J ~ SCN[CST]; 1185000 EXTRACT: X ~ W[J].[35:3]; 1186000 Y ~ W[J].[38:10]; 1187000 ENT1: INDEX ~ J; 1188000 COMMENT UPDATE THE SELECTED COLUMN. ; 1189000 UPDATE(J); 1190000 COMMENT ATTEMPT TO FIND A PIVOT ROW BY MAXIMIZING OVER THE 1191000 SET OF MINIMUM ROW DENSITIES FOR THE ROWS ORIGINALLY 1192000 PRESENT IN THE COEFFICIENT MATRIX. ; 1193000 IF X ! XX THEN 1194000 BEGIN 1195000 SUM ~ @+50; 1196000 IT ~ -1; 1197000 FOR I ~ Y STEP 1 UNTIL 1022 DO 1198000 BEGIN 1199000 RS ~ AI[X,I]; 1200000 IF BH[RS] = SU THEN 1201000 IF TALLY[RS] { SUM THEN 1202000 BEGIN 1203000 IF TALLY[RS] < SUM THEN 1204000 BEGIN 1205000 IT ~ RS; 1206000 TG ~ ABS(V[RS]); 1207000 SUM ~ TALLY[RS]; 1208000 END 1209000 ELSE 1210000 IF ABS(V[RS]) > TG THEN 1211000 BEGIN 1212000 TG ~ ABS(V[RS]); 1213000 IT ~ RS; 1214000 END; 1215000 END; 1216000 END; 1217000 FOR I ~ 0 STEP 1 UNTIL YY DO 1218000 BEGIN 1219000 RS ~ AI[XX,I]; 1220000 IF BH[RS] = SU THEN 1221000 IF TALLY[RS] { SUM THEN 1222000 BEGIN 1223000 IF TALLY[RS] < SUM THEN 1224000 BEGIN 1225000 IT ~ RS; 1226000 TG ~ ABS(V[RS]); 1227000 SUM ~ TALLY[RS]; 1228000 END 1229000 ELSE 1230000 IF ABS(V[RS]) > TG THEN 1231000 BEGIN 1232000 TG ~ ABS(V[RS]); 1233000 IT ~ RS; 1234000 END; 1235000 END; 1236000 END; 1237000 END 1238000 ELSE 1239000 BEGIN 1240000 SUM ~ @+50; 1241000 IT ~ -1; 1242000 FOR I ~ Y STEP 1 UNTIL YY DO 1243000 BEGIN 1244000 RS ~ AI[X,I]; 1245000 IF BH[RS] = SU THEN 1246000 IF TALLY[RS] { SUM THEN 1247000 BEGIN 1248000 IF TALLY[RS] < SUM THEN 1249000 BEGIN 1250000 IT ~ RS; 1251000 TG ~ ABS(V[RS]); 1252000 SUM ~ TALLY[RS]; 1253000 END 1254000 ELSE 1255000 IF ABS(V[RS]) > TG THEN 1256000 BEGIN 1257000 TG ~ ABS(V[RS]); 1258000 IT ~ RS; 1259000 END; 1260000 END; 1261000 END; 1262000 END; 1263000 IF TG < TOL2 THEN 1264000 COMMENT NO PIVOT WAS FOUND LARGER THAN A TOLERANCE, TOL2. ; 1265000 IT ~ -1; 1266000 IF IT = -1 THEN 1267000 BEGIN 1268000 SUM ~ @+50; 1269000 FOR I ~ 0 STEP 1 UNTIL RKM DO 1270000 IF ABS(V[I]) > TOL2 THEN 1271000 IF BH[I] = SU THEN 1272000 IF TALLY[I] { SUM THEN 1273000 BEGIN 1274000 IF TALLY[I] < SUM THEN 1275000 BEGIN 1276000 IT ~ I; 1277000 TG ~ ABS(V[I]); 1278000 SUM ~ TALLY[I]; 1279000 END 1280000 ELSE 1281000 IF ABS(V[I]) > TG THEN 1282000 BEGIN 1283000 TG ~ ABS(V[I]); 1284000 IT ~ I; 1285000 END; 1286000 END; 1287000 END; 1288000 IF IT = -1 THEN 1289000 COMMENT NO PIVOT WAS FOUND. BOOST THE COUNTER FOR ROWS SKIPPED 1290000 BY ONE. ; 1291000 BEGIN 1292000 TW ~ TW + 1; 1293000 GO TO SEARCH; 1294000 END; 1295000 COMMENT STORE THE COLUMN NUMBER IN THE ROW UPON WHICH IT 1296000 PIVOTED. ; 1297000 BH[IT] ~ INDEX; 1298000 COMMENT MARK THE COLUMN AS ENTERED. ; 1299000 W[J].[25:10] ~ 1023; 1300000 COMMENT DECREASE THE TALLY (ROW DENSITY) COUNT. ; 1301000 IF X ! XX THEN 1302000 BEGIN 1303000 FOR I ~ Y STEP 1 UNTIL 1022 DO 1304000 TALLY[AI[X,I]] ~ TALLY[AI[X,I]] - 1; 1305000 FOR I ~ 0 STEP 1 UNTIL YY DO 1306000 TALLY[AI[XX,I]] ~ TALLY[AI[XX,I]] - 1; 1307000 END 1308000 ELSE 1309000 FOR I ~ Y STEP 1 UNTIL YY DO 1310000 TALLY[AI[X,I]] ~ TALLY[AI[X,I]] - 1; 1311000 COMMENT FIND NEW TRANSFORMATION VECTOR,"E", AND UPDATE "B".; 1312000 TRAN: BEGIN 1313000 T1 ~ V[IT]; 1314000 V[IT] ~ -1; 1315000 T2 ~ B[IT]; 1316000 B[IT] ~ 0; 1317000 FOR I ~ 0 STEP 1 UNTIL RKM DO 1318000 BEGIN 1319000 V[I] ~ -V[I] / T1; 1320000 B[I] ~ T2 | V[I] + B[I]; 1321000 END; 1322000 COMMENT STORE "E","EI","TE".; 1323000 TE[NR].[23:10] ~ IT; 1324000 K ~ TE[NR].[33:5]; 1325000 L ~ TE[NR].[38:10]; 1326000 FOR I ~ 0 STEP 1 UNTIL RKM DO 1327000 IF ABS(V[I]) > TOL3 THEN 1328000 IF L ! 1023 THEN 1329000 BEGIN 1330000 E[K,L] ~ V[I]; 1331000 EI[K,L] ~ I; 1332000 L ~ L + 1; 1333000 END 1334000 ELSE 1335000 BEGIN 1336000 K ~ K+1; 1337000 L ~ 0; 1338000 I ~ I - 1; 1339000 END; 1340000 NR ~ NR + 1; 1341000 TE[NR].[33:5] ~ K; 1342000 TE[NR].[38:10] ~ L; 1343000 COMMENT THE NEXT SECTION WILL DUMP THE TRANSFORMATION VECTORS 1344000 AND OTHER DATA NEEDED TO RESUME EITHER AFTER 1345000 MULTIPLES OF 7 ROWS OF TRANSFORMATION VECTOR ENTRIES 1346000 HAVE BEEN GENERATED OR AT A GIVEN FREQUENCY. ; 1347000 IF K MOD 7 = 0 THEN 1348000 IF FREQ = 0 THEN 1349000 IF K ! 0 THEN 1350000 GO TO LL; 1351000 IF BL1 THEN 1352000 IF NR MOD FREQ = 0 THEN 1353000 LL: BEGIN 1354000 FILE OUT TPX 2(1,1023); 1355000 DUMPT[1] ~ K; 1356000 DUMPT[2] ~ L; 1357000 DUMPT[3] ~ CST; 1358000 DUMPT[4] ~ NR; 1359000 DUMPT[5] ~ TW; 1360000 DUMPT[6] ~ RK1; 1361000 DUMPT[7] ~ RK2; 1362000 DUMPT[8] ~ TOL1; 1363000 DUMPT[9] ~ TOL2; 1364000 WRITE(TPX,11,DUMPT[*]); 1365000 WRITE(TPX,RK1,TALLY[*]); 1366000 WRITE(TPX,RK1,B[*]); 1367000 WRITE(TPX,RK1,BH[*]); 1368000 WRITE(TPX,RK2,W[*]); 1369000 WRITE(TPX,RK2,TE[*]); 1370000 WRITE(TPX,RK2,SCN[*]); 1371000 FOR I ~ 0 STEP 1 UNTIL K DO 1372000 BEGIN 1373000 E[I,0] ~ E[I,0]; 1374000 WRITE(TPX,1023,E[I,*]); 1375000 END; 1376000 FOR I ~ 0 STEP 1 UNTIL K DO 1377000 BEGIN 1378000 EI[I,0] ~ EI[I,0]; 1379000 WRITE(TPX,1023,EI[I,*]); 1380000 END; 1381000 END; 1382000 IF BOOL2 THEN 1383000 COMMENT A LINE OF OUTPUT PER COLUMN ENTERED WAS REQUESTED. ; 1384000 WRITE(PRINTER,FIT,AA~AA+1,CNAME[INDEX+1],NR,TW, 1385000 RNAME[IT+1],IT+1,T1,1023|K+L); 1386000 IF BL4 THEN 1387000 IF 1023 | K + L + M > MAXE THEN 1388000 BEGIN 1389000 WRITE(PRINTER,OUTCORE); 1390000 GO TO STOP; 1391000 END; 1392000 GO TO ENT; 1393000 END; 1394000 COMMENT THE FOLLOWING SECTION CHECKS TO SEE IF THE COEFFICIENT 1395000 MATRIX IS SINGULAR. THE SOLUTION IS THEN PRINTED. ANY 1396000 OTHER SOLUTIONS ARE COMPUTED AND PRINTED IF REQUESTED. ; 1397000 OUTPUT: FOR I ~ 0 STEP 1 UNTIL RKM DO 1398000 IF BH[I] =SU THEN 1399000 COMMENT THE MATRIX WAS FOUND SINGULAR. A MESSAGE WILL BE PRINTED; 1400000 BEGIN 1401000 WRITE(PRINTER,FO2); 1402000 GO TO STOP; 1403000 END; 1404000 FOR J ~ 0 STEP 1 UNTIL RKM DO 1405000 V[BH[J]] ~ B[J]; 1406000 WRITE(PRINTER,TIM,(TIME(1) - ZEROTIME)/60); 1407000 COMMENT PRINT THE SOLUTION. ; 1408000 WRITE(PRINTER,FO1,AE); 1409000 WRITE(PRINTER,KK,FOR F~0 STEP 1 UNTIL RKM DO 1410000 [F+1,CNAME[F+1],V[F]]); 1411000 ERROR(V); 1412000 BBB ~ BBB - 1; 1413000 M8: IF BBB } 0 THEN 1414000 COMMENT SOLVE FOR AND PRINT ANY ADDITIONAL REQUESTED SOLUTIONS. ; 1415000 BEGIN 1416000 FOR I ~ 0 STEP 1 UNTIL RKM DO B[I] ~ 0; 1417000 FLAG ~ 1; 1418000 FOR I ~ M + 1 STEP 1 UNTIL N DO 1419000 IF CNAME[I] = RH[BBB] THEN 1420000 BEGIN 1421000 WRITE(PRINTER,FO1,CNAME[I]); 1422000 UPDATE(I-1); 1423000 FOR J ~ 0 STEP 1 UNTIL RKM DO 1424000 B[BH[J]] ~ V[J] ; 1425000 WRITE(PRINTER,KK,FOR F~0 STEP 1 UNTIL RKM DO 1426000 [F+1,CNAME[F+1],B[F]]); 1427000 ERROR(B); 1428000 BBB ~ BBB - 1; 1429000 GO TO M8; 1430000 END; 1431000 END; 1432000 END; 1433000 READ(CARD[NO],ALPH,CONTROL); 1434000 IF CONTROL = "ROWS O" THEN 1435000 COMMENT SOLVE FOR REQUESTED ROWS OF THE INVERSE. ; 1436000 PRICES; 1437000 END; 1438000 COMMENT IF THE "NEW PROBLEM" CONTROL CARD IS PRESENT THE PROGRAM 1439000 WILL RUN AGAIN EXPECTING ALL NECESSARY CONTROL CARDS AND 1440000 DATA TO IMMEDIATELY FOLLOW. ; 1441000 READ(CARD[NO],ALPH,CONTROL); 1442000 IF CONTROL = "NEW PR" THEN 1443000 BEGIN 1444000 FORMAT AN("*****",X43,"***** NEW PROBLEM. *****",X43,"*****"); 1445000 READ(CARD,ALPH,CONTROL); 1446000 WRITE(PRINTER[PAGE]); 1447000 WRITE(PRINTER,AN); 1448000 GO TO SS; 1449000 END; 1450000 WRITE(PRINTER[DBL]); 1451000 IF CONTROL = "CONCLU" THEN 1452000 WRITE(PRINTER,FO10) 1453000 ELSE 1454000 BEGIN 1455000 READ(CARD,AL,FOR I ~ 0 STEP 1 UNTIL 11 DO HEAD[I]); 1456000 WRITE(PRINTER,FOE,FOR I ~ 0 STEP 1 UNTIL 11 DO HEAD[I]); 1457000 END ; 1458000 GO TO STOP; 1459000 ENDPROGRAM: ; 1460000 STOP: END. 1461000