DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦ea693f373⟧ TextFile

    Length: 19968 (0x4e00)
    Types: TextFile
    Names: »nllfnctx«

Derivation

└─⟦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⟧ 

TextFile



;       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◀