[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     ! 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>