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

⟦678f13554⟧ TextFile

    Length: 19200 (0x4b00)
    Types: TextFile
    Names: »nlltranstx«

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_trans_tx          * page 1   23 01 79, 15.39;  

;  nll_trans
;  ******

if listing.yes
char nl ff nl

nll_trans = set 1

nll_trans = algol

external integer procedure nll_trans
___________________________________
_           (w_neq, dim, cond, new, cca, obs_count, sol);  
value              dim, cond, new,      obs_count, sol;  
array        w_neq;  
integer            dim, cond, new,      obs_count;  
integer array               cca;  
boolean                                     sol;  

comment

nll_trans             (return, integer proc)
service proc for orientation unknowns. the procedure has
a value equal to the array field value for the unknowns
in the array neq in the sol case. the value in the -, sol
case is irrelevant.

neq                (array, return)
work array of length at least 1 : (unk+1)*(unk+2)//2+1.
the array needs no initialization and should not be a
fielded array. the content becomes the upper triangular 
CHOLESKY matrix, and when sol is true also the solutions, 
fielded by the value of nll_trans.

unk                 (call, integer)
the number of unknowns

cca                 (call, integer array)
the abs addr of the first elements in each col of obs-eq incl.
the rhs. the last is not used in the -, sol case, but then  
cca(0)      = first oc coeff in obs-eq coeff, 
cca(unk+2)  = first coord col addr in the array pointed by cca
_             the cols must be consecutive
cca(unk+3)  = coord_pr_stat
cca(unk+4)  = eq_pr_stat

obs_count           (call, integer)
the number of obs_eq (mostly observations*eq_pr_stat)

epu                 (call and return, zone)
a zone buffer opened to the epu and after an outrec_6 of the
full buffer length. the zone is left in the same state. the
zone should have not less than 4*24 bytes.

epu_lng             (call, integer)
the zone buffer length in bytes

sol                (call, boolean)
true when the orientation unknowns are computed and false
when their cholesky reduction is done

\f



comment nll_trans_tx          * page 2   23 01 79, 15.39
0 1 2 3 4 5 6 7 8 9 ;  

comment
_
ext. used
__________
abs_addr

Prog: Knud Poder, 19 FEB 1978

GI_nr: 78010

;  

begin

integer                  t, t1, t2, t3, unk, row, col, 
_                        dim_1, save_col, coef_max, 
_                        t_coef, t_cond, t_rhs, 
_                        t_frst, t_last, ccf, cxf, 
_                        neq_addr, neq_step, neq_disp, 
_                        neq_tail, neq_max, 
_                        NEQ_addr, NEQ_disp, 
_                        zero_addr, 
_                        coef_pnt, coef_step, status_addr, 
_                        epu_lng, epu_max, 
_                        cca_disp, cca_step, cca_max, 
_                        zmla, epu_op_1, epu_op_2, 
_                        add_1, str_1, zmls, zmls_1, mls, mla, 
_                        zmla_obs_count, mls_m1, z_mls_m1, 
_                        zadd_1, chl_30, chl_op;  

real                     status, zero;  

array                    neq(1:(dim+cond+2)*(dim+cond+1)//2
_                              + (dim+1)*(dim-1)*cond
_                              + 2*dim*new*(dim*(dim+1)+cond));  

integer array            cwa(1:dim+cond+new*dim+3), 
_                        col_addr, col_index(dim+cond+3:
_                                    new*dim+dim+cond+3), 
_                        cxa(1:dim+1);  

boolean                  rhs, not_transp;  

zone                     epu(512, 1, nll_block);  

integer array field      word, cat_f, x_ref;  

_
comment unknowns and conditions;  
________________________________
dim_1   :=
t_coef  := dim + 1;  
unk     := dim*dim_1;  
t_cond  := t_coef + cond;  
t_rhs   := t_cond + 1;  
epu_lng := 4*512;  comment gris;  
epu_max := epu_lng - 48;  

_
comment connect epu;  
____________________
open(epu, 14, <:ympe:>, 55 shift 17);  
outrec_6(epu, epu_lng);  
word := 0;  

\f



comment nll_trans_tx          * page 3   23 01 79, 15.39
0 1 2 3 4 5 6 7 8 9 ;  

