[BACK]Return to standard_complex_least_squares.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Matrices

Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Matrices/standard_complex_least_squares.adb, Revision 1.1.1.1

1.1       maekawa     1: with Standard_Floating_Numbers;          use Standard_Floating_Numbers;
                      2: with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
                      3:
                      4: package body Standard_Complex_Least_Squares is
                      5:
                      6: -- AUXILIARIES :
                      7:
                      8:   function min0 ( a,b : integer ) return integer is
                      9:
                     10:   -- DESCRIPTION : returns the minimum of a and b.
                     11:
                     12:   begin
                     13:     if a <= b
                     14:      then return a;
                     15:      else return b;
                     16:        end if;
                     17:   end min0;
                     18:
                     19:   procedure zcopy ( n,start : in natural;
                     20:                     x : in Standard_Complex_Vectors.Vector;
                     21:                     y : out Standard_Complex_Vectors.Vector ) is
                     22:
                     23:   -- DESCRIPTION :
                     24:   --   Copies the n entries of x to y, beginning at start.
                     25:
                     26:   begin
                     27:     for i in start..start+n-1 loop
                     28:       y(i) := x(i);
                     29:     end loop;
                     30:   end zcopy;
                     31:
                     32:   function zdotc ( row : natural;
                     33:                    x : Standard_Complex_Matrices.Matrix;
                     34:                    y : Standard_Complex_Vectors.Vector )
                     35:                  return Complex_Number is
                     36:
                     37:   -- DESCRIPTION :
                     38:   --   Dot product of two vectors : x(row..x'last(1),row)*y(row..y'last).
                     39:
                     40:     res : Complex_Number := Create(0.0);
                     41:
                     42:   begin
                     43:     for i in row..y'last loop
                     44:       res := res + Conjugate(x(i,row))*y(i);
                     45:     end loop;
                     46:     return res;
                     47:   end zdotc;
                     48:
                     49:   procedure zaxpy ( n,row,col : in natural; f : in Complex_Number;
                     50:                     x : in Standard_Complex_Matrices.Matrix;
                     51:                     y : in out Standard_Complex_Vectors.Vector ) is
                     52:
                     53:   -- DESCRIPTION :
                     54:   --   y(i) := y(i) + f*x(i,col) for i in row..row+n-1.
                     55:
                     56:   begin
                     57:     for i in row..row+n-1 loop
                     58:       y(i) := y(i) + f*x(i,col);
                     59:     end loop;
                     60:   end zaxpy;
                     61:
                     62:   procedure QRLS ( x : in out Standard_Complex_Matrices.Matrix;
                     63:                    ldx,n,k : in natural;
                     64:                    qraux,y : in Standard_Complex_Vectors.Vector;
                     65:                    qy,qty,b,rsd,xb : out Standard_Complex_Vectors.Vector;
                     66:                    job : in natural; info : out natural ) is
                     67:
                     68:     cb,cqy,cqty,cr,cxb : boolean;
                     69:     jj,ju,kp1 : integer;
                     70:     t,temp : Complex_Number;
                     71:
                     72:   begin
                     73:     info := 0;                                               -- set info flag
                     74:     cqy := (job/10000 /= 0);                     -- determine what to compute
                     75:     cqty := (job mod 10000 /= 0);
                     76:     cb := ((job mod 1000)/100 /= 0);
                     77:     cr := ((job mod 100)/10 /= 0);
                     78:     cxb := ((job mod 10) /= 0);
                     79:     ju := min0(k,n-1);
                     80:     if ju = 0                                    -- special action when n = 1
                     81:      then if cqy then qy(1) := y(1); end if;
                     82:           if cqty then qty(1) := y(1); end if;
                     83:           if cxb then xb(1) := y(1); end if;
                     84:           if cb
                     85:            then if AbsVal(x(1,1)) = 0.0
                     86:                  then info := 1;
                     87:                  else b(1) := y(1)/x(1,1);
                     88:                 end if;
                     89:           end if;
                     90:           if cr then rsd(1) := Create(0.0); end if;
                     91:           return;
                     92:     end if;
                     93:     if cqy                                     -- set up to compute qy or qty
                     94:      then zcopy(n,y'first,y,qy);
                     95:     end if;
                     96:     if cqty
                     97:      then zcopy(n,y'first,y,qty);
                     98:     end if;
                     99:     if cqy                                                      -- compute qy
                    100:      then for j in 1..ju loop
                    101:             jj := ju - j + 1;
                    102:             if AbsVal(qraux(jj)) /= 0.0
                    103:              then temp := x(jj,jj);
                    104:                   x(jj,jj) := qraux(jj);
                    105:                   t := -zdotc(jj,x,qy)/x(jj,jj);
                    106:                   zaxpy(n-jj+1,jj,jj,t,x,qy);
                    107:                   x(jj,jj) := temp;
                    108:             end if;
                    109:           end loop;
                    110:     end if;
                    111:     if cqty                                             -- compute trans(q)*y
                    112:      then for j in 1..ju loop
                    113:             if AbsVal(qraux(j)) /= 0.0
                    114:              then temp := x(j,j);
                    115:                   x(j,j) := qraux(j);
                    116:                   t := -zdotc(j,x,qty)/x(j,j);
                    117:                   zaxpy(n-j+1,j,j,t,x,qty);
                    118:                   x(j,j) := temp;
                    119:              end if;
                    120:            end loop;
                    121:     end if;
                    122:     if cb                                   -- set up to compute b,rsd, or xb
                    123:      then zcopy(k,qty'first,qty,b);
                    124:     end if;
                    125:     kp1 := k + 1;
                    126:     if cxb then zcopy(k,qty'first,qty,xb); end if;
                    127:     if (cr and (k < n))
                    128:      then zcopy(n-k,kp1,qty,rsd);
                    129:     end if;
                    130:     if (cxb and (kp1 <= n))
                    131:      then for i in kp1..n loop
                    132:             xb(i) := Create(0.0);
                    133:           end loop;
                    134:     end if;
                    135:     if cr
                    136:      then for i in 1..k loop
                    137:             rsd(i) := Create(0.0);
                    138:           end loop;
                    139:     end if;
                    140:     if cb                                                        -- compute b
                    141:      then for j in 1..k loop
                    142:             jj := k - j + 1;
                    143:             if AbsVal(x(jj,jj)) = 0.0
                    144:              then info := jj; exit;
                    145:             end if;
                    146:             b(jj) := b(jj)/x(jj,jj);
                    147:             if jj /= 1
                    148:              then t := -b(jj);
                    149:                   zaxpy(jj-1,1,jj,t,x,b);
                    150:             end if;
                    151:                  end loop;
                    152:     end if;
                    153:     if cr or cxb                             -- compute rsd or xb as requested
                    154:         then for j in 1..ju loop
                    155:             jj := ju - j + 1;
                    156:             if AbsVal(qraux(jj)) /= 0.0
                    157:              then temp := x(jj,jj);
                    158:                   x(jj,jj) := qraux(jj);
                    159:                   if cr
                    160:                    then t := -zdotc(jj,x,rsd)/x(jj,jj);
                    161:                         zaxpy(n-jj+1,jj,jj,t,x,rsd);
                    162:                   end if;
                    163:                   if cxb
                    164:                    then t := -zdotc(jj,x,xb)/x(jj,jj);
                    165:                         zaxpy(n-jj+1,jj,jj,t,x,xb);
                    166:                   end if;
                    167:                   x(jj,jj) := temp;
                    168:             end if;
                    169:           end loop;
                    170:     end if;
                    171:   end QRLS;
                    172:
                    173: end Standard_Complex_Least_Squares;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>