Annotation of OpenXM_contrib/PHC/Ada/Continuation/standard_root_refiners.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_Complex_Numbers; use Standard_Complex_Numbers;
! 4: with Standard_Complex_Numbers_io; use Standard_Complex_Numbers_io;
! 5: with Standard_Complex_Vectors; use Standard_Complex_Vectors;
! 6: with Standard_Natural_Vectors;
! 7: with Standard_Complex_Matrices; use Standard_Complex_Matrices;
! 8: with Standard_Complex_Linear_Solvers; use Standard_Complex_Linear_Solvers;
! 9: with Standard_Complex_Norms_Equals; use Standard_Complex_Norms_Equals;
! 10: with Standard_Complex_Solutions_io; use Standard_Complex_Solutions_io;
! 11:
! 12: package body Standard_Root_Refiners is
! 13:
! 14: -- AUXILIARIES :
! 15:
! 16: function Is_Real ( sol : Solution; tol : double_float ) return boolean is
! 17: begin
! 18: for i in sol.v'range loop
! 19: if ABS(IMAG_PART(sol.v(i))) > tol
! 20: then return false;
! 21: end if;
! 22: end loop;
! 23: return true;
! 24: end Is_Real;
! 25:
! 26: function Equal ( s1,s2 : Solution; tol : double_float ) return boolean is
! 27: begin
! 28: for i in s1.v'range loop
! 29: if not Equal(s1.v(i),s2.v(i),tol)
! 30: then return false;
! 31: end if;
! 32: end loop;
! 33: return true;
! 34: end Equal;
! 35:
! 36: function Complex_Conjugate ( s : Solution ) return Solution is
! 37:
! 38: res : Solution(s.n) := s;
! 39:
! 40: begin
! 41: for i in res.v'range loop
! 42: res.v(i) := Create(REAL_PART(s.v(i)),-IMAG_PART(s.v(i)));
! 43: end loop;
! 44: return res;
! 45: end Complex_Conjugate;
! 46:
! 47: function Is_Clustered ( sol : Solution; nb : natural; sols : Solution_List;
! 48: tol : double_float ) return natural is
! 49:
! 50: tmp : Solution_List := sols;
! 51: cnt : natural := 0;
! 52:
! 53: begin
! 54: while not Is_Null(tmp) loop
! 55: cnt := cnt + 1;
! 56: if cnt /= nb
! 57: then if Equal(sol,Head_Of(tmp).all,tol)
! 58: then return cnt;
! 59: end if;
! 60: end if;
! 61: tmp := Tail_Of(tmp);
! 62: end loop;
! 63: return nb;
! 64: end Is_Clustered;
! 65:
! 66: function Is_Clustered ( sol : Solution; nb : natural; sols : Solution_Array;
! 67: tol : double_float ) return natural is
! 68: begin
! 69: for i in sols'range loop
! 70: if i /= nb
! 71: then if Equal(sol,sols(i).all,tol)
! 72: then return i;
! 73: end if;
! 74: end if;
! 75: end loop;
! 76: return nb;
! 77: end Is_Clustered;
! 78:
! 79: function Multiplicity ( sol : Solution; sols : Solution_List;
! 80: tol : double_float ) return natural is
! 81:
! 82: tmp : Solution_List := sols;
! 83: cnt : natural := 0;
! 84:
! 85: begin
! 86: while not Is_Null(tmp) loop
! 87: if Equal(sol,Head_Of(tmp).all,tol)
! 88: then cnt := cnt + 1;
! 89: end if;
! 90: tmp := Tail_Of(tmp);
! 91: end loop;
! 92: return cnt;
! 93: end Multiplicity;
! 94:
! 95: function Multiplicity ( sol : Solution; sols : Solution_Array;
! 96: tol : double_float ) return natural is
! 97: cnt : natural := 0;
! 98:
! 99: begin
! 100: for i in sols'range loop
! 101: if Equal(sol,sols(i).all,tol)
! 102: then cnt := cnt + 1;
! 103: end if;
! 104: end loop;
! 105: return cnt;
! 106: end Multiplicity;
! 107:
! 108: procedure Write_Bar ( file : in file_type ) is
! 109: begin
! 110: for i in 1..75 loop
! 111: put(file,'=');
! 112: end loop;
! 113: new_line(file);
! 114: end Write_Bar;
! 115:
! 116: procedure Write_Info ( file : in file_type; zero : in Solution;
! 117: i,n,numb : in natural; fail : in boolean ) is
! 118:
! 119: -- DESCRIPTION :
! 120: -- The information concerning the zero is written
! 121:
! 122: begin
! 123: -- Write_Bar(file);
! 124: put(file,"solution "); put(file,i,1); put(file," : ");
! 125: put(file," start residual : "); put(file,zero.res,2,3,3); new_line(file);
! 126: put(file,zero);
! 127: end Write_Info;
! 128:
! 129: procedure Root_Accounting
! 130: ( file : in file_type; ls : in out Link_to_Solution;
! 131: nb : in natural; sa : in out Solution_Array;
! 132: fail : in boolean; tolsing,tolclus : in double_float;
! 133: nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus : in out natural ) is
! 134:
! 135: -- DESCRIPTION :
! 136: -- This procedure does root accounting of the solution sol, w.r.t. the
! 137: -- solution list sols. Information will be provided concerning the type
! 138: -- of solution.
! 139:
! 140: begin
! 141: if fail
! 142: then put_line(file," no solution ==");
! 143: nbfail := nbfail + 1;
! 144: ls.m := 0;
! 145: else if Is_Real(ls.all,10.0**(-13))
! 146: then put(file," real ");
! 147: nbreal := nbreal + 1;
! 148: else put(file," complex ");
! 149: nbcomp := nbcomp + 1;
! 150: end if;
! 151: if sa(nb).rco < tolsing
! 152: then declare
! 153: m : natural := Multiplicity(ls.all,sa,tolclus);
! 154: begin
! 155: if m = 1
! 156: then m := 0;
! 157: end if;
! 158: ls.m := m;
! 159: end;
! 160: put_line(file,"singular ==");
! 161: nbsing := nbsing + 1;
! 162: else declare
! 163: nb2 : natural := Is_Clustered(ls.all,nb,sa,tolclus);
! 164: begin
! 165: if nb2 = nb
! 166: then put_line(file,"regular ==");
! 167: nbreg := nbreg + 1;
! 168: else put(file,"clustered : ");
! 169: put(file,nb2,1);
! 170: put_line(file," ==");
! 171: nbclus := nbclus + 1;
! 172: end if;
! 173: ls.m := 1;
! 174: end;
! 175: end if;
! 176: end if;
! 177: end Root_Accounting;
! 178:
! 179: procedure Root_Accounting
! 180: ( ls : in out Link_to_Solution; nb : in natural;
! 181: sa : in out Solution_Array; fail : in boolean;
! 182: tolsing,tolclus : in double_float ) is
! 183:
! 184: -- DESCRIPTION :
! 185: -- This procedure does root accounting of the solution sol, w.r.t. the
! 186: -- solution list sols. Information will be provided concerning the type
! 187: -- of solution.
! 188:
! 189: begin
! 190: if fail
! 191: then ls.m := 0;
! 192: elsif sa(nb).rco < tolsing
! 193: then declare
! 194: m : natural := Multiplicity(ls.all,sa,tolclus);
! 195: begin
! 196: if m = 1
! 197: then ls.m := 0;
! 198: else ls.m := m;
! 199: end if;
! 200: end;
! 201: else ls.m := 1;
! 202: end if;
! 203: end Root_Accounting;
! 204:
! 205: procedure Write_Global_Info
! 206: ( file : in file_type;
! 207: tot,nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus : in natural ) is
! 208:
! 209: begin
! 210: Write_Bar(file);
! 211: put(file,"A list of "); put(file,tot,1);
! 212: put_line(file," solutions has been refined :");
! 213: put(file,"Number of regular solutions : "); put(file,nbreg,1);
! 214: put_line(file,".");
! 215: put(file,"Number of singular solutions : "); put(file,nbsing,1);
! 216: put_line(file,".");
! 217: put(file,"Number of real solutions : "); put(file,nbreal,1);
! 218: put_line(file,".");
! 219: put(file,"Number of complex solutions : "); put(file,nbcomp,1);
! 220: put_line(file,".");
! 221: put(file,"Number of clustered solutions : "); put(file,nbclus,1);
! 222: put_line(file,".");
! 223: put(file,"Number of failures : "); put(file,nbfail,1);
! 224: put_line(file,".");
! 225: Write_Bar(file);
! 226: end Write_Global_Info;
! 227:
! 228: -- TARGET ROUTINES :
! 229:
! 230: procedure Silent_Newton
! 231: ( p_eval : in Eval_Poly_Sys; j_eval : in Eval_Jaco_Mat;
! 232: zero : in out Solution; epsxa,epsfa : in double_float;
! 233: numit : in out natural; max : in natural;
! 234: fail : out boolean ) is
! 235:
! 236: n : natural := zero.n;
! 237: jacobian : matrix(1..n,1..n);
! 238: ipvt : Standard_Natural_Vectors.Vector(1..n);
! 239: y,deltax : Vector(1..n);
! 240:
! 241: begin
! 242: y := eval(p_eval,zero.v); -- y = f(zero)
! 243: for i in 1..max loop
! 244: jacobian := eval(j_eval,zero.v); -- solve jacobian*deltax = -f(zero)
! 245: lufco(jacobian,n,ipvt,zero.rco);
! 246: if 1.0 + zero.rco = 1.0
! 247: then fail := (Sum_Norm(y) > epsfa);
! 248: return; -- singular Jacobian matrix
! 249: end if;
! 250: deltax := -y;
! 251: lusolve(jacobian,n,ipvt,deltax);
! 252: Add(zero.v,deltax); -- make the updates
! 253: y := eval(p_eval,zero.v);
! 254: zero.err := Sum_Norm(deltax); zero.res := Sum_Norm(y);
! 255: numit := numit + 1;
! 256: if ( zero.err < epsxa ) or else ( zero.res < epsfa )
! 257: -- stopping criteria
! 258: then fail := false; exit;
! 259: elsif numit >= max
! 260: then fail := true; exit;
! 261: end if;
! 262: end loop;
! 263: jacobian := eval(j_eval,zero.v); -- compute condition number
! 264: lufco(jacobian,n,ipvt,zero.rco);
! 265: exception
! 266: when numeric_error | constraint_error => fail := true; return;
! 267: end Silent_Newton;
! 268:
! 269: procedure Silent_Newton
! 270: ( p_eval : in Standard_Complex_Poly_SysFun.Evaluator;
! 271: j_eval : in Standard_Complex_Jaco_Matrices.Evaluator;
! 272: zero : in out Solution; epsxa,epsfa : in double_float;
! 273: numit : in out natural; max : in natural;
! 274: fail : out boolean ) is
! 275:
! 276: n : natural := zero.n;
! 277: jacobian : matrix(1..n,1..n);
! 278: ipvt : Standard_Natural_Vectors.Vector(1..n);
! 279: y,deltax : Vector(1..n);
! 280:
! 281: begin
! 282: y := p_eval(zero.v); -- y = f(zero)
! 283: for i in 1..max loop
! 284: jacobian := j_eval(zero.v); -- solve jacobian*deltax = -f(zero)
! 285: lufco(jacobian,n,ipvt,zero.rco);
! 286: if 1.0 + zero.rco = 1.0
! 287: then fail := (Sum_Norm(y) > epsfa);
! 288: return; -- singular Jacobian matrix
! 289: end if;
! 290: deltax := -y;
! 291: lusolve(jacobian,n,ipvt,deltax);
! 292: Add(zero.v,deltax); -- make the updates
! 293: y := p_eval(zero.v);
! 294: zero.err := Sum_Norm(deltax); zero.res := Sum_Norm(y);
! 295: numit := numit + 1;
! 296: if ( zero.err < epsxa ) or else ( zero.res < epsfa )
! 297: -- stopping criteria
! 298: then fail := false; exit;
! 299: elsif numit >= max
! 300: then fail := true; exit;
! 301: end if;
! 302: end loop;
! 303: jacobian := j_eval(zero.v); -- compute condition number
! 304: lufco(jacobian,n,ipvt,zero.rco);
! 305: exception
! 306: when numeric_error | constraint_error => fail := true; return;
! 307: end Silent_Newton;
! 308:
! 309: procedure Reporting_Newton
! 310: ( file : in file_type;
! 311: p_eval : in Eval_Poly_Sys; j_eval : in Eval_Jaco_Mat;
! 312: zero : in out Solution; epsxa,epsfa : in double_float;
! 313: numit : in out natural; max : in natural;
! 314: fail : out boolean ) is
! 315:
! 316: n : natural := zero.n;
! 317: jacobian : matrix(1..n,1..n);
! 318: ipvt : Standard_Natural_Vectors.Vector(1..n);
! 319: y,deltax : Vector(1..n);
! 320:
! 321: begin
! 322: y := Eval(p_eval,zero.v); -- y = f(zero)
! 323: for i in 1..max loop
! 324: jacobian := eval(j_eval,zero.v); -- solve jacobian*deltax = -f(zero)
! 325: lufco(jacobian,n,ipvt,zero.rco);
! 326: if 1.0 + zero.rco = 1.0 -- singular jacobian matrix
! 327: then fail := (Sum_Norm(y) > epsfa); -- accuracy not reached yet
! 328: return;
! 329: end if;
! 330: deltax := -y;
! 331: lusolve(jacobian,n,ipvt,deltax);
! 332: Add(zero.v,deltax); -- make the updates
! 333: y := eval(p_eval,zero.v);
! 334: zero.err := Sum_Norm(deltax); zero.res := Sum_Norm(y);
! 335: numit := numit + 1;
! 336: put(file,"Step "); put(file,numit,4); new_line(file); -- output
! 337: put(file," |errxa| : "); put(file,zero.err); new_line(file);
! 338: put(file," |errfa| : "); put(file,zero.res); new_line(file);
! 339: if ( zero.err < epsxa ) or else ( zero.res < epsfa )
! 340: -- stopping criteria
! 341: then fail := false; exit;
! 342: elsif numit >= max
! 343: then fail := true; exit;
! 344: end if;
! 345: end loop;
! 346: jacobian := eval(j_eval,zero.v); -- compute condition number
! 347: lufco(jacobian,n,ipvt,zero.rco);
! 348: exception
! 349: when numeric_error | constraint_error => fail := true; return;
! 350: end Reporting_Newton;
! 351:
! 352: procedure Reporting_Newton
! 353: ( file : in file_type;
! 354: p_eval : in Standard_Complex_Poly_SysFun.Evaluator;
! 355: j_eval : in Standard_Complex_Jaco_Matrices.Evaluator;
! 356: zero : in out Solution; epsxa,epsfa : in double_float;
! 357: numit : in out natural; max : in natural;
! 358: fail : out boolean ) is
! 359:
! 360: n : natural := zero.n;
! 361: jacobian : matrix(1..n,1..n);
! 362: ipvt : Standard_Natural_Vectors.Vector(1..n);
! 363: y,deltax : Vector(1..n);
! 364:
! 365: begin
! 366: y := p_eval(zero.v); -- y = f(zero)
! 367: for i in 1..max loop
! 368: jacobian := j_eval(zero.v); -- solve jacobian*deltax = -f(zero)
! 369: lufco(jacobian,n,ipvt,zero.rco);
! 370: if 1.0 + zero.rco = 1.0 -- singular jacobian matrix
! 371: then fail := (Sum_Norm(y) > epsfa); -- accuracy not reached yet
! 372: return;
! 373: end if;
! 374: deltax := -y;
! 375: lusolve(jacobian,n,ipvt,deltax);
! 376: Add(zero.v,deltax); -- make the updates
! 377: y := p_eval(zero.v);
! 378: zero.err := Sum_Norm(deltax); zero.res := Sum_Norm(y);
! 379: numit := numit + 1;
! 380: put(file,"Step "); put(file,numit,4); new_line(file); -- output
! 381: put(file," |errxa| : "); put(file,zero.err); new_line(file);
! 382: put(file," |errfa| : "); put(file,zero.res); new_line(file);
! 383: if ( zero.err < epsxa ) or else ( zero.res < epsfa )
! 384: -- stopping criteria
! 385: then fail := false; exit;
! 386: elsif numit >= max
! 387: then fail := true; exit;
! 388: end if;
! 389: end loop;
! 390: jacobian := j_eval(zero.v); -- compute condition number
! 391: lufco(jacobian,n,ipvt,zero.rco);
! 392: exception
! 393: when numeric_error | constraint_error => fail := true; return;
! 394: end Reporting_Newton;
! 395:
! 396: procedure Silent_Root_Refiner
! 397: ( p : in Poly_Sys; sols : in out Solution_List;
! 398: epsxa,epsfa,tolsing : in double_float;
! 399: numit : in out natural; max : in natural ) is
! 400:
! 401: n : natural := p'length;
! 402: p_eval : Eval_Poly_Sys(1..n) := Create(p);
! 403: jac : Jaco_Mat(1..n,1..n) := Create(p);
! 404: jac_eval : Eval_Jaco_Mat(1..n,1..n) := Create(jac);
! 405: numb : natural;
! 406: fail : boolean;
! 407: sa : Solution_Array(1..Length_Of(sols)) := Create(sols);
! 408:
! 409: begin
! 410: for i in sa'range loop
! 411: numb := 0;
! 412: sa(i).res := Sum_Norm(Eval(p_eval,sa(i).v));
! 413: if sa(i).res < 1.0
! 414: then Silent_Newton(p_eval,jac_eval,sa(i).all,epsxa,epsfa,numb,max,fail);
! 415: else fail := true;
! 416: end if;
! 417: Root_Accounting(sa(i),i,sa(sa'first..i),fail,tolsing,epsxa);
! 418: numit := numit + numb;
! 419: end loop;
! 420: clear(p_eval); clear(jac); clear(jac_eval);
! 421: Deep_Clear(sols); sols := Create(sa); Clear(sa);
! 422: end Silent_Root_Refiner;
! 423:
! 424: procedure Silent_Root_Refiner
! 425: ( p : in Standard_Complex_Poly_SysFun.Evaluator;
! 426: j : in Standard_Complex_Jaco_Matrices.Evaluator;
! 427: sols : in out Solution_List;
! 428: epsxa,epsfa,tolsing : in double_float;
! 429: numit : in out natural; max : in natural ) is
! 430:
! 431: n : constant natural := Head_Of(sols).n;
! 432: numb : natural;
! 433: fail : boolean;
! 434: sa : Solution_Array(1..Length_Of(sols)) := Create(sols);
! 435:
! 436: begin
! 437: for i in sa'range loop
! 438: numb := 0;
! 439: sa(i).res := Sum_Norm(p(sa(i).v));
! 440: if sa(i).res < 1.0
! 441: then Silent_Newton(p,j,sa(i).all,epsxa,epsfa,numb,max,fail);
! 442: else fail := true;
! 443: end if;
! 444: Root_Accounting(sa(i),i,sa(sa'first..i),fail,tolsing,epsxa);
! 445: numit := numit + numb;
! 446: end loop;
! 447: Deep_Clear(sols); sols := Create(sa); Clear(sa);
! 448: end Silent_Root_Refiner;
! 449:
! 450: procedure Silent_Root_Refiner
! 451: ( p : in Poly_Sys; sols,refsols : in out Solution_List;
! 452: epsxa,epsfa,tolsing : in double_float;
! 453: numit : in out natural; max : in natural ) is
! 454:
! 455: n : natural := p'length;
! 456: p_eval : Eval_Poly_Sys(1..n) := Create(p);
! 457: jac : Jaco_Mat(1..n,1..n) := Create(p);
! 458: jac_eval : Eval_Jaco_Mat(1..n,1..n) := Create(jac);
! 459: numb : natural;
! 460: fail : boolean;
! 461: sa : Solution_Array(1..Length_Of(sols)) := Create(sols);
! 462: refsols_last : Solution_List;
! 463:
! 464: begin
! 465: for i in sa'range loop
! 466: numb := 0;
! 467: sa(i).res := Sum_Norm(Eval(p_eval,sa(i).v));
! 468: if sa(i).res < 1.0
! 469: then Silent_Newton(p_eval,jac_eval,sa(i).all,epsxa,epsfa,numb,max,fail);
! 470: if not fail
! 471: then Append(refsols,refsols_last,sa(i).all);
! 472: end if;
! 473: else fail := true;
! 474: end if;
! 475: Root_Accounting(sa(i),i,sa(sa'first..i),fail,tolsing,epsxa);
! 476: numit := numit + numb;
! 477: end loop;
! 478: clear(p_eval); clear(jac); clear(jac_eval);
! 479: Deep_Clear(sols); sols := Create(sa); Clear(sa);
! 480: end Silent_Root_Refiner;
! 481:
! 482: procedure Silent_Root_Refiner
! 483: ( p : in Standard_Complex_Poly_SysFun.Evaluator;
! 484: j : in Standard_Complex_Jaco_Matrices.Evaluator;
! 485: sols,refsols : in out Solution_List;
! 486: epsxa,epsfa,tolsing : in double_float;
! 487: numit : in out natural; max : in natural ) is
! 488:
! 489: n : constant natural := Head_Of(sols).n;
! 490: numb : natural;
! 491: fail : boolean;
! 492: sa : Solution_Array(1..Length_Of(sols)) := Create(sols);
! 493: refsols_last : Solution_List;
! 494:
! 495: begin
! 496: for i in sa'range loop
! 497: numb := 0;
! 498: sa(i).res := Sum_Norm(p(sa(i).v));
! 499: if sa(i).res < 1.0
! 500: then Silent_Newton(p,j,sa(i).all,epsxa,epsfa,numb,max,fail);
! 501: if not fail
! 502: then Append(refsols,refsols_last,sa(i).all);
! 503: end if;
! 504: else fail := true;
! 505: end if;
! 506: Root_Accounting(sa(i),i,sa(sa'first..i),fail,tolsing,epsxa);
! 507: numit := numit + numb;
! 508: end loop;
! 509: Deep_Clear(sols); sols := Create(sa); Clear(sa);
! 510: end Silent_Root_Refiner;
! 511:
! 512: procedure Reporting_Root_Refiner
! 513: ( file : in file_type;
! 514: p : in Poly_Sys; sols : in out Solution_List;
! 515: epsxa,epsfa,tolsing : in double_float;
! 516: numit : in out natural; max : in natural;
! 517: wout : in boolean ) is
! 518:
! 519: n : natural := p'length;
! 520: p_eval : Eval_Poly_Sys(1..n) := Create(p);
! 521: jac : Jaco_Mat(1..n,1..n) := Create(p);
! 522: jac_eval : Eval_Jaco_Mat(1..n,1..n) := Create(jac);
! 523: numb : natural;
! 524: nbfail,nbreg,nbsing,nbclus,nbreal,nbcomp : natural := 0;
! 525: nbtot : constant natural := Length_Of(sols);
! 526: fail : boolean;
! 527: sa : Solution_Array(1..nbtot) := Create(sols);
! 528:
! 529: begin
! 530: new_line(file);
! 531: put_line(file,"THE SOLUTIONS :"); new_line(file);
! 532: put(file,nbtot,1); put(file," "); put(file,n,1); new_line(file);
! 533: Write_Bar(file);
! 534: for i in sa'range loop
! 535: numb := 0;
! 536: sa(i).res := Sum_Norm(Eval(p_eval,sa(i).v));
! 537: if sa(i).res < 1.0
! 538: then
! 539: if wout
! 540: then Reporting_Newton
! 541: (file,p_eval,jac_eval,sa(i).all,epsxa,epsfa,numb,max,fail);
! 542: else Silent_Newton
! 543: (p_eval,jac_eval,sa(i).all,epsxa,epsfa,numb,max,fail);
! 544: end if;
! 545: else
! 546: fail := true;
! 547: end if;
! 548: Write_Info(file,sa(i).all,i,n,numb,fail);
! 549: Root_Accounting(file,sa(i),i,sa(sa'first..i),fail,tolsing,epsxa,
! 550: nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
! 551: numit := numit + numb;
! 552: end loop;
! 553: Write_Global_Info(file,nbtot,nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
! 554: clear(p_eval); clear(jac); clear(jac_eval);
! 555: Deep_Clear(sols); sols := Create(sa); Clear(sa);
! 556: end Reporting_Root_Refiner;
! 557:
! 558: procedure Reporting_Root_Refiner
! 559: ( file : in file_type;
! 560: p : in Standard_Complex_Poly_SysFun.Evaluator;
! 561: j : in Standard_Complex_Jaco_Matrices.Evaluator;
! 562: sols : in out Solution_List;
! 563: epsxa,epsfa,tolsing : in double_float;
! 564: numit : in out natural; max : in natural;
! 565: wout : in boolean ) is
! 566:
! 567: n : constant natural := Head_Of(sols).n;
! 568: numb : natural;
! 569: nbfail,nbreg,nbsing,nbclus,nbreal,nbcomp : natural := 0;
! 570: nbtot : constant natural := Length_Of(sols);
! 571: fail : boolean;
! 572: sa : Solution_Array(1..nbtot) := Create(sols);
! 573:
! 574: begin
! 575: new_line(file);
! 576: put_line(file,"THE SOLUTIONS :"); new_line(file);
! 577: put(file,nbtot,1); put(file," "); put(file,n,1); new_line(file);
! 578: Write_Bar(file);
! 579: for i in sa'range loop
! 580: numb := 0;
! 581: sa(i).res := Sum_Norm(p(sa(i).v));
! 582: if sa(i).res < 1.0
! 583: then
! 584: if wout
! 585: then Reporting_Newton(file,p,j,sa(i).all,epsxa,epsfa,numb,max,fail);
! 586: else Silent_Newton(p,j,sa(i).all,epsxa,epsfa,numb,max,fail);
! 587: end if;
! 588: else
! 589: fail := true;
! 590: end if;
! 591: Write_Info(file,sa(i).all,i,n,numb,fail);
! 592: Root_Accounting(file,sa(i),i,sa(sa'first..i),fail,tolsing,epsxa,
! 593: nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
! 594: numit := numit + numb;
! 595: end loop;
! 596: Write_Global_Info(file,nbtot,nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
! 597: Deep_Clear(sols); sols := Create(sa); Clear(sa);
! 598: end Reporting_Root_Refiner;
! 599:
! 600: procedure Reporting_Root_Refiner
! 601: ( file : in file_type;
! 602: p : in Poly_Sys; sols,refsols : in out Solution_List;
! 603: epsxa,epsfa,tolsing : in double_float;
! 604: numit : in out natural; max : in natural;
! 605: wout : in boolean ) is
! 606:
! 607: n : natural := p'length;
! 608: p_eval : Eval_Poly_Sys(1..n) := Create(p);
! 609: jac : Jaco_Mat(1..n,1..n) := Create(p);
! 610: jac_eval : Eval_Jaco_Mat(1..n,1..n) := Create(jac);
! 611: numb : natural;
! 612: nbfail,nbreg,nbsing,nbclus,nbreal,nbcomp : natural := 0;
! 613: nbtot : constant natural := Length_Of(sols);
! 614: fail : boolean;
! 615: sa : Solution_Array(1..nbtot) := Create(sols);
! 616: refsols_last : Solution_List;
! 617:
! 618: begin
! 619: new_line(file);
! 620: put_line(file,"THE SOLUTIONS :"); new_line(file);
! 621: put(file,nbtot,1); put(file," "); put(file,n,1); new_line(file);
! 622: Write_Bar(file);
! 623: for i in sa'range loop
! 624: numb := 0;
! 625: sa(i).res := Sum_Norm(Eval(p_eval,sa(i).v));
! 626: if sa(i).res < 1.0
! 627: then
! 628: if wout
! 629: then Reporting_Newton
! 630: (file,p_eval,jac_eval,sa(i).all,epsxa,epsfa,numb,max,fail);
! 631: else Silent_Newton
! 632: (p_eval,jac_eval,sa(i).all,epsxa,epsfa,numb,max,fail);
! 633: end if;
! 634: if not fail
! 635: then Append(refsols,refsols_last,sa(i).all);
! 636: end if;
! 637: else
! 638: fail := true;
! 639: end if;
! 640: Write_Info(file,sa(i).all,i,n,numb,fail);
! 641: Root_Accounting(file,sa(i),i,sa(sa'first..i),fail,tolsing,epsxa,
! 642: nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
! 643: numit := numit + numb;
! 644: end loop;
! 645: Write_Global_Info(file,nbtot,nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
! 646: clear(p_eval); clear(jac); clear(jac_eval);
! 647: Deep_Clear(sols); sols := Create(sa); Clear(sa);
! 648: end Reporting_Root_Refiner;
! 649:
! 650: procedure Reporting_Root_Refiner
! 651: ( file : in file_type;
! 652: p : in Standard_Complex_Poly_SysFun.Evaluator;
! 653: j : in Standard_Complex_Jaco_Matrices.Evaluator;
! 654: sols,refsols : in out Solution_List;
! 655: epsxa,epsfa,tolsing : in double_float;
! 656: numit : in out natural; max : in natural;
! 657: wout : in boolean ) is
! 658:
! 659: n : constant natural := Head_Of(sols).n;
! 660: numb : natural;
! 661: nbfail,nbreg,nbsing,nbclus,nbreal,nbcomp : natural := 0;
! 662: nbtot : constant natural := Length_Of(sols);
! 663: fail : boolean;
! 664: sa : Solution_Array(1..nbtot) := Create(sols);
! 665: refsols_last : Solution_List;
! 666:
! 667: begin
! 668: new_line(file);
! 669: put_line(file,"THE SOLUTIONS :"); new_line(file);
! 670: put(file,nbtot,1); put(file," "); put(file,n,1); new_line(file);
! 671: Write_Bar(file);
! 672: for i in sa'range loop
! 673: numb := 0;
! 674: sa(i).res := Sum_Norm(p(sa(i).v));
! 675: if sa(i).res < 1.0
! 676: then
! 677: if wout
! 678: then Reporting_Newton(file,p,j,sa(i).all,epsxa,epsfa,numb,max,fail);
! 679: else Silent_Newton(p,j,sa(i).all,epsxa,epsfa,numb,max,fail);
! 680: end if;
! 681: if not fail
! 682: then Append(refsols,refsols_last,sa(i).all);
! 683: end if;
! 684: else
! 685: fail := true;
! 686: end if;
! 687: Write_Info(file,sa(i).all,i,n,numb,fail);
! 688: Root_Accounting(file,sa(i),i,sa(sa'first..i),fail,tolsing,epsxa,
! 689: nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
! 690: numit := numit + numb;
! 691: end loop;
! 692: Write_Global_Info(file,nbtot,nbfail,nbreal,nbcomp,nbreg,nbsing,nbclus);
! 693: Deep_Clear(sols); sols := Create(sa); Clear(sa);
! 694: end Reporting_Root_Refiner;
! 695:
! 696: end Standard_Root_Refiners;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>