_
comment epu-instr;  
__________________
zadd_1         := 1 shift 23 + 0 shift 12 +  1;  
add_1          := 0 shift 23 + 0 shift 12 +  1;  
mla            := 0 shift 23 + 2 shift 12 +  0;  
zmla           := 1 shift 23 + 2 shift 12 +  0;  
zmla_obs_count := 1 shift 23 + 2 shift 12 +  obs_count;  
mls            := 0 shift 23 + 3 shift 12 +  0;  
zmls           := 1 shift 23 + 3 shift 12 +  0;  
zmls_1         := 1 shift 23 + 3 shift 12 +  1;  
mls_m1         := 0 shift 23 + 3 shift 12 -  1;  
z_mls_m1       := 1 shift 23 + 3 shift 12 -  1;  
chl_30         := 0 shift 23 + 8 shift 12 + 30;  
str_1          := 0 shift 23 + 4 shift 12 +  1;  

_
comment abs_addresses;  
______________________
zero_addr   := abs_addr(zero);  
zero        := 0.0;  
cwa(t_rhs)  := abs_addr(w_neq) + 4;  
status_addr := cwa(t_rhs) + 4*(unk + cond);  
cwa(1)      := abs_addr(neq) + 4;  
t1          := t_rhs - 2;  
for t := 1 step 1 until t1 do
begin
  cwa(t+1) := cwa(t) + 4*t;  
  if t > t_coef then
  cwa(t+1) := cwa(t+1) + 4*dim_1*(dim - 1);  
end;  
comment
if fp_mode(3) then
for t := 1 step 1 until t_rhs do
write(out, nl, 1, <<ddddddd>, t, cwa(t));  

_
comment reduction of normals;  
_____________________________

_
comment clear orientation normals;  
__________________________________
for t := (dim_1 + cond + 1)*(dim_1 + cond)//2
_        + dim_1*(dim - 1)*cond
_        + 2*dim*new*(unk + cond) step -1 until 1 do
_        neq(t) := 0.0;  

for t := unk + dim_1 + 2*cond + 1 step -1 until 0 do
_        w_neq(t) := 0;  

\f



comment nll_trans_tx          * page 4   23 01 79, 15.39
0 1 2 3 4 5 6 7 8 9 ;  

_
comment coef matrix;  
____________________
for t := 1 step 1 until t_coef do
begin
  for t1 := 1 step 1 until t do
  begin
    epu.word(1) := zmla_obs_count;  
    epu.word(2) := cca(t);  
    epu.word(3) := cca(t1);  
    epu.word(4) := mls_m1 + t1;  
    epu.word(5) := cwa(t);  
    epu.word(6) := cwa(t1);  
    epu.word(7) := chl_30;  
    epu.word(8) := status_addr + t shift 2;  
    epu.word(9) := 0;  
    word        := word + 18;  
    if word > epu_max then
    to_epu(epu, word, epu_lng, false);  
  end t1-loop;  
end t-loop;  

\f



comment nll_trans_tx          * page 5   23 01 79, 15.39
0 1 2 3 4 5 6 7 8 9 ;  

_
comment init pointers;  
______________________
cca_step  := 4*obs_count;  
cca_disp  := - cca_step;  
coef_step := 4*(dim + 1);  
coef_max  := coef_step*(dim - 1);  

_
comment cond and rhs col;  
_________________________
for coef_pnt := 0 step coef_step until coef_max do
begin
  cca_disp := cca_disp + cca_step;  
  for t := t_coef + 1 step 1 until t_rhs do
  begin
    rhs := t = t_rhs;  
    for t1 := 1 step 1 until t_coef do
    begin
      if rhs then
      begin
        epu.word(1) := zmla_obs_count;  
        epu.word(2) := cca(t) + cca_disp;  
        epu.word(3) := cca(t1);  
      end
      else
      begin
        epu.word(1) := zadd_1;  
        epu.word(2) := cca(t) + coef_pnt + (t1-1) shift 2;  
        epu.word(3) := zero_addr;  
      end;  
      epu.word(4) := mls_m1 + t1;  
      epu.word(5) := cwa(t) + coef_pnt;  
      epu.word(6) := cwa(t1);  
      epu.word(7) := chl_30;  
      epu.word(8) :=   
      epu.word(9) := 0;  
      word        := word + 18;  
      if word > epu_max then
      to_epu(epu, word, epu_lng, false);  
    end t1-loop;  
  end t-loop;  
end gp-loop;  

\f



comment nll_trans_tx          * page 6   23 01 79, 15.39
0 1 2 3 4 5 6 7 8 9 ;  

_
comment epu-op for auto-red;  
____________________________
epu_op_1 := zmla + unk;  
epu_op_2 := mls_m1;  
chl_op   := chl_30;  

