Annotation of OpenXM_contrib/PHC/Ada/Continuation/directions_of_solution_paths.adb, Revision 1.1
1.1 ! maekawa 1: with integer_io; use integer_io;
! 2: with Standard_Floating_Numbers_io; use Standard_Floating_Numbers_io;
! 3: with Standard_Mathematical_Functions; use Standard_Mathematical_Functions;
! 4: with Standard_Floating_Vectors_io; use Standard_Floating_Vectors_io;
! 5: with Standard_Floating_Matrices; use Standard_Floating_Matrices;
! 6: with Standard_Floating_Matrices_io; use Standard_Floating_Matrices_io;
! 7: with Standard_Integer_Vectors;
! 8: with Standard_Integer_Vectors_io; use Standard_Integer_Vectors_io;
! 9: with vLpRs_Algorithm; use vLpRs_Algorithm;
! 10:
! 11: package body Directions_of_Solution_Paths is
! 12:
! 13: -- AUXILIARY :
! 14:
! 15: function Norm1 ( x : Standard_Floating_Vectors.Vector ) return double_float is
! 16:
! 17: res : double_float := 0.0;
! 18:
! 19: begin
! 20: for i in x'range loop
! 21: res := res + abs(x(i));
! 22: end loop;
! 23: return res;
! 24: end Norm1;
! 25:
! 26: procedure Shift_Up ( v : in out Standard_Floating_Vectors.Vector;
! 27: x : in double_float ) is
! 28:
! 29: -- DESCRIPTION :
! 30: -- Puts x at v(v'first) after a shift-up: v(i+1) := v(i).
! 31:
! 32: begin
! 33: for i in reverse v'first..(v'last-1) loop
! 34: v(i+1) := v(i);
! 35: end loop;
! 36: v(v'first) := x;
! 37: end Shift_Up;
! 38:
! 39: -- FIRST ORDER EXTRAPOLATION :
! 40:
! 41: procedure Affine_Update_Direction
! 42: ( t,prev_t,target : in Complex_Number;
! 43: x,prevx : in Standard_Complex_Vectors.Vector;
! 44: prevdls,prevstep : in out double_float;
! 45: prevdiff,v : in out Standard_Floating_Vectors.Vector ) is
! 46:
! 47: newdls : double_float;
! 48: newstep : double_float := AbsVal(t-prev_t);
! 49: newdiff : Standard_Floating_Vectors.Vector(prevdiff'range);
! 50: ratio,factor : double_float;
! 51:
! 52: begin
! 53: for i in v'range loop
! 54: newdiff(i) := LOG10(AbsVal(x(i))) - LOG10(AbsVal(prevx(i)));
! 55: end loop;
! 56: newdls := LOG10(AbsVal(target-prev_t)) - LOG10(AbsVal(target-t));
! 57: if prevdls /= 0.0
! 58: then ratio := prevstep/newstep;
! 59: factor := prevdls - ratio*newdls;
! 60: for i in v'range loop
! 61: v(i) := (prevdiff(i) - ratio*newdiff(i))/factor;
! 62: end loop;
! 63: end if;
! 64: prevdiff := newdiff;
! 65: prevstep := newstep;
! 66: prevdls := newdls;
! 67: end Affine_Update_Direction;
! 68:
! 69: procedure Projective_Update_Direction
! 70: ( t,prev_t,target : in Complex_Number;
! 71: x,prevx : in Standard_Complex_Vectors.Vector;
! 72: prevdls,prevstep : in out double_float;
! 73: prevdiff,v : in out Standard_Floating_Vectors.Vector ) is
! 74:
! 75: newdls : double_float;
! 76: newstep : double_float := AbsVal(t-prev_t);
! 77: newdiff : Standard_Floating_Vectors.Vector(prevdiff'range);
! 78: ratio,factor : double_float;
! 79:
! 80: begin
! 81: for i in v'range loop
! 82: newdiff(i) := ( LOG10(AbsVal(x(i))) - LOG10(AbsVal(x(x'last))) )
! 83: - ( LOG10(AbsVal(prevx(i))) - LOG10(AbsVal(prevx(prevx'last))) );
! 84: end loop;
! 85: newdls := LOG10(AbsVal(target-prev_t)) - LOG10(AbsVal(target-t));
! 86: if prevdls /= 0.0
! 87: then ratio := prevstep/newstep;
! 88: factor := prevdls - ratio*newdls;
! 89: for i in v'range loop
! 90: v(i) := (prevdiff(i) - ratio*newdiff(i))/factor;
! 91: end loop;
! 92: end if;
! 93: prevdiff := newdiff;
! 94: prevstep := newstep;
! 95: prevdls := newdls;
! 96: end Projective_Update_Direction;
! 97:
! 98: -- DATA MANAGEMENT FOR HIGHER-ORDER EXTRAPOLATION :
! 99:
! 100: procedure Extrapolation_Window
! 101: ( r,m : in natural; t,target : in Complex_Number;
! 102: x : in Standard_Complex_Vectors.Vector;
! 103: dt,s,logs : in out Standard_Floating_Vectors.Vector;
! 104: logx : in out VecVec ) is
! 105:
! 106: -- DESCRIPTION :
! 107: -- The data (dt,s,logs and logx) are stored as in a window: when
! 108: -- full at the incoming of a new element, all elements are shifted
! 109: -- and the oldest element drops off.
! 110:
! 111: use Standard_Floating_Vectors;
! 112:
! 113: begin
! 114: if (r = s'last) and (logx(r) /= null)
! 115: then for i in s'first+1..s'last loop -- shift the data
! 116: s(i-1) := s(i);
! 117: dt(i-1) := dt(i);
! 118: logs(i-1) := logs(i);
! 119: logx(i-1).all := logx(i).all;
! 120: end loop;
! 121: end if;
! 122: dt(r) := (AbsVal(target-t));
! 123: s(r) := (dt(r))**(1.0/double_float(m));
! 124: logs(r) := LOG10(s(r));
! 125: end Extrapolation_Window;
! 126:
! 127: procedure Refresh_Window ( r,m : in natural; dt : in Standard_Floating_Vectors.Vector;
! 128: s,logs : in out Standard_Floating_Vectors.Vector ) is
! 129:
! 130: -- DESCRIPTION :
! 131: -- Recomputes s and logs, after m has been changed.
! 132:
! 133: begin
! 134: for i in s'first..r loop
! 135: s(i) := (dt(i))**(1.0/double_float(m));
! 136: logs(i) := LOG10(s(i));
! 137: end loop;
! 138: end Refresh_Window;
! 139:
! 140: procedure Write_Update_Information
! 141: ( file : in file_type; r,m : in natural;
! 142: s,logs : in double_float;
! 143: logx : in Standard_Floating_Vectors.Vector ) is
! 144:
! 145: -- DESCRIPTION :
! 146: -- Writes r, s, log(s) and log|x(s)| on file.
! 147: -- The current version only writes a banner with r and m.
! 148:
! 149: begin
! 150: put(file,"extrapolation with r = "); put(file,r,1);
! 151: put(file," and m = "); put(file,m,1); --put_line(file," : ");
! 152: -- put(file,"m : "); put(file,s);
! 153: -- put(file," log(s) : "); put(file,logs);
! 154: -- put(file," log|x(s)| : ");
! 155: -- put(file,logx);
! 156: -- for i in logx'range loop
! 157: -- put(file,logx(i));
! 158: -- end loop;
! 159: new_line(file);
! 160: end Write_Update_Information;
! 161:
! 162: procedure Affine_Update_Extrapolation_Data
! 163: ( r,m : in natural; t,target : in Complex_Number;
! 164: x : in Standard_Complex_Vectors.Vector;
! 165: dt,s,logs : in out Standard_Floating_Vectors.Vector;
! 166: logx,wvl0,wvl1,wvltmp : in out VecVec ) is
! 167:
! 168: -- DESCRIPTION :
! 169: -- Updates the data needed to extrapolate in the affine case.
! 170:
! 171: use Standard_Floating_Vectors;
! 172:
! 173: begin
! 174: Extrapolation_Window(r,m,t,target,x,dt,s,logs,logx);
! 175: if logx(r) = null
! 176: then logx(r) := new Standard_Floating_Vectors.Vector(x'range);
! 177: end if;
! 178: if r > 0
! 179: then
! 180: if wvl0(r) = null
! 181: then wvl0(r) := new Standard_Floating_Vectors.Vector'(x'range => 0.0);
! 182: wvl1(r) := new Standard_Floating_Vectors.Vector'(x'range => 0.0);
! 183: wvltmp(r) := new Standard_Floating_Vectors.Vector'(x'range => 0.0);
! 184: end if;
! 185: end if;
! 186: for i in x'range loop
! 187: logx(r)(i) := LOG10(AbsVal(x(i)));
! 188: end loop;
! 189: end Affine_Update_Extrapolation_Data;
! 190:
! 191: procedure Projective_Update_Extrapolation_Data
! 192: ( r,m : in natural; t,target : in Complex_Number;
! 193: x : in Standard_Complex_Vectors.Vector;
! 194: dt,s,logs : in out Standard_Floating_Vectors.Vector;
! 195: logx : in out VecVec ) is
! 196:
! 197: -- DESCRIPTION :
! 198: -- Updates the data needed to extrapolate in the projective case,
! 199: -- under the assumption that the homogenization variable appears lastly.
! 200:
! 201: use Standard_Floating_Vectors;
! 202:
! 203: begin
! 204: Extrapolation_Window(r,m,t,target,x,dt,s,logs,logx);
! 205: if logx(r) = null
! 206: then logx(r) := new Standard_Floating_Vectors.Vector(x'first..x'last-1);
! 207: end if;
! 208: for i in x'first..x'last-1 loop
! 209: logx(r)(i) := LOG10(AbsVal(x(i))) - LOG10(AbsVal(x(x'last)));
! 210: end loop;
! 211: end Projective_Update_Extrapolation_Data;
! 212:
! 213: procedure Update_Errors
! 214: ( r : in natural;
! 215: errorv : in out Standard_Floating_Vectors.Vector;
! 216: error : out double_float; wvl0,wvl1,wvltmp : in out VecVec ) is
! 217:
! 218: -- DESCRIPTION :
! 219: -- Updates the error computation after the extrapolation.
! 220:
! 221: -- REQUIRED : r >= 1.
! 222:
! 223: begin
! 224: if r = 1
! 225: then for i in errorv'range loop
! 226: errorv(i) := abs(wvltmp(r)(i) - wvl1(r)(i));
! 227: end loop;
! 228: else for i in errorv'range loop
! 229: errorv(i) := abs(wvltmp(r-1)(i) - wvl1(r-1)(i));
! 230: end loop;
! 231: end if;
! 232: error := Norm1(errorv);
! 233: for i in 1..r loop
! 234: wvl0(i).all := wvl1(i).all;
! 235: wvl1(i).all := wvltmp(i).all;
! 236: end loop;
! 237: end Update_Errors;
! 238:
! 239: -- ESTIMATING THE CYCLE NUMBER :
! 240:
! 241: procedure Frequency_of_Estimate
! 242: ( newest,max : in natural; m,estm,cnt : in out natural;
! 243: eps : in double_float; newm : out boolean ) is
! 244:
! 245: -- DESCRIPTION :
! 246: -- This procedure manages the frequencies of the estimated values for m.
! 247: -- Only after the same estimate has been found a certain number of
! 248: -- times, the new estimate will be accepted.
! 249: -- The current version does not take the accuracy eps into account.
! 250:
! 251: -- ON ENTRY :
! 252: -- newest newly computed estimate for m;
! 253: -- max threshold on cnt before estm is returned;
! 254: -- m current value of m;
! 255: -- estm previous estimate;
! 256: -- cnt number of consecutive guesses that yielded estm;
! 257: -- eps accuracy of the current estimate.
! 258:
! 259: -- ON RETURN :
! 260: -- m new value of m;
! 261: -- estm new estimate;
! 262: -- cnt updated number of consecutive guesses that yielded estm;
! 263: -- newm true if m has changed.
! 264:
! 265: begin
! 266: if cnt = 0 -- initial estimate
! 267: then estm := newest;
! 268: cnt := 1;
! 269: elsif newest = estm -- update frequency for current estimate
! 270: then cnt := cnt + 1;
! 271: else cnt := 1; -- new estimate found
! 272: estm := newest;
! 273: end if;
! 274: if estm /= m -- look for modification of current cycle number
! 275: then if (cnt >= max) --and (eps <= 0.1)
! 276: then m := estm;
! 277: newm := true;
! 278: else newm := false;
! 279: end if;
! 280: else newm := false;
! 281: end if;
! 282: end Frequency_of_Estimate;
! 283:
! 284: procedure Extrapolate_on_Errors
! 285: ( file : in file_type;
! 286: r : in integer; h : in double_float;
! 287: err : in Standard_Floating_Vectors.Vector;
! 288: estm : out double_float ) is
! 289:
! 290: -- DESCRIPTION :
! 291: -- Performs an rth-order extrapolation on the errors.
! 292:
! 293: -- ON ENTRY :
! 294: -- file to write intermediate results on;
! 295: -- r order of the extrapolation method;
! 296: -- h ratio in geometric sequence;
! 297: -- err vector of range 0..r+1 with differences of estimates for
! 298: -- the outer normal, the most recent error is err(0).
! 299:
! 300: -- ON RETURN :
! 301: -- extm estimated value for m.
! 302:
! 303: em,hm,exterr : Standard_Floating_Vectors.Vector(1..r+1);
! 304: dlog : constant double_float := log10(h);
! 305: f : double_float;
! 306:
! 307: begin
! 308: for j in exterr'range loop
! 309: exterr(j) := log10(err(j-1)) - log10(err(j));
! 310: end loop;
! 311: em(1) := dlog/exterr(1); -- 0th order estimate
! 312: -- if (m(1) < 0.0001) or (m(1) > 1000.0) -- avoid divergence
! 313: -- then m(r+1) := m(1);
! 314: -- else
! 315: hm(1) := h**(1.0/em(1));
! 316: for k in 1..r loop
! 317: f := hm(k) - 1.0;
! 318: for j in 1..r-k+1 loop
! 319: exterr(j) := exterr(j+1) + (exterr(j+1) - exterr(j))/f;
! 320: end loop;
! 321: em(k+1) := dlog/exterr(1);
! 322: -- exit when ((m(k+1) < 0.0001) or (m(k+1) > 1000.0));
! 323: hm(k+1) := h**(double_float(k+1)/em(k+1));
! 324: end loop;
! 325: -- end if;
! 326: estm := em(r+1);
! 327: put(file,"em(0.."); put(file,r,1); put(file,") : ");
! 328: for i in em'range loop
! 329: put(file,em(i),3,3,3);
! 330: end loop;
! 331: new_line(file);
! 332: exception
! 333: when others => null;
! 334: end Extrapolate_on_Errors;
! 335:
! 336: procedure Estimate0
! 337: ( r,max : in natural; m,estm,cnt : in out natural;
! 338: dt : in Standard_Floating_Vectors.Vector;
! 339: err,newerr : in double_float; rat,eps : out double_float;
! 340: newm : out boolean ) is
! 341:
! 342: -- DESCRIPTION :
! 343: -- Returns an 0th-order estimate of the cycle number m.
! 344:
! 345: -- ON ENTRY :
! 346: -- r extrapolation order;
! 347: -- max threshold on cnt before estm is returned;
! 348: -- m current value of m;
! 349: -- estm previous estimate;
! 350: -- cnt number of consecutive guesses that yielded estm;
! 351: -- dt consecutive distances to the target;
! 352: -- err previous error;
! 353: -- newerr current error.
! 354:
! 355: -- ON RETURN :
! 356: -- m new value of m;
! 357: -- estm new estimate;
! 358: -- cnt updated number of consecutive guesses that yielded estm;
! 359: -- rat ratio used to estimate m;
! 360: -- eps accuracy of the rounding value for m;
! 361: -- newm true if m has changed.
! 362:
! 363: dferr : constant double_float := log10(newerr) - log10(err);
! 364: h : constant double_float := dt(r)/dt(r-1);
! 365: dfsr1 : constant double_float := log10(h);
! 366: ratio : constant double_float := abs(dfsr1/dferr);
! 367: res : natural := integer(ratio);
! 368: accuracy : constant double_float := abs(double_float(res) - ratio);
! 369:
! 370: begin
! 371: if res = 0
! 372: then res := 1;
! 373: end if;
! 374: Frequency_of_Estimate(res,max,m,estm,cnt,accuracy,newm);
! 375: rat := ratio; eps := accuracy;
! 376: end Estimate0;
! 377:
! 378: procedure Estimate
! 379: ( file : in file_type; r : in integer;
! 380: max : in natural; m,estm,cnt : in out natural;
! 381: h : in double_float;
! 382: diferr : in Standard_Floating_Vectors.Vector;
! 383: rat,eps : out double_float; newm : out boolean ) is
! 384:
! 385: -- DESCRIPTION :
! 386: -- Estimates m by extrapolation on consecutvie differences of errors,
! 387: -- stored in the parameter diferr. For the specfication of the other
! 388: -- parameters, see the procedure Estimate0.
! 389:
! 390: res : integer;
! 391: fltestm,accuracy : double_float;
! 392:
! 393: begin
! 394: -- if r < dt'last
! 395: -- then Extrapolate_on_Errors(file,r-1,h,diferr(0..r),fltestm);
! 396: -- else
! 397: Extrapolate_on_Errors(file,r,h,diferr(0..r+1),fltestm);
! 398: -- end if;
! 399: res := integer(fltestm);
! 400: if res <= 0
! 401: then res := 1;
! 402: end if;
! 403: accuracy := abs(double_float(res) - fltestm);
! 404: Frequency_of_Estimate(res,max,m,estm,cnt,accuracy,newm);
! 405: rat := fltestm; eps := accuracy;
! 406: end Estimate;
! 407:
! 408: -- APPLYING THE vLpRs-Algorithm :
! 409:
! 410: function vLpRs_Extrapolate
! 411: ( r : natural; s,logs : Standard_Floating_Vectors.Vector;
! 412: logx : VecVec )
! 413: return Standard_Floating_Vectors.Vector is
! 414:
! 415: -- DESCRIPTION :
! 416: -- Higher-order extrapolation is based on vLpRs-Algorithm.
! 417:
! 418: -- REQUIRED : r >= 1.
! 419:
! 420: res : Standard_Floating_Vectors.Vector(logx(r).all'range);
! 421: logx1 : Standard_Floating_Vectors.Vector(0..r);
! 422: rt1,rt2 : Matrix(1..r-1,1..r-1);
! 423: srp,dsp : Standard_Floating_Vectors.Vector(1..r-1) := (0..r-1 => 0.0);
! 424: p : Standard_Floating_Vectors.Vector(0..r-1) := (0..r-1 => 0.0);
! 425: l,v : Standard_Floating_Vectors.Vector(0..r) := (0..r => 1.0);
! 426:
! 427: begin
! 428: rt1(1,1) := 0.0; rt2(1,1) := 0.0;
! 429: for i in res'range loop
! 430: for j in logx1'range loop
! 431: logx1(j) := logx(j)(i);
! 432: end loop;
! 433: vLpRs_full(r,s(0..r),logs(0..r),logx1(0..r),srp,dsp,p,l,v,rt1,rt2);
! 434: res(i) := v(r)/l(r);
! 435: end loop;
! 436: return res;
! 437: end vLpRs_Extrapolate;
! 438:
! 439: function vLpRs_Extrapolate
! 440: ( file : file_type; r : natural;
! 441: s,logs : Standard_Floating_Vectors.Vector; logx : VecVec )
! 442: return Standard_Floating_Vectors.Vector is
! 443:
! 444: -- DESCRIPTION :
! 445: -- Higher-order extrapolation based on vLpRs-Algorithm.
! 446:
! 447: -- REQUIRED : r >= 1.
! 448:
! 449: res : Standard_Floating_Vectors.Vector(logx(r).all'range);
! 450: logx1 : Standard_Floating_Vectors.Vector(0..r);
! 451: rt1,rt2 : Matrix(1..r-1,1..r-1);
! 452: srp,dsp : Standard_Floating_Vectors.Vector(1..r-1) := (0..r-1 => 0.0);
! 453: p : Standard_Floating_Vectors.Vector(0..r-1) := (0..r-1 => 0.0);
! 454: l,v : Standard_Floating_Vectors.Vector(0..r) := (0..r => 0.0);
! 455:
! 456: begin
! 457: for i in rt1'range(1) loop
! 458: for j in rt1'range(2) loop
! 459: rt1(i,j) := 0.0; rt2(i,j) := 0.0;
! 460: end loop;
! 461: end loop;
! 462: for i in res'range loop
! 463: for j in logx1'range loop
! 464: logx1(j) := logx(j)(i);
! 465: end loop;
! 466: vLpRs_pipe(file,r,s(0..r),logs(0..r),logx1(0..r),srp,dsp,p,l,v,rt1,rt2);
! 467: res(i) := v(r)/l(r);
! 468: end loop;
! 469: return res;
! 470: end vLpRs_Extrapolate;
! 471:
! 472: procedure vLpRs_Extrapolate
! 473: ( file : in file_type; r : in natural;
! 474: s,logs : in Standard_Floating_Vectors.Vector;
! 475: logx,wvl0 : in VecVec; wvl1 : in out VecVec;
! 476: w,wv,wl : out Standard_Floating_Vectors.Vector ) is
! 477:
! 478: -- DESCRIPTION :
! 479: -- Higher-order extrapolation based on vLpRs-Algorithm,
! 480: -- writes an error table on file.
! 481:
! 482: -- REQUIRED : r >= 1.
! 483:
! 484: n : constant natural := logx(r)'length;
! 485: logx1 : Standard_Floating_Vectors.Vector(0..r);
! 486: rt1,rt2 : Matrix(1..r-1,1..r-1);
! 487: srp,dsp : Standard_Floating_Vectors.Vector(1..r-1) := (1..r-1 => 0.0);
! 488: p : Standard_Floating_Vectors.Vector(0..r-1) := (0..r-1 => 0.0);
! 489: l,v : Standard_Floating_Vectors.Vector(0..r) := (0..r => 0.0);
! 490: error : Standard_Floating_Vectors.Vector(1..r) := (1..r => 0.0);
! 491:
! 492: begin
! 493: for i in rt1'range(1) loop
! 494: for j in rt1'range(2) loop
! 495: rt1(i,j) := 0.0; rt2(i,j) := 0.0;
! 496: end loop;
! 497: end loop;
! 498: for i in logx(r)'range loop
! 499: for j in logx1'range loop
! 500: logx1(j) := logx(j)(i);
! 501: end loop;
! 502: vLpRs_pipe(file,r,s(0..r),logs(0..r),logx1(0..r),srp,dsp,p,l,v,rt1,rt2);
! 503: w(i) := v(r)/l(r);
! 504: put(file,s(r),2,3,3);
! 505: for j in 1..r loop
! 506: wvl1(j)(i) := v(j)/l(j);
! 507: error(j) := abs(wvl1(j)(i)-wvl0(j)(i));
! 508: put(file,error(j),2,3,3);
! 509: end loop;
! 510: new_line(file);
! 511: end loop;
! 512: wv := v; wl := l;
! 513: end vLpRs_Extrapolate;
! 514:
! 515: -- HIGHER-ORDER EXTRAPOLATION (target routines) :
! 516:
! 517: procedure Affine_Update_Direction
! 518: ( r,m,estm,cntm : in out natural; thresm : in natural;
! 519: er : in out integer; t,target : in Complex_Number;
! 520: x : in Standard_Complex_Vectors.Vector;
! 521: dt,s,logs : in out Standard_Floating_Vectors.Vector;
! 522: logx,wvl0,wvl1,wvltmp : in out VecVec;
! 523: v,diferr : in out Standard_Floating_Vectors.Vector;
! 524: error : in out double_float ) is
! 525:
! 526: use Standard_Floating_Vectors;
! 527: res : Standard_Floating_Vectors.Vector(v'range);
! 528: eps,newerr : double_float;
! 529: newm : boolean := false;
! 530:
! 531: begin
! 532: Affine_Update_Extrapolation_Data
! 533: (r,m,t,target,x,dt,s,logs,logx,wvl0,wvl1,wvltmp);
! 534: if r >= 1
! 535: then res := vLpRs_Extrapolate(r,s,logs,logx);
! 536: newerr := Norm1(res-v);
! 537: end if;
! 538: if r < s'last
! 539: then r := r+1;
! 540: end if;
! 541: if r >= 3 and (newerr < error)
! 542: then --Estimate(r,r,thresm,m,estm,cntm,dt,s,logs,error,newerr,eps,newm);
! 543: if newm
! 544: then res := vLpRs_Extrapolate(r,s,logs,logx);
! 545: newerr := Norm1(res-v);
! 546: end if;
! 547: end if;
! 548: if r >= 1
! 549: then v := res;
! 550: error := newerr;
! 551: end if;
! 552: end Affine_Update_Direction;
! 553:
! 554: procedure Affine_Update_Direction
! 555: ( file : in file_type;
! 556: r,m,estm,cntm : in out natural; thresm : in natural;
! 557: er : in out integer; t,target : in Complex_Number;
! 558: x : in Standard_Complex_Vectors.Vector;
! 559: dt,s,logs : in out Standard_Floating_Vectors.Vector;
! 560: logx,wvl0,wvl1,wvltmp : in out VecVec;
! 561: v,diferr : in out Standard_Floating_Vectors.Vector;
! 562: error : in out double_float ) is
! 563:
! 564: use Standard_Floating_Vectors;
! 565: res,errorv,newerrv : Standard_Floating_Vectors.Vector(v'range);
! 566: wv,wl : Standard_Floating_Vectors.Vector(0..r);
! 567: ind : natural := 1; -- errors based on first-order extrapolation
! 568: rat,eps,newerr : double_float;
! 569: mv,cntmv,estmv : Standard_Integer_Vectors.Vector(v'range);
! 570: newm : boolean := false;
! 571:
! 572: begin
! 573: Affine_Update_Extrapolation_Data
! 574: (r,m,t,target,x,dt,s,logs,logx,wvl0,wvl1,wvltmp);
! 575: Write_Update_Information(file,r,m,s(r),logs(r),logx(r).all);
! 576: if r >= 1
! 577: then vLpRs_Extrapolate(file,r,s,logs,logx,wvl1,wvltmp,res,wv,wl);
! 578: if r = 1 then diferr(0) := 1.0; end if;
! 579: for i in errorv'range loop
! 580: errorv(i) := abs(wvltmp(ind)(i) - wvl1(ind)(i));
! 581: end loop;
! 582: Shift_Up(diferr,Norm1(errorv));
! 583: if er < diferr'last-1 then er := er+1; end if;
! 584: end if;
! 585: if er >= 1 and (diferr(0) < diferr(1))
! 586: then-- Estimate0(r,thresm,m,estm,cntm,diferr(1),diferr(0),rat,eps,newm);
! 587: Estimate(file,er,thresm,m,estm,cntm,dt(r)/dt(r-1),
! 588: diferr,rat,eps,newm);
! 589: put(file,"Ratio for m : "); put(file,rat,3,3,3);
! 590: put(file," and accuracy : "); put(file,eps,3,3,3); new_line(file);
! 591: if newm
! 592: then Refresh_Window(r,m,dt,s,logs);
! 593: put_line(file,"Extrapolation after adjusting the m-value :");
! 594: vLpRs_Extrapolate(file,r,s,logs,logx,wvl1,wvltmp,res,wv,wl);
! 595: for i in errorv'range loop
! 596: errorv(i) := abs(wvltmp(ind)(i) - wvl1(ind)(i));
! 597: end loop;
! 598: Shift_Up(diferr,Norm1(errorv)); er := -2;
! 599: put(file,"old direction : "); put(file,v); new_line(file);
! 600: put(file,"new direction : "); put(file,res); new_line(file);
! 601: end if;
! 602: end if;
! 603: if r >= 1
! 604: then v := res;
! 605: Update_Errors(r,errorv,error,wvl0,wvl1,wvltmp);
! 606: end if;
! 607: if r < s'last then r := r+1; end if;
! 608: end Affine_Update_Direction;
! 609:
! 610: procedure Projective_Update_Direction
! 611: ( r,m,estm,cntm : in out natural; thresm : in natural;
! 612: er : in out integer; t,target : in Complex_Number;
! 613: x : in Standard_Complex_Vectors.Vector;
! 614: dt,s,logs : in out Standard_Floating_Vectors.Vector;
! 615: logx : in out VecVec;
! 616: prevv,v : in out Standard_Floating_Vectors.Vector;
! 617: error : in out double_float ) is
! 618:
! 619: use Standard_Floating_Vectors;
! 620: res : Standard_Floating_Vectors.Vector(v'range);
! 621: eps,newerr : double_float;
! 622: newm : boolean := false;
! 623:
! 624: begin
! 625: Projective_Update_Extrapolation_Data(r,m,t,target,x,dt,s,logs,logx);
! 626: if r >= 1
! 627: then res := vLpRs_Extrapolate(r,s,logs,logx);
! 628: error := Norm1(res-prevv); newerr := Norm1(res-v);
! 629: prevv := v;
! 630: v := res;
! 631: end if;
! 632: -- if r >= 2 and (newerr < error)
! 633: -- then Estimate(r,r,thresm,m,estm,cntm,dt,s,logs,error,newerr,eps,newm);
! 634: -- end if;
! 635: if r < s'last
! 636: then r := r+1;
! 637: end if;
! 638: error := newerr;
! 639: end Projective_Update_Direction;
! 640:
! 641: procedure Projective_Update_Direction
! 642: ( file : in file_type;
! 643: r,m,estm,cntm : in out natural; thresm : in natural;
! 644: er : in out integer; t,target : in Complex_Number;
! 645: x : in Standard_Complex_Vectors.Vector;
! 646: dt,s,logs : in out Standard_Floating_Vectors.Vector;
! 647: logx : in out VecVec;
! 648: prevv,v : in out Standard_Floating_Vectors.Vector;
! 649: error : in out double_float ) is
! 650:
! 651: use Standard_Floating_Vectors;
! 652: res : Standard_Floating_Vectors.Vector(v'range);
! 653: eps,newerr : double_float;
! 654: newm : boolean := false;
! 655:
! 656: begin
! 657: Projective_Update_Extrapolation_Data(r,m,t,target,x,dt,s,logs,logx);
! 658: Write_Update_Information(file,r,m,s(r),logs(r),logx(r).all);
! 659: if r >= 1
! 660: then res := vLpRs_Extrapolate(file,r,s,logs,logx);
! 661: error := Norm1(res-prevv);
! 662: newerr := Norm1(res-v);
! 663: prevv := v;
! 664: v := res;
! 665: end if;
! 666: if r < s'last
! 667: then r := r+1;
! 668: end if;
! 669: -- if r >= 2 and (newerr < error)
! 670: -- then Estimate(r,r,thresm,m,estm,cntm,dt,s,logs,error,newerr,eps,newm);
! 671: -- end if;
! 672: error := newerr;
! 673: end Projective_Update_Direction;
! 674:
! 675: end Directions_of_Solution_Paths;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>