mirror of
https://github.com/retro-software/B5500-software.git
synced 2026-03-05 18:29:15 +00:00
1. Commit library tape images, directories, and extracted text files. 2. Commit additional utilities under Unisys-Emode-Tools.
1462 lines
116 KiB
Plaintext
1462 lines
116 KiB
Plaintext
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
|