_
comment cond and rhs auto-red;  
______________________________
for t := t_coef + 1 step 1 until t_rhs do
begin
  rhs := t = t_rhs;  
  for t1 := t_coef + 1 step 1 until t do
  begin
    if t1 = t_rhs then
    begin
      epu.word(1) := zmla + dim*obs_count;  
      epu.word(2) := cca(t);  
      epu.word(3) := cca(t1);  
      word        := word + 6;  
      epu_op_1    := mls + unk;  
      epu_op_2    := mla - 1;  
      chl_op      := chl_30 + 70;  
    end  
    else if rhs then
    begin
      epu.word(1) := zadd_1;  
      epu.word(2) := cca(t1) + unk shift 2;  
      epu.word(3) := zero_addr;  
      word        := word + 6;  
      epu_op_1    := mla + unk;  
      epu_op_2    := mls_m1;  
    end;  
    epu.word(1) := epu_op_1;  
    epu.word(2) := cwa(t);  
    epu.word(3) := cwa(t1);  
    epu.word(4) := epu_op_2 + t1 - t_coef;  
    epu.word(5) := cwa(t) + unk shift 2;  
    epu.word(6) := cwa(t1) + unk shift 2;  
    epu.word(7) := chl_op;  
    epu.word(8) := status_addr + t shift 2;  
    epu.word(9) := 0;  
    word        := word + 18;  
    if word > epu_max then
    to_epu(epu, word, epu_lng, false);  

  end t1-loop;  

end t-loop;  

chl_op := chl_30;  

\f



comment nll_trans_tx          * page 7   23 01 79, 15.39
0 1 2 3 4 5 6 7 8 9 ;  

_
comment start epu;  
__________________
if word <> 0 then
to_epu(epu, word, epu_lng, false);  

