|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 19968 (0x4e00)
Types: TextFile
Names: »nllfnctx«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦787c125fb⟧ »adjprocfile«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦787c125fb⟧ »adjprocfile«
└─⟦this⟧
; nll_reduction epu * page 1 5 12 78, 9.57;
; nll_fnc
; ********
nll_fnc = set 1 disc
nll_fnc = algol
external real procedure nll_fnc
_______________________________
_ (nlu, nlr, gen_catalog, SING, params);
zone nlr;
array nlu, SING, params;
integer array gen_catalog;
comment
nll_fnc (return, real)
the procedure operates on one datamatic block of normal equations
after CHOLESKY's method.
THe modes of operation are as follows:
1 : reduction of one block in part of a triangular array, i.e.
the block is first reduced with previously reduced blocks and
subsequently with itself.
2a: reduction of one or more right-hand sides
2b: back-solution of the right-hand sides (only implemented for
one rhs at present - and yet only in single precision.
nlu (call and return, array)
the unreduced block of normal equations stored in double precision
with the head in the first half of the array and the tails in the
last half. the first part of the head contains a catalogue
describing the block
byte content
2 the length of the array
4 sumcheck word
6 block no starting from 1 and upwards
8 - 1
10 first column no in block
12 last column no in block
14 relative byte addr of row no 0 in first col of block
16 - - - - - - - - secnd - - -
12+2*relcolnr_o rel byte addr of row no 0 il rel col no
12+2*last rel colno rel byte addr or row no 0 in last col
14+2*last_rel_col_no no of saved zeroes in fistr col
16+2*last rel col no of save
_ fields in nlu and nlr
_
byte name content
2 lng length of block
4 recsum sum of records
6 blocknr
8 sing
10 fc first col in block
12 lc last col in block
14 i1(fc) index of 1first row
16 i1(fc+1) index of first row
sz(fc) save d zeroes
_ sz(lc) saved zeroes
_ n first coeff of normals
\f
comment nll_reduction epu * page 2 5 12 78, 9.57
0 1 2 3 4 5 6 7 8 9 ;
comment
_
gen_catalog (call) general catalogue of the blocks
_
_ fields in gen cat:
gc_lc integer 1:blocks col no of last col in block
SING (array, return) bit pattern of sing
_ 1=sing, 0=not sing
params (call and return) array
parameters for control and information exchange
fields in params
byte nr type content
2 integer exp limit for sing action
4 integer max loss of exponent
8 real sqrt of red rhs scalar product
9 boolean true when rhs
10 boolean true when back solution
SING, exp limit, and maxloss are used only when the boolean in
byte 9 is true, and sqr rhs scalar product only when false;
\f
comment nll_reduction epu * page 3 5 12 78, 9.57
0 1 2 3 4 5 6 7 8 9 ;
begin
comment nll parameters;
real array field i1u, i1r;
integer array field cat_i1r, cat_i1u, cat_szr, cat_szu;
integer field lng_f, sum_f, block_f, sing_f, ctw_f,
_ dsp_f, fcol_f, lcol_f, explim_f, maxloss_f,
_ loss_f, res_f, rmax_f, grp_f;
real field KT;
integer r, s, t, u, fc, lc, fr, lr, fu, lu,
_ segs_pr_bl, block, neq_blocks, red_blocks,
_ rm1, szr, szu, min_szu, sing, sbt, spt,
_ maxloss, maxtest, expNI, explim, rmax,
_ fnc_gr, u1, r1, rhs_nmb;
real sum, NI;
boolean rhs, back_sol, fnc;
boolean field rhs_f, back_sol_f, fnc_f;
comment epu parameters;
zone epu(4*128, 1, nll_block);
integer array field word;
array field status_f;
integer add1, zadd1, zsub1, mla, zmla, mls, zmls, div1,
_ dia, chl, str1, sqr1, z, max_word,
_ code_length, save_prod_addr,
_ nlu_base, tail_displ,
_ nlr_base, nlr_file, nlr_block,
_ one_addr, fnc_addr;
real save_prod, one;
comment def of fields in params;
explim_f := 2;
maxloss_f := 4;
KT := 8;
rhs_f := 9;
back_sol_f := 10;
rmax_f := 12;
comment info from params;
rhs := params.rhs_f;
back_sol := params.back_sol_f;
comment def of initial fields in nl;
lng_f := 2;
sum_f := lng_f + 2;
block_f := sum_f + 2;
sing_f := block_f + 2;
dsp_f := sing_f + 2;
grp_f := dsp_f +2;
fcol_f := grp_f + 2;
lcol_f := fcol_f + 2;
\f
comment nll_reduction epu * page 4 5 12 78, 9.57
0 1 2 3 4 5 6 7 8 9 ;
_
comment def of cat and sz fields in nlu;
________________________________________
red_blocks := nlu.block_f - 1;
rhs_nmb := gen_catalog(red_blocks) + 1;
fu := nlu.fcol_f;
lu := nlu.lcol_f;
cat_i1u := lcol_f - 2*(fu - 1);
cat_szu := cat_i1u + 2*(lu - fu + 1);
status_f := cat_szu + 2*(lu - 2*fu + 2);
segs_pr_bl := nlu.lng_f//1024;
tail_displ := nlu.dsp_f;
fnc_gr := nlu.grp_f;
nlu_base := abs_addr(nlu);
rmax := params.rmax_f;
fnc := fnc_gr > 0;
comment temp storage for product sum;
save_prod_addr := abs_addr(save_prod);
comment def of params of nlr;
nlr_base := abs_addr(nlr);
getposition(nlr, nlr_file, nlr_block);
comment def of epu variables;
code_length := 4*4*128;
max_word := code_length - 30;
open(epu, 14, <:ympe:>, 55 shift 17);
outrec_6(epu, code_length);
comment epu instructions;
z := 1 shift 23;
add1 := 0 shift 12 + 1;
zadd1 := z + add1;
zsub1 := z + 1 shift 12 + 1;
mla := 2 shift 12 + 0;
zmla := 1 shift 23 + 2 shift 12 + 0;
mls := 3 shift 12 + 0;
zmls := z + mls;
str1 := 4 shift 12 + 1;
div1 := 5 shift 12 + 1;
sqr1 := 6 shift 12 + 1;
dia := 7 shift 12 + params.explim_f;
chl := 8 shift 12 + params.explim_f;
comment prepare blockskip;
minszu := (-1) shift (-1);
for t := fu step 1 until lu do
if nlu.cat_szu(t) < min_szu then
min_szu := nlu.cat_szu(t);
\f
comment nll_reduction epu * page 5 5 12 78, 9.57
0 1 2 3 4 5 6 7 8 9 ;
_
comment block loop;
___________________
for block := 0 step 1 until red_blocks do
if gen_catalog(block) > min_szu then
begin comment block prod feasible;
setposition(nlr, nlr_file, block*segsprbl + nlr_block);
invar(nlr);
word := 0;
fr := gen_catalog(block - 1) + 1;
lr := gen_catalog(block);
cat_i1r := lcol_f - 2*(fr - 1);
cat_szr := cat_i1r + 2*(lr - fr + 1);
for u := fu step 1 until lu do
begin comment reduce one column;
i1u := nlu.cat_i1u(u) + nlu_base;
szu := nlu.cat_szu(u) + 1;
for r := fr step 1 until lr do
if szu <= r then
begin comment scalar product;
i1r := nlr.cat_i1r(r) + nlr_base;
szr := nlr.cat_szr(r) + 1;
if szr < szu then szr := szu;
rm1 := r - szr;
szr := szr shift 2;
if r <= rmax then
begin comment complete reduction;
if rm1 <= 4095 then
epu.word( 1) := zmls + rm1
else
begin
epu.word( 1) := zmls + 4095;
epu.word( 2) := i1u + szr;
epu.word( 3) := i1r + szr;
epu.word( 4) := mls + rm1 - 4095;
szr := 4095 shift 2 + szr;
word := word + 6;
end;
epu.word(2) := i1u + szr;
epu.word(3) := i1r + szr;
epu.word(4) := chl;
epu.word(5) := nlu_base + status_f + u shift 2;
epu.word(6) := tail_displ;
word := word + 12;
end complete reduction
\f
<* nll_reduction epu * page 6 5 12 78, 9.57
0 1 2 3 4 5 6 7 8 9 *>
else
begin comment partial reduction;
rm1 := rm1 + 1 - r + rmax;
if rm1 > 0 then
begin
if rm1 <= 4095 then
epu.word( 1) := zmls + rm1
else
begin
epu.word( 1) := zmls + 4095;
epu.word( 2) := i1u + szr;
epu.word( 3) := i1r + szr;
epu.word( 4) := mls + rm1 - 4095;
szr := 4095 shift 2 + szr;
word := word + 6;
end;
epu.word(2) := i1u + szr;
epu.word(3) := i1r + szr;
epu.word(4) := add1;
epu.word(5) :=
epu.word(8) := i1u + r shift 2;
epu.word(6) :=
epu.word(9) := epu.word(5) + tail_displ;
epu.word(7) := str1;
word := word + 18;
end rm1 > 0;
end partial reduction;
if word > max_word then
to_epu(epu, word, code_length, false);
end scalar product;
end red of one col;
if word <> 0 then
to_epu(epu,word, code_length, false);
end block reduction;
\f
comment nll_reduction epu * page 7 5 12 78, 9.57
0 1 2 3 4 5 6 7 8 9 ;
_
comment autoreduction of block;
_______________________________
if -, (rhs or back_sol or fnc) then
begin
word := 0;
for u := fu step 1 until lu do
begin comment col of unred block;
i1u := nlu.cat_i1u(u) + nlu_base;
szu := nlu.cat_szu(u) + 1;
for r := fu step 1 until u do
if szu <= r then
begin comment scalar product;
i1r := nlu.cat_i1u(r) + nlu_base;
szr := nlu.cat_szu(r) + 1;
if szr < szu then szr := szu;
rm1 := r - szr;
szr := szr shift 2;
if r <= rmax then
begin comment complete reduction;
if rm1 <= 4095 then
epu.word( 1) := zmls + rm1
else
begin
epu.word( 1) := zmls + 4095;
epu.word( 2) := i1u + szr;
epu.word( 3) := i1r + szr;
epu.word( 4) := mls + rm1 - 4095;
szr := 4095 shift 2 + szr;
word := word + 6;
end;
epu.word(2) := i1u + szr;
epu.word(3) := i1r + szr;
epu.word(4) := chl;
epu.word(5) := nlu_base + status_f + u shift 2;
epu.word(6) := tail_displ;
word := word + 12;
end complete reduction
\f
<* nll_reduction epu * page 8 5 12 78, 9.57
0 1 2 3 4 5 6 7 8 9 *>
else
begin comment partial reduction;
rm1 := rm1 + 1 - r + rmax;
if rm1 > 0 then
begin
if rm1 <= 4095 then
epu.word( 1) := zmls + rm1
else
begin
epu.word( 1) := zmls + 4095;
epu.word( 2) := i1u + szr;
epu.word( 3) := i1r + szr;
epu.word( 4) := mls + rm1 - 4095;
szr := 4095 shift 2 + szr;
word := word + 6;
end;
epu.word(2) := i1u + szr;
epu.word(3) := i1r + szr;
epu.word(4) := add1;
epu.word(5) :=
epu.word(8) := i1u + r shift 2;
epu.word(6) :=
epu.word(9) := epu.word(5) + tail_displ;
epu.word(7) := str1;
word := word + 18;
end rm1 > 0;
end partial reduction;
if word > max_word then
to_epu(epu, word, code_length, false);
end scalar product;
end red of col;
\f
if word <> 0 then
to_epu(epu,word, code_length, false);
comment * page ;
comment test of exponent losses;
maxloss := params.maxloss_f;
sing := 0;
spt := (fu + 47)//48;
sbt := (fu - 1) mod 48;
if sbt <> 0 then
SING(spt) := SING(spt) shift (sbt - 48);
comment exp loss test loop;
for u := fu step 1 until lu do
begin
sbt := sbt + 1;
if sbt = 49 then
begin
sbt := 1;
spt := spt + 1;
end;
SING(spt) := SING(spt) shift 1;
if u <= rmax then
begin
loss_f := status_f + u shift 2;
res_f := loss_f - 2;
if nlu.loss_f > maxloss then
maxloss := nlu.loss_f;
if nlu.res_f > 2 then
begin
sing := sing + 1;
SING(spt) := SING(spt) add 1;
end;
end u<=rmax;
end u loop;
nlu.sing_f := sing;
SING(spt) := SING(spt) shift (48 - sbt);
params.maxloss_f := maxloss;
nll_fnc := maxloss;
end -, (rhs or back_sol)
\f
<* nll_reduction epu * page 10 5 12 78, 9.57
0 1 2 3 4 5 6 7 8 9 *>
else if rhs then
begin comment reduction of rhs;
max_word := code_length - 36;
word := 0;
save_prod_addr := absaddr(save_prod);
for u := fu step 1 until lu do
begin comment red of rhs cols;
i1u := nlu.cat_i1u(u) + nlu_base;
szu := nlu.cat_szu(u) + 1;
rm1 := u - szu;
szu := szu shift 2;
if fu - 1 <= rmax then
begin comment complete reduction of rhs;
if rm1 <= 4095 then
epu.word( 1) := zmls + rm1
else
begin
epu.word( 1) := zmls + 4095;
epu.word( 2) :=
epu.word( 3) := i1u + szu;
epu.word( 4) := mls + rm1 - 4095;
szu := 4095 shift 2 + szu;
word := word + 6;
end;
epu.word( 2) :=
epu.word( 3) := i1u + szu;
epu.word( 4) := sqr1;
epu.word( 5) := nlu_base + status_f + u shift 2;
epu.word( 7) := add1;
epu.word( 8) :=
epu.word(11) := i1u + u shift 2;
epu.word( 9) := epu.word(8) + tail_displ;
epu.word(10) := sqr1;
end complete reduction
else
\f
<* nll_reduction epu * page 11 5 12 78, 9.57
0 1 2 3 4 5 6 7 8 9 *>
begin comment partial reduction;
rm1 := rm1 - fu + 1 + rmax;
if rm1 > 0 then
begin
if rm1 <= 4095 then
epu.word( 1) := zmls + rm1
else
begin
epu.word( 1) := zmls + 4095;
epu.word( 2) :=
epu.word( 3) := i1u + szu;
epu.word( 4) := mls + rm1 - 4095;
szu := 4095 shift 2 + szu;
word := word + 6;
end;
epu.word(2) :=
epu.word(3) := i1u + szu;
epu.word(4) := add1;
epu.word(5) :=
epu.word(8) := i1u + u shift 2;
epu.word(6) :=
epu.word(9) := epu.word(5) + tail_displ;
epu.word(7) := str1;
word := word - 6;
end
else
word := word - 24;
end partial reduction;
word := word + 24;
if word > max_word then
to_epu(epu, word, code_length, false);
end u-control;
if word <> 0 then
to_epu(epu,word, code_length, false);
i1u := nlu.cat_i1u(fu);
nll_fnc :=
NI := nlu.i1u(fu);
\f
if fu - 1 <= rmax then
begin comment enp of first rhs col;
save_prod := nlu.status_f(fu);
params.KT := if NI > '-280 and save_prod > '-280 then
_ (mu*ln(NI/save_prod)) else (-'50);
end enp;
end rhs or back sol
\f
<* nll_reduction epu * page 13 5 12 78, 9.57
0 1 2 3 4 5 6 7 8 9 *>
else if fnc then
begin
one := 1.0;
one_addr := abs_addr(one);
word := 0;
for t := fu step fnc_gr until lu do
begin
for u := 0 step 1 until fnc_gr - 1 do
begin
i1_u := nlu.cat_i1u(t + u) + nlu_base;
sz_u := nlu.cat_szu(t + u) + 1;
fnc_addr := i1u + (t + u - szu + 1) shift 2;
for r := 0 step 1 until u do
if szu <= t + r then
begin
i1r := nlu.cat_i1u(t + r) + nlu_base;
szr := nlu.cat_szu(t + r) + 1;
if szr < szu then szr := szu;
rm1 := rhs_nmb - szr;
szr := szr shift 2;
if rm1 <= 4095 then
epu.word(1) := zmla + rm1
else
begin
epu.word(1) := zmla + 4095;
epu.word(2) := i1u + szr;
epu.word(3) := i1r + szr;
epu.word(4) := mla + rm1 - 4095;
szr := 4095 shift 2 + szr;
word := word + 6;
end;
epu.word(2) := i1u + szr;
epu.word(3) := i1r + szr;
epu.word(4) := div_1;
epu.word(5) := fnc_addr + r shift 2;
epu.word(6) := one_addr;
word := word + 12;
if word > max_word then
to_epu(epu, word, code_length, false);
end r-loop;
end u-loop;
end t-loop;
\f
if word <> 0 then
to_epu(epu,word, code_length, false);
end fnc ;
\f
comment nll_reduction epu * page 15 5 12 78, 9.57
0 1 2 3 4 5 6 7 8 9 ;
i1u := nlu.cat_i1u(fu);
comment removed later;
if back_sol then
begin comment back-solution of nlu;
if false then
begin
_
comment clear tail of rhs;
__________________________
t := 0;
for r := fu step 1 until lu do
t := t + r - nlu.cat_szu(r);
word := 0;
epu.word(1) := z + str_1 + (t - 1)//2;
write(out, nl, 1, <:antal clearede elem:>, t);
epu.word(2) := nlu.cat_i1u(fu) + nlu_base + tail_displ;
epu.word(3) := epu.word(2) + (t//2)*4;
word := 6;
epuprint(epu, 6);
write(out, nl, 1, <:nlu.lngf, nlubase tail displ i1u :>,
<<-ddddd>, nlu.lng_f, nlubase, taildispl, i1u, nl, 1, fu);
end;
for block := red_blocks step -1 until 0 do
begin
setposition(nlr, nlr_file, segs_pr_bl*block + nlr_block);
invar(nlr);
fr := gen_catalog(block - 1) + 1;
lr := gen_catalog(block);
word := 0;
cat_i1r := lcol_f - 2*(fr - 1);
cat_szr := cat_i1r + 2*(lr - fr +1);
for r := lr step -1 until fr do
begin
i1r := nlr.cat_i1r(r);
szr := nlr.cat_szr(r);
rm1 := r - 1;
NI := nlu.i1u(r) := nlu.i1u(r)/nlr.i1r(r);
for t := szr + 1 step 1 until rm1 do
nlu.i1u(t) := nlu.i1u(t) - NI*nlr.i1r(t);
end;
end back sol blocks;
end rhs red and back sol;
changerec_6(epu, 0);
close(epu, true);
end nll_fnc;
end
\f
; nll_reduction epu * page 16 5 12 78, 9.57;
if ok.no
mode warning.yes
if warning.yes
(mode 0.yes
message nll_fnc not ok
lookup nll_fnc)
end
finis
▶EOF◀