mirror of
https://github.com/pkimpel/retro-b5500.git
synced 2026-02-18 21:57:21 +00:00
258 lines
23 KiB
Plaintext
258 lines
23 KiB
Plaintext
% -ORTHO- TEST, 3/3/70 00000100120429PK
|
|
BEGIN 00000200
|
|
INTEGER STARTT; 00000300120429PK
|
|
FORMAT FT (//"DATE: "A6" PROC TIME: "F8.2" I/O TIME: "F8.2" ELAPSED: " 00000400120429PK
|
|
F8.2" SEC"); 00000500120429PK
|
|
INTEGER I, J, N, M, P, R, AI, AUI, ZEI, MUI; 00000600120429PK
|
|
REAL SUM, GMDT, FN; 00000700120429PK
|
|
FILE PARAMS (KIND=READER, DEPENDENTSPECS); 00000800120826PK
|
|
FILE FLUSH (KIND=PRINTER, MAXRECSIZE=132, FRAMESIZE=8, FILEUSE=OUT); 00000900120826PK
|
|
00001000120429PK
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00002000120429PK
|
|
PROCEDURE ORTHO (W, Y, Z, N, FN, M, P, R, AI, AUI, MUI, ZEI, X, DEV, 00003000
|
|
COF, STD, CV, VCV, GMDT, Q, Q2, E, EP, A, GF, ENF); 00004000
|
|
VALUE N, M, P, R, AI, AUI, MUI, ZEI; 00005000
|
|
REAL FN, GMDT; 00006000
|
|
REAL ARRAY STD, GF, W, ENF [1]; 00007000
|
|
REAL ARRAY Y, Z, X, DEV, COF, CV, Q, Q2, E, EP, A [1, 1]; 00008000
|
|
REAL ARRAY VCV [1, 1, 1]; 00009000
|
|
INTEGER N, M, P, R, AI, AUI, ZEI, MUI; 00010000
|
|
00011000120429PK
|
|
COMMENT 00012000
|
|
ORTHO IS TAKEN FROM ACM ALGORITHM 127 [COMM. ACM, VOL.5, 00013000
|
|
OCTOBER 1962, P. 511, AUTHOR: PHILIP J. WALSH]; 00014000
|
|
00015000120429PK
|
|
BEGIN 00016000
|
|
INTEGER NPP, NPM, M1, N2, M2, R1, RBAR, P2, BEI, RHI, I18, GAI, SII, I,00017000
|
|
J, DEI, NUI, E1Z2, E1Z1, K, THI, ALI, OMI, NII; 00018000
|
|
REAL ARRAY PK, XP [1:N+P], QK[1:M+1]; 00019000
|
|
REAL DENOM, SUM, DK2, DK, FI, SS, SSQ; 00020000
|
|
LABEL BOX1, AT1, AT2, BOX2, AU1, AU2, BOX3, BOX4, BOX5, BOX6, MU1, 00021000
|
|
MU2, BOX7, OM1, OM2, BOX8, DE1, BOX8A, BOX8B, DE2, BOX8C, BOX8D, 00022000
|
|
BOX9, TH1, TH2, TH3, BOX10, AL1, AL2, BOX11, NU1, NU2, BOX12, 00023000
|
|
BE1, BE2, BOX13, GA1, GA2, BOX14, RH1, ZE1, ZE2, RH2, SI1, SI2, 00024000
|
|
FINAL; 00025000
|
|
SWITCH AT:= AT1, AT2; SWITCH ZE:= ZE1, ZE2; 00026000120826PK
|
|
SWITCH AU:= AU1, AU2; SWITCH MU:= MU1, MU2; 00027000120826PK
|
|
SWITCH BE:= BE1, BE2; SWITCH RH:= RH1, RH2; SWITCH GA:= GA1, GA2; 00028000120826PK
|
|
SWITCH SI:= SI1, SI2; SWITCH DE:= DE1, DE2; SWITCH NU:= NU1, NU2; 00029000120826PK
|
|
SWITCH TH:= TH1, TH2, TH3; SWITCH AL:= AL1, AL2; 00030000120826PK
|
|
SWITCH OM:= OM1, OM2; 00031000120826PK
|
|
NPP:= N+P; NPM:= N+M; M1:= M-1; N2:= N+1; M2:= M+1; 00032000120826PK
|
|
R1:= 0; RBAR:= R; P2:= P+1; DENOM:= IF N=M THEN 1.0 00033000120826PK
|
|
ELSE SQRT(N-M); BEI:= RHI:= I18:= 1; 00034000120826PK
|
|
IF (P ^= 0) THEN GAI:= SII:= 2 ELSE GAI:= SII:= 1; 00035000120826PK
|
|
BOX1: GO TO AT[AI]; 00036000
|
|
AT1: FOR J:= 1 STEP 1 UNTIL N DO BEGIN 00037000120826PK
|
|
X[2,J]:= Z[1,J]; X[1,J]:= 1.0 END; 00038000120826PK
|
|
FOR I:= 2 STEP 1 UNTIL M1 DO BEGIN 00039000120826PK
|
|
FOR J:= 1 STEP 1 UNTIL N DO 00040000120826PK
|
|
X[I+1,J]:= X[I,J] * X[2,J] END; GO TO BOX2; 00041000120826PK
|
|
AT2: FOR I:= 1 STEP 1 UNTIL M DO BEGIN 00042000120826PK
|
|
FOR J:= 1 STEP 1 UNTIL N DO 00043000120826PK
|
|
X[I,J]:= Z[I,J] END; 00044000120826PK
|
|
BOX2: IF P = 0 THEN GO TO BOX3 ELSE GO TO AU[AUI]; 00045000
|
|
AU1: FOR I:= 1 STEP 1 UNTIL M DO BEGIN 00046000120826PK
|
|
FOR J:= N2 STEP 1 UNTIL NPP DO 00047000120826PK
|
|
X[I,J]:= 0.0; X[I,N+I]:= 1.0 END; GO TO BOX3; 00048000120826PK
|
|
AU2: FOR I:= 1 STEP 1 UNTIL M DO BEGIN 00049000120826PK
|
|
FOR J:= N2 STEP 1 UNTIL NPP DO 00050000120826PK
|
|
X[I,J]:= Z[I,J] END; 00051000120826PK
|
|
BOX3: DEI:= NUI:= E1Z1:= E1Z2:= K:= 1; 00052000120826PK
|
|
BOX4: THI:= 1; 00053000120826PK
|
|
BOX5: ALI:= OMI:= 1; IF P = 0 THEN GO TO BOX6 ELSE 00054000120826PK
|
|
FOR J:= 1 STEP 1 UNTIL P DO PK[N+J]:= 0.0; 00055000120826PK
|
|
BOX6: GO TO MU[MUI]; 00056000
|
|
MU1: FOR I:= 1 STEP 1 UNTIL N DO PK[I]:= X[K,I]; 00057000120826PK
|
|
GO TO BOX7; 00058000
|
|
MU2: FOR I:= 1 STEP 1 UNTIL N DO 00059000120826PK
|
|
PK[I]:= X[K,I] * W[I]; GO TO BOX7; 00060000120826PK
|
|
BOX7: GO TO OM[OMI]; 00061000
|
|
OM1: FOR I:= 1 STEP 1 UNTIL K DO BEGIN SUM:= 0.0; 00062000120826PK
|
|
FOR J:= 1 STEP 1 UNTIL NPP DO 00063000120826PK
|
|
SUM:= SUM + PK[J] * X[I,J]; QK[I]:= SUM END; 00064000120826PK
|
|
GO TO BOX8; 00065000
|
|
OM2: DK2:= 0.0; FOR I:= 1 STEP 1 UNTIL NPP DO 00066000120826PK
|
|
DK2:= DK2 + PK[I] * X[K,I]; 00067000120826PK
|
|
DK:= SQRT(DK2); 00068000120826PK
|
|
GF[I18]:= DK; I18:= I18 + 1; 00069000120826PK
|
|
FOR I:= 1 STEP 1 UNTIL NPP DO 00070000120826PK
|
|
X[K,I]:= X[K,I]/DK;; 00071000120826PK
|
|
OMI:= 1; GO TO BOX6; 00072000120826PK
|
|
BOX8: GO TO DE[DEI]; 00073000
|
|
DE1: E1Z1:= -E1Z1; IF E1Z1 < 0 THEN GO TO BOX8B ELSE 00074000120826PK
|
|
GO TO BOX8A; 00075000
|
|
BOX8A: FOR I:= 1 STEP 1 UNTIL K-1 DO 00076000120826PK
|
|
QK[I]:= -QK[I]; QK[K]:= 1.0; 00077000120826PK
|
|
FOR I:= 1 STEP 1 UNTIL NPP DO BEGIN 00078000120826PK
|
|
SUM:= 0.0; FOR J:= 1 STEP 1 UNTIL K DO 00079000120826PK
|
|
SUM:= SUM + X[J,I] * QK[J]; 00080000120826PK
|
|
XP[I]:= SUM END; GO TO BOX9; 00081000120826PK
|
|
BOX8B: ENF[I18]:= SQRT(QK[K]); GO TO BOX8A; 00082000120826PK
|
|
DE2: E1Z2:= -E1Z2; IF E1Z2 < 0 THEN GO TO BOX8C ELSE 00083000120826PK
|
|
GO TO BOX8A; 00084000
|
|
BOX8C: FOR I:= 1 STEP 1 UNTIL M DO BEGIN 00085000120826PK
|
|
Q[R1,I]:= QK[I]; Q2[R1,I]:= QK[I] * QK[I] END; 00086000120826PK
|
|
Q[R1,M2]:= QK[M2]; E[R1,1]:= Q[R1,M2] - Q2[R1,1]; 00087000120826PK
|
|
FOR J:= 2 STEP 1 UNTIL M DO 00088000120826PK
|
|
E[R1,J]:= E[R1,J-1] - Q2[R1,J]; 00089000120826PK
|
|
FI:= 1.0; 00090000120826PK
|
|
FOR I:= 1 STEP 1 UNTIL M DO BEGIN 00091000120826PK
|
|
IF (FN - FI) > 0.0 THEN BEGIN IF E[R1,I] < 0.0 THEN 00093000
|
|
BEGIN EP[R1,I]:= -SQRT(ABS(E[R1,I])/(FN - FI)); 00094000120826PK
|
|
GO TO BOX8D; END 00095000
|
|
ELSE EP[R1,I]:= SQRT(E[R1,I]/(FN - FI)); 00096000120826PK
|
|
GO TO BOX8D; END ELSE E[R1,I]:= -1.0; 00097000120826PK
|
|
BOX8D: FI:= FI + 1.0; END; GO TO BOX8A; 00098000120826PK
|
|
BOX9: GO TO TH[THI]; 00099000
|
|
TH1: FOR I:= 1 STEP 1 UNTIL NPP DO 00100000120826PK
|
|
X[K,I]:= XP[I]; GO TO BOX10; 00101000120826PK
|
|
TH2: FOR I:= 1 STEP 1 UNTIL N DO 00102000120826PK
|
|
DEV[R1,I]:= XP[I]; 00103000120826PK
|
|
FOR I:= 1 STEP 1 UNTIL P DO 00104000120826PK
|
|
COF[R1,I]:= -XP[N+I]; THI:= 3; GO TO TH1; 00105000120826PK
|
|
TH3: GO TO BOX11; 00106000
|
|
BOX10: GO TO AL[ALI]; 00107000
|
|
AL1: OMI:= ALI:= 2; GO TO BOX6; 00108000120826PK
|
|
AL2: IF K < M THEN BEGIN K:= K + 1; GO TO BOX4; END 00109000120826PK
|
|
ELSE GO TO BOX12; 00110000
|
|
BOX11: GO TO NU[NUI]; 00111000
|
|
NU1: NUI:= 2; GO TO BOX14; 00112000120826PK
|
|
NU2: SS:= DK/DENOM; SSQ:= SS * SS; 00113000120826PK
|
|
STD[R1]:= SS; GO TO BOX14; 00114000120826PK
|
|
BOX12: GO TO BE[BEI]; 00115000
|
|
BE1: FOR I:= 1 STEP 1 UNTIL M DO BEGIN 00116000120826PK
|
|
FOR J:= 1 STEP 1 UNTIL P DO 00117000120826PK
|
|
A[I,J]:= X[I,N+J] END; 00118000120826PK
|
|
GMDT:= 1.0; FOR I:= 1 STEP 1 UNTIL M DO 00119000120826PK
|
|
GMDT:= GMDT * (GF[I]/ENF[I]); 00120000120826PK
|
|
GMDT:= GMDT * GMDT; DEI:= BEI:= THI:= 2; 00121000120826PK
|
|
K:= K + 1; GO TO BOX13; 00122000120826PK
|
|
BE2: GO TO BOX11; 00123000
|
|
BOX13: GO TO GA[GAI]; 00124000
|
|
GA1: GO TO BOX11; 00125000
|
|
GA2: FOR I:= 1 STEP 1 UNTIL P DO BEGIN 00126000120826PK
|
|
FOR J:= I STEP 1 UNTIL P DO BEGIN 00127000120826PK
|
|
SUM:= 0.0; 00128000120826PK
|
|
FOR NII:= 1 STEP 1 UNTIL M DO 00129000120826PK
|
|
SUM:= SUM + A[NII,I] * A[NII,J]; 00130000120826PK
|
|
CV[I,J]:= SUM END END; 00131000120826PK
|
|
FOR I:= 1 STEP 1 UNTIL P DO 00132000120826PK
|
|
CV[P2,I]:= SQRT(CV[I,I]); GAI:= 1; GO TO BOX11; 00133000120826PK
|
|
BOX14: GO TO RH[RHI]; 00134000
|
|
RH1: IF RBAR = 0 THEN GO TO FINAL ELSE RBAR:= RBAR - 1; 00135000120826PK
|
|
R1:= R1 + 1; THI:= RHI:= 2; GO TO ZE[ZEI]; 00136000120826PK
|
|
ZE1: FOR I:= 1 STEP 1 UNTIL N DO 00137000120826PK
|
|
X[M2,I]:= Y[R1,I]; 00138000120826PK
|
|
FOR I:= 1 STEP 1 UNTIL P DO 00139000120826PK
|
|
X[M2,N+I]:= 0.0; GO TO BOX5; 00140000120826PK
|
|
ZE2: FOR I:= 1 STEP 1 UNTIL NPP DO 00141000120826PK
|
|
X[M2,I]:= Y[R1,I]; GO TO BOX5; 00142000120826PK
|
|
RH2: GO TO SI[SII]; 00143000
|
|
SI1: GO TO RH1; 00144000
|
|
SI2: FOR I:= 1 STEP 1 UNTIL P DO BEGIN 00145000120826PK
|
|
FOR J:= I STEP 1 UNTIL P DO 00146000120826PK
|
|
VCV[R1,I,J]:= SSQ * CV[I,J] END; 00147000120826PK
|
|
FOR I:= 1 STEP 1 UNTIL P DO 00148000120826PK
|
|
VCV[R1, P2, I]:= SS * CV[P2,I]; GO TO RH1; 00149000120826PK
|
|
FINAL: END ORTHO ; 00150000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00151000120429PK
|
|
00152000120429PK
|
|
PROCEDURE DUMP1 (CAPTION, A); 00800000120826PK
|
|
VALUE CAPTION; 00800100120826PK
|
|
ALPHA CAPTION; 00800200120826PK
|
|
ARRAY A[0]; 00800300120826PK
|
|
BEGIN 00800400120826PK
|
|
INTEGER 00800500120826PK
|
|
UB1, 00800600120826PK
|
|
X; 00800700120826PK
|
|
00800800120826PK
|
|
UB1:= SIZE(A)-1; 00800900120826PK
|
|
WRITE (FLUSH, <A6," = ">, CAPTION); 00801000120826PK
|
|
WRITE (FLUSH, <6E19.11>, 00801100120826PK
|
|
FOR X:= 0 STEP 1 UNTIL UB1 DO A[X]); 00801200120826PK
|
|
WRITE (FLUSH); 00801300120826PK
|
|
END DUMP1; 00801400120826PK
|
|
00810000120826PK
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00810100120826PK
|
|
PROCEDURE DUMP2 (CAPTION, A); 00810200120826PK
|
|
VALUE CAPTION; 00810300120826PK
|
|
ALPHA CAPTION; 00810400120826PK
|
|
ARRAY A[0,0]; 00810500120826PK
|
|
BEGIN 00810600120826PK
|
|
INTEGER 00810700120826PK
|
|
UB1, 00810800120826PK
|
|
UB2, 00810900120826PK
|
|
X, 00811000120826PK
|
|
Y; 00811100120826PK
|
|
00811200120826PK
|
|
UB1:= SIZE(A)-1; 00811300120826PK
|
|
WRITE (FLUSH, <A6," = ">, CAPTION); 00811400120826PK
|
|
FOR X:= 0 STEP 1 UNTIL UB1 DO 00811500120826PK
|
|
BEGIN 00811600120826PK
|
|
UB2:= SIZE(A[X,*])-1; 00811700120826PK
|
|
WRITE (FLUSH, <6E19.11>, 00811800120826PK
|
|
FOR Y:= 0 STEP 1 UNTIL UB2 DO A[X,Y]); 00811900120826PK
|
|
END FOR X; 00812000120826PK
|
|
WRITE (FLUSH); 00812100120826PK
|
|
END DUMP2; 00812200120826PK
|
|
00900000120826PK
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00900100120826PK
|
|
STARTT:= TIME(1); 00901000120826PK
|
|
%%READ (PARAMS, /, N, M, P); 00902000120826PK
|
|
%%CLOSE(PARAMS); 00903000120826PK
|
|
N:= 7; M:= 5; P:= 5; % PARAMETER VALUES ORIGINALLY READ IN 00903100120826PK
|
|
R:= 1; AI:= 2; AUI:= 1; 00904000120826PK
|
|
ZEI:= 1; MUI:= 2; FN:= N; 00905000120826PK
|
|
00906000120429PK
|
|
BEGIN %INNER BLOCK 00907000120429PK
|
|
LABEL DUMPIT; 00908000120429PK
|
|
REAL ARRAY W[1:N], Y[1:R, 1:N+P], Z[1:M, 1:N+P], 00909000120429PK
|
|
X[1:M+1, 1:N+P], DEV[1:R, 1:N], COF[1:R, 1:P], STD[1:R], 00910000120429PK
|
|
CV[1:P+1, 1:P], VCV[1:R, 1:P+1, 1:P], Q[1:R, 1:M+1], 00911000120429PK
|
|
Q2, E, EP [1:R, 1:M], A[1:M, 1:P], GF[1:M+R], ENF[1:M]; 00912000120429PK
|
|
%%DUMP FLUSH (N, M, P, R, AI, AUI, ZEI, MUI, 00913000120826PK
|
|
%% GMDT, FN, 00914000120826PK
|
|
%% W, Y, Z, X, DEV, COF, STD, CV, VCV, Q, Q2, A, GF, ENF, E, 00915000120826PK
|
|
%% EP) DUMPIT:1; 00916000120826PK
|
|
FOR I:= 1 STEP 1 UNTIL N DO 00917000120826PK
|
|
BEGIN 00918000120429PK
|
|
W[I]:= 1.0; SUM:= 0.0; 00919000120826PK
|
|
FOR J:= 1 STEP 1 UNTIL M DO 00920000120826PK
|
|
SUM:= SUM + J*(Z[J,I]:= I*J); 00921000120826PK
|
|
Y[1,I]:= SUM; 00922000120826PK
|
|
END; 00922500120430PK
|
|
ORTHO (W, Y, Z, N, FN, M, P, R, AI, AUI, MUI, ZEI, X, DEV, 00923000120429PK
|
|
COF, STD, CV, VCV, GMDT, Q, Q2, E, EP, A, GF, ENF); 00924000120429PK
|
|
00924500120430PK
|
|
WRITE(FLUSH, <"N = ",I13,/, 00924510120826PK
|
|
"M = ",I13,/, 00924520120826PK
|
|
"P = ",I13,/, 00924530120826PK
|
|
"R = ",I13,/, 00924540120826PK
|
|
"AI = ",I13,/, 00924550120826PK
|
|
"AUI = ",I13,/, 00924560120826PK
|
|
"ZEI = ",I13,/, 00924570120826PK
|
|
"MUI = ",I13,/, 00924580120826PK
|
|
"GMDT = ",E19.11,/, 00924590120826PK
|
|
"FN = ",E19.11,/>, 00924600120826PK
|
|
N, M, P, R, AI, AUI, ZEI, MUI, GMDT, FN); 00924610120826PK
|
|
DUMP1("W ", W); 00924620120826PK
|
|
DUMP2("Y ", Y); 00924630120826PK
|
|
DUMP2("Z ", Z); 00924640120826PK
|
|
DUMP2("X ", X); 00924650120826PK
|
|
DUMP2("DEV ", DEV); 00924660120826PK
|
|
DUMP2("COF ", COF); 00924670120826PK
|
|
DUMP1("STD ", STD); 00924680120826PK
|
|
DUMP2("CV ", CV); 00924690120826PK
|
|
DUMP2("VCV ", VCV[1,*,*]); 00924700120826PK
|
|
DUMP2("Q ", Q); 00924710120826PK
|
|
DUMP2("Q2 ", Q2); 00924720120826PK
|
|
DUMP2("A ", A); 00924730120826PK
|
|
DUMP1("GF ", GF); 00924740120826PK
|
|
DUMP1("ENF ", ENF); 00924750120826PK
|
|
DUMP2("E ", E); 00924760120826PK
|
|
DUMP2("EP ", EP); 00924770120826PK
|
|
DUMPIT: END INNER BLOCK; 00925000120429PK
|
|
WRITE(FLUSH, FT, TIME(0), TIME(2)/60, TIME(3)/60, (TIME(1)-STARTT)/60); 00926000120429PK
|
|
END. 00999000
|