<*
if fp_mode(3) then
begin
  write(out, nl, 3, <:normallign:>, nl, 1);  
  t1 := hlm_array(dim, cond);  
  for t := 1 step 1 until t1 do
  write(out, nl, if t mod 5 = 1 then 1 else 0, 
  <<__-d.dd'-ddd>, neq(t));  
end;  
*>

comment w_neq skal kun  være unk + dim1 +2*cond + 1;  

comment
for t := 1 step 1 until dim1+cond + 1 do
write(out, nl, 1, <<dddddddddd>, t, t+unk+cond+1, 
(w_neq(t+unk+cond+1) shift (-24))extract 24, 
w_neq(t+unk+cond+1) extract 24);  

_
comment back-sol of normals;  
____________________________
if sol then
begin

  row := unk + cond;  
  col := (dim_1 + cond + 1)*(dim_1 + cond)//2
  _      + dim_1*(dim - 1)*cond + 1;  

  _
  comment enp and variance;  
  _________________________
  status := 0.0;  
  for t := 1 step 1 until unk do
  status := status + w_neq(t)**2;  
  for t := unk + 1 step 1 until row do
  status := status - w_neq(t)**2;  

  row    := row + 1;  
  status := sqrt(abs status);  
  if w_neq(row) <'-50 then w_neq(row) := '-50;  
  if status < '-20*w_neq(row) then
  status := '-20*w_neq(row);  
  w_neq(0) := mu*ln(w_neq(row)/status);  

  nll_trans := w_neq(row);  

\f



comment nll_trans_tx          * page 8   23 01 79, 15.39
0 1 2 3 4 5 6 7 8 9 ;  

  _
  comment back-sol of correlates;  
  _______________________________
  t := unk + cond;  
  for t2 := 1 step 1 until cond do
  begin
    row        := row - 1;  
    col        := col - 1;  
    w_neq(row) := w_neq(row)/neq(col);  

    t := t - 1;  
    for t1 := 1 step 1 until t do
    begin
      col           := col - 1;  
      w_neq(row-t1) := w_neq(row-t1) - w_neq(row)*neq(col);  
    end t1-loop;  
  end t2-loop;  

  _
  comment back-sol of elements;  
  _____________________________
  save_col := col;  
  for t3 := 1 step 1 until dim do
  begin
    col := save_col;  
    for t := dim step -1 until 0 do
    begin
      row      := row - 1;  
      col      := col - 1;  
      w_neq(row) := w_neq(row)/neq(col);  

      for t1 := 1 step 1 until t do
      begin
        col           := col - 1;  
        w_neq(row-t1) := w_neq(row-t1) - w_neq(row)*neq(col);  
      end t1-loop;  
    end t-loop;  
  end t2-loop;  

end sol-clause

<*reduce coef of unknown points*>
_______________________________
else if new > 0 then
begin

  t_frst := t_rhs + 1;  
  t_last := t_rhs + new*dim;  

  t1          := 4*(unk + cond);  
  cwa(t_frst) := cwa(t_rhs-1) + t1;  
  for t:= t_frst + 1 step 1 until t_last do
  cwa(t) := cwa(t-1) + t1;  
\f



comment nll_trans_tx          * page 9   23 01 79, 15.39
0 1 2 3 4 5 6 7 8 9 ;  

  <*
  if fp_mode(5) then
  begin
    write(out, nl, 1, <:addr af new-cols:>, nl, 1);  
    for t := 1 step 1 until t_last do
    write(out, nl, 1, <<-ddddddd>, t, cwa(t));  
  end;  
*>

  _
  comment set catalogue of unkn points matrix;  
  ____________________________________________
  cat_f      := 2*(dim_1 + cond + 1);  
  x_ref      := cat_f + 2*obs_count;  
  neq_tail   := 4*new*dim*(unk + cond);  
  neq_step   := 4*dim_1;  
  neq_max    := neq_step*(dim - 1);  
  NEQ_addr := cca( 0);  
  NEQ_disp := cca(-1);  

  for t := 1 step 1 until obs_count do
  begin
    comment
    if fp_mode(5) then
    write(out, nl, 2, <:col xno xref    :>, cca.cat_f(t), cca.x_ref(t));  
    if cca.cat_f(t) >= 0 then
    begin
      ccf := cca.cat_f(t)*dim;  
      cxf := cca.x_ref(t)*dim + t_frst;  

      for t1 := 1 step 1 until dim do
      begin
        ccf            := ccf + 1;  
        row            :=
        col_index(cxf) := 4*ccf;  
        col            :=
        col_addr(cxf)  := NEQ_addr + 2*(ccf - 1)*ccf;  
        cxa(t1)        := cwa(cxf);  
        cxf            := cxf + 1;  
  comment
        if fp_mode(5) then
        write(out, nl, 1, <:NEQcol,addr, index :>, <<-dddddddd>, 
        cxf-1, col_addr(cxf-1), col_index(cxf-1)//4);  

        _
        comment rhs in NEQ;  
        ___________________
        epu.word(1) := zmls_1;  
        epu.word(2) := cca(1) + (t-1) shift 2;  
        epu.word(3) := cca(t_rhs) + (t-1) shift 2
        _              + (t1-1)*4*obs_count;  
        epu.word(4) := add_1;  
        epu.word(5) :=
        epu.word(8) := NEQ_addr + 2*(new*dim+1)*(new*dim) + row;  
        epu.word(6) := 
        epu.word(9) := epu.word(5) + NEQ_disp;  
        epu.word(7) := str_1;  
        word        := word + 18;  

\f



comment nll_trans_tx          * page 10   23 01 79, 15.39
0 1 2 3 4 5 6 7 8 9 ;  

        _
        comment dia-elem in NEQ;  
        ________________________
        epu.word(1) := zmla + 1;  
        epu.word(2) :=
        epu.word(3) := cca(1) + (t-1) shift 2;  
        epu.word(4) := add_1;  
        epu.word(5) := 
        epu.word(8) := col + row;  
        epu.word(6) :=
        epu.word(9) := epu.word(5) + NEQ_disp;  
        epu.word(7) := str_1;  
        word        := word + 18;  
        if word > epu_max then
        to_epu(epu, word, epu_lng, false);  

      end t1-loop;  

      _
      comment load coef from obs_eq;  
      ______________________________
      t2 := 0;  
      for neq_disp := 0 step neq_step until neq_max do
      begin
        t2 := t2 + 1;  
        for t1 := 0 step 1 until dim do
        begin
          epu.word(1) := zmls_1;  
          epu.word(2) := cca(1)    + (t-1) shift 2;  
          epu.word(3) := cca(t1+1) + (t-1) shift 2;  
          epu.word(4) := add_1;  
          epu.word(5) :=
          epu.word(8) := cxa(t2) + t1 shift 2
          _              + neq_disp;  
          epu.word(6) :=
          epu.word(9) := epu.word(5) + neq_tail;  
          epu.word(7) := str_1;  
          word        := word + 18;  
          if word > epu_max then
          to_epu(epu, word, epu_lng, false);  

        end  t1-loop;  

      end neq_disp_loop;  

    end cca.cat_f-clause;  

  end t-loop;  

\f



comment nll_trans_tx          * page 11   23 01 79, 15.39
0 1 2 3 4 5 6 7 8 9 ;  

  _
  comment include rhs;  
  ____________________
  t_last            := t_last + 1;  
  cwa(t_last)       := cwa(t_rhs);  
  col_addr(t_last)  := NEQ_addr + 2*(new*dim+1)*new*dim;  
  col_index(t_last) := 4*(new*dim + 1);  

  _
  comment insert variance;  
  ________________________
  epu.word(1) := zmla + dim*obs_count;  
  epu.word(2) :=
  epu.word(3) := cca(t_rhs);  
  epu.word(4) := add_1;  
  epu.word(5) :=
  epu.word(8) := col_addr(t_last) + col_index(t_last);  
  epu.word(6) :=
  epu.word(9) := epu.word(5) + NEQ_disp;  
  epu.word(7) := str_1;  
  word        := word + 18;  
  if word > epu_max then
  to_epu(epu, word, epu_lng, false);  

  _
  comment disp of first triang part;  
  __________________________________
  cca_step := 4*dim_1;  
  cca_max  := cca_step*dim;  
  cca_disp := 0;  

  _
  comment loop over all columns of new;  
  _____________________________________
  for col := t_frst step 1 until t_last do
  begin

    if col < t_last then
    <*skip rhs*>
    begin

      _
      comment first triang part;  
      __________________________
      for t1 := 1 step 1 until t_coef do
      begin
        epu.word(1) := z_mls_m1 + t1;  
        epu.word(2) := cwa(col) + cca_disp;  
        epu.word(3) := cwa(t1);  
        epu.word(4) := chl_30;  
        epu.word(5) := status_addr;  
        epu.word(6) := neq_tail;  
        word        := word + 12;  
        if word > epu_max then
        to_epu(epu, word, epu_lng, false);  
      end t1-loop;  

      _
      comment move oc-array pointer;  
      ______________________________
      cca_disp  := (cca_disp  + cca_step) mod cca_max;  

\f



comment nll_trans_tx          * page 12   23 01 79, 15.39
0 1 2 3 4 5 6 7 8 9 ;  

      _
      comment reduce with condition submatrix;  
      ________________________________________
      for t1 := t_coef + 1 step 1 until t_cond do
      begin
        epu.word(1) := zmla + unk;  
        epu.word(2) := cwa(col);  
        epu.word(3) := cwa(t1);  
        epu.word(4) := mlsm1 + t1 - t_coef;  
        epu.word(5) := epu.word(2) + unk shift 2;  
        epu.word(6) := epu.word(3) + unk shift 2;  
        epu.word(7) := chl30;  
        epu.word(8) := status_addr;  
        epu.word(9) := neq_tail;  
        word        := word + 18;  
        if word > epu_max then
        to_epu(epu, word, epu_lng, false);  
      end t1-loop;  

    end skip rhs-clause;  

\f



comment nll_trans_tx          * page 13   23 01 79, 15.39
0 1 2 3 4 5 6 7 8 9 ;  

    _
    comment autoreduction of new-cols;  
    __________________________________
    for t := t_frst step 1 until col do
    begin
      not_transp   := col_index(col) >= col_index(t);  
      comment
      if fp_mode(5) then
      write(out, nl, 1, <:col,t,coladdr,colindex,taddr,tindex:>, 
      nl, 1, <<-ddddddd>, col, t, col_addr(col), col_index(col), 
      col_addr(t), col_index(t));  
      epu.word( 1) := z_mls + unk;  
      epu.word( 2) := cwa(col);  
      epu.word( 3) := cwa(t);  
      epu.word( 4) := mla + cond;  
      epu.word( 5) := epu.word(2) + unk shift 2;  
      epu.word( 6) := epu.word(3) + unk shift 2;  
      epu.word( 7) := add_1;  
      epu.word( 8) := 
      epu.word(11) := col_addr(if not_transp then col
      _                                      else t)
      _             + col_index(if not_transp then t
      _                                       else col);  
      epu.word( 9) :=
      epu.word(12) := epu.word(8) + NEQ_disp;  
      epu.word(10) := str_1;  
      word := word + 24;  
      if word > epu_max then
      to_epu(epu, word, epu_lng, false);  

    end t-loop;  

  end col-loop;  

  _
  comment start epu;  
  __________________
  if word <> 0 then
  to_epu(epu, word, epu_lng, false);  

end no sol clause;  

_
comment close epu;  
__________________
changerec_6(epu, 0);  
close(epu, false);  

end nll_trans;  

end

if ok.no
mode warning.yes

if warning.yes
(mode 0.yes
message nll_trans not ok
lookup nll_trans)

end

▶EOF◀