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