[BACK]Return to vlprs_tables.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Continuation

Annotation of OpenXM_contrib/PHC/Ada/Continuation/vlprs_tables.adb, Revision 1.1

1.1     ! maekawa     1: package body vLpRs_Tables is
        !             2:
        !             3: -- I. The v-table :
        !             4:
        !             5:   procedure v_pipe ( v : in out Vector; p : in Vector;
        !             6:                      vr : in double_float ) is
        !             7:
        !             8:     tmp0,tmp1 : double_float;
        !             9:
        !            10:   begin
        !            11:     tmp0 := v(0);
        !            12:     v(0) := vr;
        !            13:     for i in 1..v'last loop
        !            14:       tmp1 := v(i);
        !            15:       v(i) := tmp0 - p(i-1)*v(i-1);
        !            16:       tmp0 := tmp1;
        !            17:     end loop;
        !            18:   end v_pipe;
        !            19:
        !            20:   procedure v_pipe ( v,p : in Vector; vr : in double_float;
        !            21:                      vrp : in out Vector ) is
        !            22:   begin
        !            23:     vrp(0) := vr;
        !            24:     for i in 1..v'last loop
        !            25:       vrp(i) := v(i-1) - p(i-1)*vrp(i-1);
        !            26:     end loop;
        !            27:   end v_pipe;
        !            28:
        !            29: -- II. The L-table :
        !            30:
        !            31:   procedure L_pipe ( l : in out Vector; p : in Vector;
        !            32:                      lr : in double_float ) is
        !            33:
        !            34:     tmp0,tmp1 : double_float;
        !            35:
        !            36:   begin
        !            37:     tmp0 := l(0);
        !            38:     l(0) := lr;
        !            39:     for i in 1..l'last loop
        !            40:       tmp1 := l(i);
        !            41:       l(i) := tmp0 - p(i-1)*l(i-1);
        !            42:       tmp0 := tmp1;
        !            43:     end loop;
        !            44:   end L_pipe;
        !            45:
        !            46:   procedure L_pipe ( l,p : in Vector; lr : in double_float;
        !            47:                      lrp : in out Vector ) is
        !            48:   begin
        !            49:     lrp(0) := lr;
        !            50:     for i in 1..l'last loop
        !            51:       lrp(i) := l(i-1) - p(i-1)*lrp(i-1);
        !            52:     end loop;
        !            53:   end L_pipe;
        !            54:
        !            55: -- The combined full version for v- and L-table :
        !            56:
        !            57:   procedure vL_full ( s,l,v : in Vector; srp,dsp,p,lrp,vrp : out Vector;
        !            58:                       rt1,rt2 : in out Matrix ) is
        !            59:
        !            60:     srm1,tmpsrp,tmpdsp : Vector(1..s'last-1);
        !            61:     tmpp : Vector(0..s'last-1);
        !            62:     prev_lrp,new_lrp,prev_vrp,new_vrp : Vector(s'range);
        !            63:     k_last : integer;
        !            64:
        !            65:   begin
        !            66:     srm1(srm1'first) := s(0);
        !            67:     for i in srm1'first+1..srm1'last loop
        !            68:       srm1(i) := s(0)*srm1(i-1);
        !            69:     end loop;
        !            70:     s_pipe(srm1,s(1),tmpsrp,tmpdsp); srm1 := tmpsrp;
        !            71:     for j in rt1'range(2) loop
        !            72:       rt1(1,j) := tmpdsp(j);
        !            73:     end loop;
        !            74:     tmpp(0) := 1.0;
        !            75:     prev_lrp(0) := l(0);  new_lrp(0) := l(1);
        !            76:     prev_vrp(0) := v(0);  new_vrp(0) := v(1);
        !            77:     new_vrp(1) := prev_vrp(0) - new_vrp(0);
        !            78:     new_lrp(1) := prev_lrp(0) - new_lrp(0);
        !            79:     prev_lrp(0..1) := new_lrp(0..1);
        !            80:     prev_vrp(0..1) := new_vrp(0..1);
        !            81:     for i in 2..s'last loop
        !            82:       s_pipe(srm1,s(i),tmpsrp,tmpdsp); srm1 := tmpsrp;
        !            83:       for j in rt2'range(2) loop
        !            84:         rt2(1,j) := tmpdsp(j);
        !            85:       end loop;
        !            86:       if i < s'last
        !            87:        then k_last := i;    -- compute one additional row
        !            88:        else k_last := i-1;
        !            89:       end if;
        !            90:       for k in 1..k_last loop
        !            91:         tmpp(k) := rt1(k,k)/rt2(k,k);
        !            92:         for j in k+1..rt2'last(2) loop
        !            93:           rt2(k+1,j) := rt1(k,j) - tmpp(k)*rt2(k,j);
        !            94:         end loop;
        !            95:       end loop;
        !            96:       rt1 := rt2;
        !            97:       new_vrp(0) := v(i);
        !            98:       new_lrp(0) := l(i);
        !            99:       for k in 1..i loop
        !           100:         new_vrp(k) := prev_vrp(k-1) - tmpp(k-1)*new_vrp(k-1);
        !           101:         new_lrp(k) := prev_lrp(k-1) - tmpp(k-1)*new_lrp(k-1);
        !           102:       end loop;
        !           103:       prev_vrp(0..i) := new_vrp(0..i);
        !           104:       prev_lrp(0..i) := new_lrp(0..i);
        !           105:     end loop;
        !           106:     srp := tmpsrp;
        !           107:     dsp := tmpdsp;
        !           108:     p := tmpp;
        !           109:     lrp := new_lrp;
        !           110:     vrp := new_vrp;
        !           111:   end vL_full;
        !           112:
        !           113: -- III. The p-table :
        !           114:
        !           115:   procedure p_full ( s : in Vector; srp,dsp,p : out Vector;
        !           116:                      rt1,rt2 : in out Matrix ) is
        !           117:   begin
        !           118:     RR_full(s,srp,dsp,p,rt1,rt2);
        !           119:   end p_full;
        !           120:
        !           121:   procedure p_pipe ( rt1,rt2 : in Matrix; p : out Vector ) is
        !           122:   begin
        !           123:     p(0) := 1.0;
        !           124:     for i in p'first+1..p'last loop
        !           125:       p(i) := rt1(i,i)/rt2(i,i);
        !           126:     end loop;
        !           127:   end p_pipe;
        !           128:
        !           129: -- IV. The R-table :
        !           130:
        !           131:   procedure R_full ( s : in Vector; srp,dsp,p : out Vector;
        !           132:                      rt1,rt2 : in out Matrix ) is
        !           133:
        !           134:     srm1,tmpsrp,tmpdsp : Vector(1..s'last-1);
        !           135:     tmpp : Vector(0..s'last-1);
        !           136:
        !           137:   begin
        !           138:     srm1(srm1'first) := s(0);
        !           139:     for i in srm1'first+1..srm1'last loop
        !           140:       srm1(i) := s(0)*srm1(i-1);
        !           141:     end loop;
        !           142:     s_pipe(srm1,s(1),tmpsrp,tmpdsp); srm1 := tmpsrp;
        !           143:     for j in tmpdsp'range loop
        !           144:       rt1(1,j) := tmpdsp(j);
        !           145:     end loop;
        !           146:     tmpp(0) := 1.0;
        !           147:     for i in 2..s'last loop
        !           148:       s_pipe(srm1,s(i),tmpsrp,tmpdsp); srm1 := tmpsrp;
        !           149:       for j in tmpdsp'range loop
        !           150:         rt2(1,j) := tmpdsp(j);
        !           151:       end loop;
        !           152:       for k in 1..i-1 loop
        !           153:         tmpp(k) := rt1(k,k)/rt2(k,k);
        !           154:         for j in k+1..rt2'last(2) loop
        !           155:           rt2(k+1,j) := rt1(k,j) - tmpp(k)*rt2(k,j);
        !           156:         end loop;
        !           157:       end loop;
        !           158:       rt1 := rt2;
        !           159:     end loop;
        !           160:     srp := tmpsrp;
        !           161:     dsp := tmpdsp;
        !           162:     p := tmpp;
        !           163:   end R_full;
        !           164:
        !           165:   procedure RR_full ( s : in Vector; srp,dsp,p : out Vector;
        !           166:                       rt1,rt2 : in out Matrix ) is
        !           167:
        !           168:     srm1,tmpsrp,tmpdsp : Vector(1..s'last-1);
        !           169:     tmpp : Vector(0..s'last-1);
        !           170:     k_last,j_first : integer;
        !           171:
        !           172:   begin
        !           173:     srm1(srm1'first) := s(0);
        !           174:     for i in srm1'first+1..srm1'last loop
        !           175:       srm1(i) := s(0)*srm1(i-1);
        !           176:     end loop;
        !           177:     s_pipe(srm1,s(1),tmpsrp,tmpdsp); srm1 := tmpsrp;
        !           178:     for j in tmpdsp'range loop
        !           179:       rt1(1,j) := tmpdsp(j);
        !           180:     end loop;
        !           181:     tmpp(0) := 1.0;
        !           182:     for i in 2..s'last loop
        !           183:       s_pipe(srm1,s(i),tmpsrp,tmpdsp); srm1 := tmpsrp;
        !           184:       for j in tmpdsp'range loop
        !           185:         rt2(1,j) := tmpdsp(j);
        !           186:       end loop;
        !           187:       if i < s'last
        !           188:        then k_last := i;    -- compute one additional row
        !           189:        else k_last := i-1;
        !           190:       end if;
        !           191:       for k in 1..k_last loop
        !           192:         tmpp(k) := rt1(k,k)/rt2(k,k);
        !           193:         if k < rt2'last(2)
        !           194:          then j_first := k;
        !           195:          else j_first := k+1;
        !           196:         end if;
        !           197:         for j in j_first..rt2'last(2) loop   -- start earlier with columns
        !           198:           rt2(k+1,j) := rt1(k,j) - tmpp(k)*rt2(k,j);
        !           199:         end loop;
        !           200:       end loop;
        !           201:       rt1 := rt2;
        !           202:     end loop;
        !           203:     srp := tmpsrp;
        !           204:     dsp := tmpdsp;
        !           205:     p := tmpp;
        !           206:   end RR_full;
        !           207:
        !           208:   procedure R_pipe ( rt1 : in Matrix; s,p : in Vector; rt2 : in out Matrix ) is
        !           209:   begin
        !           210:     rt2(1,1) := s(1);
        !           211:     for j in 2..s'last loop
        !           212:       rt2(1,j) := s(j);
        !           213:       for i in 2..j loop
        !           214:         rt2(i,j) := rt1(i-1,j) - p(i-1)*rt2(i-1,j);
        !           215:       end loop;
        !           216:     end loop;
        !           217:   end R_pipe;
        !           218:
        !           219:   procedure RR_pipe ( rt1 : in Matrix; s,p : in Vector; rt2 : in out Matrix ) is
        !           220:
        !           221:     i_last : integer;
        !           222:
        !           223:   begin
        !           224:     rt2(1,1) := s(1);
        !           225:     for j in 2..s'last loop
        !           226:       rt2(1,j) := s(j);
        !           227:       if j < rt2'last(1)
        !           228:        then i_last := j+1;   -- compute one additional row
        !           229:        else i_last := j;
        !           230:       end if;
        !           231:       for i in 2..i_last loop
        !           232:         rt2(i,j) := rt1(i-1,j) - p(i-1)*rt2(i-1,j);
        !           233:       end loop;
        !           234:     end loop;
        !           235:   end RR_pipe;
        !           236:
        !           237: -- V. The s-table :
        !           238:
        !           239:   procedure s_full ( s : in Vector; srp,dsp : out Vector ) is
        !           240:
        !           241:     srm1,tmpsrp : Vector(1..s'last-1);
        !           242:
        !           243:   begin
        !           244:     srm1(srm1'first) := s(0);
        !           245:     for i in srm1'first+1..srm1'last loop
        !           246:       srm1(i) := s(0)*srm1(i-1);
        !           247:     end loop;
        !           248:     for i in 1..s'last loop
        !           249:       s_pipe(srm1,s(i),tmpsrp,dsp);
        !           250:       srm1 := tmpsrp;
        !           251:     end loop;
        !           252:     srp := tmpsrp;
        !           253:   end s_full;
        !           254:
        !           255:   procedure s_pipe ( srp : in out Vector; sr : in double_float;
        !           256:                      dsp : out Vector ) is
        !           257:
        !           258:     tmp : double_float := srp(1);
        !           259:     srpow : double_float := sr;
        !           260:
        !           261:   begin
        !           262:     srp(1) := srpow;
        !           263:     dsp(1) := srpow - tmp;
        !           264:     for i in 2..srp'last loop
        !           265:       srpow := srpow*sr;
        !           266:       tmp := srp(i);
        !           267:       srp(i) := srpow;
        !           268:       dsp(i) := srpow - tmp;
        !           269:     end loop;
        !           270:   end s_pipe;
        !           271:
        !           272:   procedure s_pipe ( sr1 : in Vector; sr : in double_float;
        !           273:                      srp,dsp : out Vector ) is
        !           274:
        !           275:     srpow : double_float := sr;
        !           276:
        !           277:   begin
        !           278:     srp(1) := srpow;
        !           279:     dsp(1) := srpow - sr1(1);
        !           280:     for i in sr1'first+1..sr1'last loop
        !           281:       srpow := srpow*sr;
        !           282:       srp(i) := srpow;
        !           283:       dsp(i) := srpow - sr1(i);
        !           284:     end loop;
        !           285:   end s_pipe;
        !           286:
        !           287: end vLpRs_Tables;

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