Annotation of OpenXM_contrib/PHC/Ada/Continuation/increment_and_fix_continuation.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_io; use Standard_Complex_Numbers_io;
! 4: with Standard_Complex_Solutions_io; use Standard_Complex_Solutions_io;
! 5: with Path_Trackers; use Path_Trackers;
! 6: with Continuation_Parameters; use Continuation_Parameters;
! 7: with Continuation_Data; use Continuation_Data;
! 8:
! 9: package body Increment_and_Fix_Continuation is
! 10:
! 11: -- AUXILIAIRIES :
! 12:
! 13: function At_Infinity ( s : Solution; proj : boolean ) return boolean is
! 14:
! 15: -- DESCRIPTION :
! 16: -- Decides whether a given solution lies at infinity.
! 17:
! 18: begin
! 19: if proj
! 20: then if AbsVal(s.v(s.v'last)) < 1.0/tol_endg_at_infinity
! 21: then return true;
! 22: else return false;
! 23: end if;
! 24: else for i in 1..s.n loop
! 25: if AbsVal(s.v(i)) > tol_endg_at_infinity
! 26: then return true;
! 27: end if;
! 28: end loop;
! 29: return false;
! 30: end if;
! 31: end At_Infinity;
! 32:
! 33: function Equals ( s : in Solu_Info_Array; x : in Vector; i : in natural;
! 34: d : in double_float; proj : in boolean ) return natural is
! 35:
! 36: -- DESCRIPTION :
! 37: -- Returns the index j in the solution array s(s'first..i) of the
! 38: -- solution which equals x.
! 39:
! 40: eq : boolean := false;
! 41: j : natural := s'first;
! 42:
! 43: begin
! 44: while j < i loop
! 45: if not At_Infinity(s(j).sol.all,proj)
! 46: then eq := true;
! 47: if proj
! 48: then for k in x'range loop
! 49: if AbsVal(s(j).sol.v(k)/s(j).sol.v(x'last)
! 50: - x(k)/x(x'last)) > d
! 51: then eq := false; exit;
! 52: end if;
! 53: end loop;
! 54: else for k in x'range loop
! 55: if AbsVal(s(j).sol.v(k) - x(k)) > d
! 56: then eq := false; exit;
! 57: end if;
! 58: end loop;
! 59: end if;
! 60: end if;
! 61: exit when eq;
! 62: j := j + 1;
! 63: end loop;
! 64: return j;
! 65: end Equals;
! 66:
! 67: procedure Add_Clustered ( i,n : in natural; sols : in Solution_List;
! 68: clusols : in out Solution_List ) is
! 69:
! 70: -- DESCRIPTION :
! 71: -- Adds the ith start solution to the list clusols.
! 72: -- The multiplicity of the solution equals i.
! 73:
! 74: s : Solution(n) := Get(sols,i);
! 75: tol : constant double_float := 10.0**(-12);
! 76:
! 77: begin
! 78: if not Is_In(clusols,s,tol)
! 79: then s.m := i;
! 80: Add(clusols,s);
! 81: end if;
! 82: end Add_Clustered;
! 83:
! 84: procedure Write_Bar ( file : in file_type ) is
! 85: begin
! 86: put(file,"========================================");
! 87: put_line(file,"===================================");
! 88: end Write_Bar;
! 89:
! 90: procedure Write_Statistics ( file : in file_type;
! 91: i,nstep,nfail,niter,nsyst : in natural ) is
! 92:
! 93: -- DESCRIPTION :
! 94: -- Writes the computing statistics of the ith path on file.
! 95:
! 96: begin
! 97: put(file,"== "); put(file,i,1); put(file," = ");
! 98: put(file," #step : "); put(file,nstep,3);
! 99: put(file," #fail : "); put(file,nfail,2);
! 100: put(file," #iter : "); put(file,niter,3);
! 101: if nsyst /= niter
! 102: then put(file," #syst : "); put(file,nsyst,3);
! 103: end if;
! 104: put(file," = ");
! 105: end Write_Statistics;
! 106:
! 107: procedure Write_Diagnostics
! 108: ( file : in file_type; s : in out Solu_Info_Array;
! 109: c : in Corr_Pars; tol : in double_float; i : in natural;
! 110: proj : in boolean;
! 111: ninfi,nregu,nsing,nclus,nfail : in out natural;
! 112: sols : in Solution_List; clusols : in out Solution_List ) is
! 113:
! 114: -- DESCRIPTION :
! 115: -- Writes the diagnostics for the ith solution.
! 116: -- If it is a clustered solution, then the corresponding start solution
! 117: -- will be added from the list sols to the list clusols.
! 118:
! 119: j : natural;
! 120:
! 121: begin
! 122: if At_Infinity(s(i).sol.all,proj)
! 123: then ninfi := ninfi + 1;
! 124: put_line(file,"at infinity ==");
! 125: elsif ((s(i).cora <= c.epsax) or else (s(i).resa <= c.epsaf)
! 126: or else (s(i).corr <= c.epsrx) or else (s(i).resr <= c.epsrf))
! 127: then j := Equals(s,s(i).sol.v,i,tol,proj);
! 128: if j = i
! 129: then if s(i).rcond > tol_endg_inverse_condition
! 130: then nregu := nregu + 1;
! 131: put_line(file,"regular solution ==");
! 132: else nsing := nsing + 1;
! 133: put_line(file,"singular solution ==");
! 134: end if;
! 135: elsif s(i).rcond < tol_endg_inverse_condition
! 136: then nsing := nsing + 1;
! 137: s(j).sol.m := s(j).sol.m + 1;
! 138: s(i).sol.m := s(i).sol.m + 1;
! 139: put(file,"multiple, see ");
! 140: put(file,j,1); put_line(file," ==");
! 141: else nclus := nclus + 1;
! 142: put(file,"clustered with ");
! 143: put(file,j,1); put_line(file," ==");
! 144: Add_Clustered(i,s(i).sol.n,sols,clusols);
! 145: Add_Clustered(j,s(j).sol.n,sols,clusols);
! 146: end if;
! 147: elsif s(i).rcond < tol_endg_inverse_condition
! 148: then nfail := nfail + 1;
! 149: put_line(file,"failure ==");
! 150: else nfail := nfail + 1;
! 151: put_line(file,"failure ==");
! 152: end if;
! 153: end Write_Diagnostics;
! 154:
! 155: procedure Write_Solution ( file : in file_type; s : in Solu_Info ) is
! 156:
! 157: -- DESCRIPTION :
! 158: -- Writes the solution and the length of the path on file.
! 159:
! 160: begin
! 161: put(file,"t : "); put(file,s.sol.t); new_line(file);
! 162: put(file,"m : "); put(file,s.sol.m,1);
! 163: put(file," Length of path : ");
! 164: put(file,s.length_path);
! 165: new_line(file);
! 166: put_line(file,"the solution for t : ");
! 167: put_vector(file,s.sol.all);
! 168: put(file,"==");
! 169: put(file," err : "); put(file,s.cora,2,3,3); put(file," =");
! 170: put(file," rco : "); put(file,s.rcond,2,3,3); put(file," =");
! 171: put(file," res : "); put(file,s.resa,2,3,3); put_line(file," ==");
! 172: end Write_Solution;
! 173:
! 174: procedure Diagnostics
! 175: ( s : in out Solu_Info_Array; c : in Corr_Pars;
! 176: tol : in double_float;i : in natural; proj : in boolean;
! 177: ninfi,nregu,nsing,nclus,nfail : in out natural;
! 178: sols : in Solution_List; clusols : in out Solution_List ) is
! 179:
! 180: -- DESCRIPTION :
! 181: -- Analyzes the ith solution. If it is a clustered solution, then the
! 182: -- corresponding start solution from the list sols will be added to the
! 183: -- list clusols.
! 184:
! 185: j : natural;
! 186:
! 187: begin
! 188: if At_Infinity(s(i).sol.all,proj)
! 189: then ninfi := ninfi + 1;
! 190: elsif ((s(i).cora <= c.epsax) or else (s(i).resa <= c.epsaf)
! 191: or else (s(i).corr <= c.epsrx) or else (s(i).resr <= c.epsrf))
! 192: then j := Equals(s,s(i).sol.v,i,tol,proj);
! 193: if j = i
! 194: then if s(i).rcond > tol_endg_inverse_condition
! 195: then nregu := nregu + 1;
! 196: else nsing := nsing + 1;
! 197: end if;
! 198: elsif s(i).rcond < tol_endg_inverse_condition
! 199: then nsing := nsing + 1;
! 200: s(j).sol.m := s(j).sol.m + 1;
! 201: s(i).sol.m := s(i).sol.m + 1;
! 202: else nclus := nclus + 1;
! 203: Add_Clustered(i,s(i).sol.n,sols,clusols);
! 204: Add_Clustered(j,s(j).sol.n,sols,clusols);
! 205: end if;
! 206: elsif s(i).rcond < tol_endg_inverse_condition
! 207: then nfail := nfail + 1;
! 208: else nfail := nfail + 1;
! 209: end if;
! 210: end Diagnostics;
! 211:
! 212: procedure Write_Summary_Diagnostics
! 213: ( file : in file_type;
! 214: ninfi,nregu,nsing,nfail,nclus : in natural ) is
! 215:
! 216: -- DESCRIPTION :
! 217: -- Writes a summary after the continuation.
! 218:
! 219: begin
! 220: put(file,"== ");
! 221: put(file,"#regu : "); put(file,nregu,1); put(file," = " );
! 222: put(file,"#sing : "); put(file,nsing,1); put(file," = " );
! 223: put(file,"#clus : "); put(file,nclus,1); put(file," = " );
! 224: put(file,"#infi : "); put(file,ninfi,1); put(file," = " );
! 225: put(file,"#fail : "); put(file,nfail,1);
! 226: put_line(file," == " );
! 227: end Write_Summary_Diagnostics;
! 228:
! 229: procedure Merge_Clustered
! 230: ( s : in out Solu_Info_Array; clusols : in Solution_List ) is
! 231:
! 232: -- DESCRIPTION :
! 233: -- The new solutions, which were clustered before, are merged with
! 234: -- the solution array, by using there multiplicity.
! 235:
! 236: tmp : Solution_List := clusols;
! 237: ls : Link_to_Solution;
! 238:
! 239: begin
! 240: while not Is_Null(tmp) loop
! 241: ls := Head_Of(tmp);
! 242: s(ls.m).sol := new Solution'(ls.all);
! 243: tmp := Tail_Of(tmp);
! 244: end loop;
! 245: end Merge_Clustered;
! 246:
! 247: -- TARGET ROUTINES :
! 248:
! 249: procedure Silent_Continue
! 250: ( sols : in out Solution_List; proj : in boolean;
! 251: target : in Complex_Number := Create(1.0) ) is
! 252:
! 253: sia : Solu_Info_Array(1..Length_Of(sols)) := Deep_Create(sols);
! 254: ppa,pen : Pred_Pars;
! 255: cpa,cen : Corr_Pars;
! 256: tol : constant double_float := 10.0**(-10);
! 257: dumv : Standard_Floating_Vectors.Link_to_Vector;
! 258: err : double_float;
! 259:
! 260: procedure LCont1 is
! 261: new Linear_Single_Normal_Silent_Continue(Norm,H,dH,dH);
! 262: procedure LCont2 is
! 263: new Linear_Single_Conditioned_Silent_Continue(Norm,H,dH,dH);
! 264: procedure LContN1 is
! 265: new Linear_Multiple_Normal_Silent_Continue(Norm,H,dH,dH);
! 266:
! 267: procedure Rerun_Clustered
! 268: ( s : in out Solu_Info_Array;
! 269: clusols : in out Solution_List ) is
! 270:
! 271: oldmax : natural := max_reruns;
! 272: oldblk : natural := block_size;
! 273:
! 274: begin
! 275: condition := condition + 1;
! 276: Continuation_Parameters.Tune(condition);
! 277: max_reruns := oldmax - 1;
! 278: block_size := Length_Of(clusols);
! 279: Silent_Continue(clusols,proj,target);
! 280: block_size := oldblk;
! 281: Merge_Clustered(s,clusols);
! 282: Deep_Clear(clusols);
! 283: end Rerun_Clustered;
! 284:
! 285: procedure Sequential_Continue
! 286: ( s : in out Solu_Info_Array;
! 287: target : in Complex_Number; tol : in double_float;
! 288: p1,p2 : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
! 289:
! 290: ninfi,nregu,nsing,nfail,nclus : natural := 0;
! 291: clusols : Solution_List;
! 292:
! 293: begin
! 294: for i in s'range loop
! 295: LCont1(s(i),target,tol,proj,p1,c_path);
! 296: LCont2(s(i),target,tol,proj,0,dumv,err,p2,c_end);
! 297: Diagnostics(s,c_end,tol,i,proj,
! 298: ninfi,nregu,nsing,nclus,nfail,sols,clusols);
! 299: end loop;
! 300: if (nclus > 0) and then (max_reruns > 0)
! 301: then Rerun_Clustered(s,clusols);
! 302: end if;
! 303: end Sequential_Continue;
! 304:
! 305: procedure Continue_End_Game
! 306: ( s : in out Solu_Info_Array;
! 307: target : in Complex_Number; tol : in double_float;
! 308: p : in Pred_Pars; c : in Corr_Pars ) is
! 309:
! 310: -- DESCRIPTION :
! 311: -- End game for the simultaneous path following.
! 312:
! 313: ninfi,nregu,nsing,nfail,nclus : natural := 0;
! 314: clusols : Solution_List;
! 315:
! 316: begin
! 317: for i in s'range loop
! 318: LCont2(s(i),target,tol,proj,0,dumv,err,p,c);
! 319: end loop;
! 320: for i in s'range loop
! 321: Diagnostics(s,c,tol,i,proj,ninfi,nregu,nsing,nclus,nfail,sols,clusols);
! 322: end loop;
! 323: if (nclus > 0) and then (max_reruns > 0)
! 324: then Rerun_Clustered(s,clusols);
! 325: end if;
! 326: end Continue_end_Game;
! 327:
! 328: procedure Parallel_Continue
! 329: ( s : in out Solu_Info_Array;
! 330: target : in Complex_Number; tol : in double_float;
! 331: p_path,p_end : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
! 332:
! 333: -- DESCRIPTION :
! 334: -- This procedure implements the simultaneous continuation of
! 335: -- different solution paths.
! 336:
! 337: ninfi,nregu,nsing,nfail,nclus : natural := 0;
! 338: nb,index : natural;
! 339: blck : natural := block_size;
! 340:
! 341: begin
! 342: nb := 1; index := 0;
! 343: while index < s'last loop
! 344: if blck > s'last - index
! 345: then blck := s'last - index;
! 346: end if;
! 347: declare
! 348: sbk : Solu_Info_Array(1..blck) := s(index+1..index+blck);
! 349: begin
! 350: LContN1(sbk,target,tol,tol_path_distance,proj,p_path,c_path);
! 351: Continue_end_Game(sbk,target,tol,p_end,c_end);
! 352: s(index+1..index+blck) := sbk;
! 353: end;
! 354: nb := nb + 1;
! 355: index := index + blck;
! 356: end loop;
! 357: end Parallel_Continue;
! 358:
! 359: begin
! 360: ppa := Continuation_Parameters.Create_for_Path;
! 361: pen := Continuation_Parameters.Create_End_Game;
! 362: cpa := Continuation_Parameters.Create_for_Path;
! 363: cen := Continuation_Parameters.Create_End_Game;
! 364: if block_size = 1
! 365: then Sequential_Continue(sia,target,tol,ppa,pen,cpa,cen);
! 366: else Parallel_Continue(sia,target,tol,ppa,pen,cpa,cen);
! 367: end if;
! 368: Deep_Clear(sols);
! 369: sols := Shallow_Create(sia);
! 370: end Silent_Continue;
! 371:
! 372: procedure Reporting_Continue
! 373: ( file : in file_type; sols : in out Solution_List;
! 374: proj : in boolean;
! 375: target : in Complex_Number := Create(1.0) ) is
! 376:
! 377: sia : Solu_Info_Array(1..Length_Of(sols)) := Deep_Create(sols);
! 378: ppa,pen : Pred_Pars;
! 379: cpa,cen : Corr_Pars;
! 380: tol : constant double_float := 10.0**(-10);
! 381: dumv : Standard_Floating_Vectors.Link_to_Vector;
! 382: err : double_float;
! 383:
! 384: procedure LCont1 is
! 385: new Linear_Single_Normal_Reporting_Continue(Norm,H,dH,dH);
! 386: procedure LCont2 is
! 387: new Linear_Single_Conditioned_Reporting_Continue(Norm,H,dH,dH);
! 388: procedure LContN1 is
! 389: new Linear_Multiple_Normal_Reporting_Continue(Norm,H,dH,dH);
! 390: procedure CCont2 is
! 391: new Circular_Single_Conditioned_Reporting_Continue(Norm,H,dH,dH);
! 392:
! 393: procedure Rerun_Clustered
! 394: ( file : in file_type; s : in out Solu_Info_Array;
! 395: clusols : in out Solution_List ) is
! 396:
! 397: oldmax : natural := max_reruns;
! 398: oldblk : natural := block_size;
! 399:
! 400: begin
! 401: condition := condition + 1;
! 402: Continuation_Parameters.Tune(condition);
! 403: max_reruns := oldmax - 1;
! 404: block_size := Length_Of(clusols);
! 405: Reporting_Continue(file,clusols,proj,target);
! 406: block_size := oldblk;
! 407: Merge_Clustered(s,clusols);
! 408: Deep_Clear(clusols);
! 409: end Rerun_Clustered;
! 410:
! 411: procedure Sequential_Continue
! 412: ( file : in file_type; s : in out Solu_Info_Array;
! 413: target : in Complex_Number; tol : in double_float;
! 414: p1,p2 : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
! 415:
! 416: ninfi,nregu,nsing,nfail,nclus : natural := 0;
! 417: clusols : Solution_List;
! 418:
! 419: begin
! 420: Write_Bar(file);
! 421: for i in s'range loop
! 422: LCont1(file,s(i),target,tol,proj,p1,c_path);
! 423: LCont2(file,s(i),target,tol,proj,0,dumv,err,p2,c_end);
! 424: Write_Statistics(file,i,s(i).nstep,s(i).nfail,s(i).niter,s(i).nsyst);
! 425: Write_Diagnostics(file,s,c_end,tol,i,proj,
! 426: ninfi,nregu,nsing,nclus,nfail,sols,clusols);
! 427: Write_Solution(file,s(i));
! 428: end loop;
! 429: Write_Summary_Diagnostics(file,ninfi,nregu,nsing,nfail,nclus);
! 430: if (nclus > 0) and then (max_reruns > 0)
! 431: then Rerun_Clustered(file,s,clusols);
! 432: end if;
! 433: end Sequential_Continue;
! 434:
! 435: procedure Continue_End_Game
! 436: ( file : in file_type; s : in out Solu_Info_Array;
! 437: target : in Complex_Number; tol : in double_float;
! 438: p : in Pred_Pars; c : in Corr_Pars ) is
! 439:
! 440: ninfi,nregu,nsing,nfail,nclus : natural := 0;
! 441: clusols : Solution_List;
! 442:
! 443: begin
! 444: for i in s'range loop
! 445: LCont2(file,s(i),target,tol,proj,0,dumv,err,p,c);
! 446: end loop;
! 447: Write_Bar(file);
! 448: for i in s'range loop
! 449: Write_Statistics(file,i,s(i).nstep,s(i).nfail,s(i).niter,s(i).nsyst);
! 450: Write_Diagnostics(file,s,c,tol,i,proj,
! 451: ninfi,nregu,nsing,nclus,nfail,sols,clusols);
! 452: Write_Solution(file,s(i));
! 453: end loop;
! 454: put_line(file,"The computed solutions :");
! 455: declare
! 456: solus : Solution_List := Deep_Create(s);
! 457: begin
! 458: put(file,solus); Deep_Clear(solus);
! 459: end;
! 460: Write_Summary_Diagnostics(file,ninfi,nregu,nsing,nfail,nclus);
! 461: if (nclus > 0) and then (max_reruns > 0)
! 462: then Rerun_Clustered(file,s,clusols);
! 463: end if;
! 464: end Continue_end_Game;
! 465:
! 466: procedure Parallel_Continue
! 467: ( file : in file_type; s : in out Solu_Info_Array;
! 468: target : in Complex_Number; tol : in double_float;
! 469: p_path,p_end : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
! 470:
! 471: -- DESCRIPTION :
! 472: -- This procedure implements the simultaneous continuation of
! 473: -- different solution paths.
! 474:
! 475: ninfi,nregu,nsing,nfail,nclus : natural := 0;
! 476: nb,index : natural;
! 477: blck : natural := block_size;
! 478:
! 479: begin
! 480: nb := 1; index := 0;
! 481: while index < s'last loop
! 482: if blck > s'last - index
! 483: then blck := s'last - index;
! 484: end if;
! 485: declare
! 486: sbk : Solu_Info_Array(1..blck) := s(index+1..index+blck);
! 487: begin
! 488: LContN1(file,sbk,target,tol,tol_path_distance,proj,p_path,c_path);
! 489: Continue_end_Game(file,sbk,target,tol,p_end,c_end);
! 490: s(index+1..index+blck) := sbk;
! 491: end;
! 492: nb := nb + 1;
! 493: index := index + blck;
! 494: end loop;
! 495: end Parallel_Continue;
! 496:
! 497: begin
! 498: ppa := Continuation_Parameters.Create_for_Path;
! 499: pen := Continuation_Parameters.Create_End_Game;
! 500: cpa := Continuation_Parameters.Create_for_Path;
! 501: cen := Continuation_Parameters.Create_End_Game;
! 502: if block_size = 1
! 503: then Sequential_Continue(file,sia,target,tol,ppa,pen,cpa,cen);
! 504: else Parallel_Continue(file,sia,target,tol,ppa,pen,cpa,cen);
! 505: end if;
! 506: Deep_Clear(sols);
! 507: sols := Shallow_Create(sia);
! 508: end Reporting_Continue;
! 509:
! 510: -- CONTINUATION WITH ESTIMATION OF PATH DIRECTIONS :
! 511:
! 512: procedure Silent_Toric_Continue
! 513: ( sols : in out Solution_List; proj : in boolean;
! 514: v : in out VecVec;
! 515: errv : in out Standard_Floating_Vectors.Vector;
! 516: target : in Complex_Number := Create(1.0) ) is
! 517:
! 518: rtoric : natural := Continuation_Parameters.endext_order;
! 519: sia : Solu_Info_Array(1..Length_Of(sols)) := Deep_Create(sols);
! 520: ppa,pen : Pred_Pars;
! 521: cpa,cen : Corr_Pars;
! 522: tol : constant double_float := 10.0**(-10);
! 523:
! 524: procedure LCont1 is
! 525: new Linear_Single_Normal_Silent_Continue(Norm,H,dH,dH);
! 526: procedure LCont2 is
! 527: new Linear_Single_Conditioned_Silent_Continue(Norm,H,dH,dH);
! 528: procedure LContN1 is
! 529: new Linear_Multiple_Normal_Silent_Continue(Norm,H,dH,dH);
! 530:
! 531: procedure Rerun_Clustered
! 532: ( s : in out Solu_Info_Array;
! 533: clusols : in out Solution_List ) is
! 534:
! 535: oldmax : natural := max_reruns;
! 536: oldblk : natural := block_size;
! 537:
! 538: begin
! 539: condition := condition + 1;
! 540: Continuation_Parameters.Tune(condition);
! 541: max_reruns := oldmax - 1;
! 542: block_size := Length_Of(clusols);
! 543: Silent_Toric_Continue(clusols,proj,v,errv,target);
! 544: block_size := oldblk;
! 545: Merge_Clustered(s,clusols);
! 546: Deep_Clear(clusols);
! 547: end Rerun_Clustered;
! 548:
! 549: procedure Sequential_Continue
! 550: ( s : in out Solu_Info_Array;
! 551: target : in Complex_Number; tol : in double_float;
! 552: p1,p2 : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
! 553:
! 554: ninfi,nregu,nsing,nfail,nclus : natural := 0;
! 555: clusols : Solution_List;
! 556:
! 557: begin
! 558: for i in s'range loop
! 559: LCont1(s(i),target,tol,proj,p1,c_path);
! 560: LCont2(s(i),target,tol,proj,rtoric,v(i),errv(i),p2,c_end);
! 561: Diagnostics(s,c_end,tol,i,proj,
! 562: ninfi,nregu,nsing,nclus,nfail,sols,clusols);
! 563: end loop;
! 564: if (nclus > 0) and then (max_reruns > 0)
! 565: then Rerun_Clustered(s,clusols);
! 566: end if;
! 567: end Sequential_Continue;
! 568:
! 569: procedure Continue_End_Game
! 570: ( s : in out Solu_Info_Array;
! 571: target : in Complex_Number; tol : in double_float;
! 572: p : in Pred_Pars; c : in Corr_Pars ) is
! 573:
! 574: ninfi,nregu,nsing,nfail,nclus : natural := 0;
! 575: clusols : Solution_List;
! 576:
! 577: begin
! 578: for i in s'range loop
! 579: LCont2(s(i),target,tol,proj,rtoric,v(i),errv(i),p,c);
! 580: end loop;
! 581: for i in s'range loop
! 582: Diagnostics(s,c,tol,i,proj,ninfi,nregu,nsing,nclus,nfail,sols,clusols);
! 583: end loop;
! 584: if (nclus > 0) and then (max_reruns > 0)
! 585: then Rerun_Clustered(s,clusols);
! 586: end if;
! 587: end Continue_end_Game;
! 588:
! 589: procedure Parallel_Continue
! 590: ( s : in out Solu_Info_Array;
! 591: target : in Complex_Number; tol : in double_float;
! 592: p_path,p_end : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
! 593:
! 594: -- DESCRIPTION :
! 595: -- This procedure implements the simultaneous continuation of
! 596: -- different solution paths.
! 597:
! 598: ninfi,nregu,nsing,nfail,nclus : natural := 0;
! 599: nb,index : natural;
! 600: blck : natural := block_size;
! 601:
! 602: begin
! 603: nb := 1; index := 0;
! 604: while index < s'last loop
! 605: if blck > s'last - index
! 606: then blck := s'last - index;
! 607: end if;
! 608: declare
! 609: sbk : Solu_Info_Array(1..blck) := s(index+1..index+blck);
! 610: begin
! 611: LContN1(sbk,target,tol,tol_path_distance,proj,p_path,c_path);
! 612: Continue_end_Game(sbk,target,tol,p_end,c_end);
! 613: s(index+1..index+blck) := sbk;
! 614: end;
! 615: nb := nb + 1;
! 616: index := index + blck;
! 617: end loop;
! 618: end Parallel_Continue;
! 619:
! 620: begin
! 621: ppa := Continuation_Parameters.Create_for_Path;
! 622: pen := Continuation_Parameters.Create_End_Game;
! 623: cpa := Continuation_Parameters.Create_for_Path;
! 624: cen := Continuation_Parameters.Create_End_Game;
! 625: if block_size = 1
! 626: then Sequential_Continue(sia,target,tol,ppa,pen,cpa,cen);
! 627: else Parallel_Continue(sia,target,tol,ppa,pen,cpa,cen);
! 628: end if;
! 629: Deep_Clear(sols);
! 630: sols := Shallow_Create(sia);
! 631: end Silent_Toric_Continue;
! 632:
! 633: procedure Reporting_Toric_Continue
! 634: ( file : in file_type; sols : in out Solution_List;
! 635: proj : in boolean; v : in out VecVec;
! 636: errv : in out Standard_Floating_Vectors.Vector;
! 637: target : in Complex_Number := Create(1.0) ) is
! 638:
! 639: rtoric : natural := Continuation_Parameters.endext_order;
! 640: sia : Solu_Info_Array(1..Length_Of(sols)) := Deep_Create(sols);
! 641: ppa,pen : Pred_Pars;
! 642: cpa,cen : Corr_Pars;
! 643: tol : constant double_float := 10.0**(-10);
! 644:
! 645: procedure LCont1 is
! 646: new Linear_Single_Normal_Reporting_Continue(Norm,H,dH,dH);
! 647: procedure LCont2 is
! 648: new Linear_Single_Conditioned_Reporting_Continue(Norm,H,dH,dH);
! 649: procedure LContN1 is
! 650: new Linear_Multiple_Normal_Reporting_Continue(Norm,H,dH,dH);
! 651: procedure CCont2 is
! 652: new Circular_Single_Conditioned_Reporting_Continue(Norm,H,dH,dH);
! 653:
! 654: procedure Rerun_Clustered
! 655: ( file : in file_type; s : in out Solu_Info_Array;
! 656: clusols : in out Solution_List ) is
! 657:
! 658: oldmax : natural := max_reruns;
! 659: oldblk : natural := block_size;
! 660:
! 661: begin
! 662: condition := condition + 1;
! 663: Continuation_Parameters.Tune(condition);
! 664: max_reruns := oldmax - 1;
! 665: block_size := Length_Of(clusols);
! 666: Reporting_Toric_Continue(file,clusols,proj,v,errv,target);
! 667: block_size := oldblk;
! 668: Merge_Clustered(s,clusols);
! 669: Deep_Clear(clusols);
! 670: end Rerun_Clustered;
! 671:
! 672: procedure Sequential_Continue
! 673: ( file : in file_type; s : in out Solu_Info_Array;
! 674: target : in Complex_Number; tol : in double_float;
! 675: p1,p2 : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
! 676:
! 677: ninfi,nregu,nsing,nfail,nclus : natural := 0;
! 678: clusols : Solution_List;
! 679:
! 680: begin
! 681: Write_Bar(file);
! 682: for i in s'range loop
! 683: LCont1(file,s(i),target,tol,proj,p1,c_path);
! 684: LCont2(file,s(i),target,tol,proj,rtoric,v(i),errv(i),p2,c_end);
! 685: Write_Statistics(file,i,s(i).nstep,s(i).nfail,s(i).niter,s(i).nsyst);
! 686: Write_Diagnostics(file,s,c_end,tol,i,proj,
! 687: ninfi,nregu,nsing,nclus,nfail,sols,clusols);
! 688: Write_Solution(file,s(i));
! 689: end loop;
! 690: Write_Summary_Diagnostics(file,ninfi,nregu,nsing,nfail,nclus);
! 691: if (nclus > 0) and then (max_reruns > 0)
! 692: then Rerun_Clustered(file,s,clusols);
! 693: end if;
! 694: end Sequential_Continue;
! 695:
! 696: procedure Continue_End_Game
! 697: ( file : in file_type; s : in out Solu_Info_Array;
! 698: target : in Complex_Number; tol : in double_float;
! 699: p : in Pred_Pars; c : in Corr_Pars ) is
! 700:
! 701: ninfi,nregu,nsing,nfail,nclus : natural := 0;
! 702: clusols : Solution_List;
! 703:
! 704: begin
! 705: for i in s'range loop
! 706: LCont2(file,s(i),target,tol,proj,rtoric,v(i),errv(i),p,c);
! 707: end loop;
! 708: Write_Bar(file);
! 709: for i in s'range loop
! 710: Write_Statistics(file,i,s(i).nstep,s(i).nfail,s(i).niter,s(i).nsyst);
! 711: Write_Diagnostics(file,s,c,tol,i,proj,
! 712: ninfi,nregu,nsing,nclus,nfail,sols,clusols);
! 713: Write_Solution(file,s(i));
! 714: end loop;
! 715: put_line(file,"The computed solutions :");
! 716: declare
! 717: solus : Solution_List := Deep_Create(s);
! 718: begin
! 719: put(file,solus); Deep_Clear(solus);
! 720: end;
! 721: Write_Summary_Diagnostics(file,ninfi,nregu,nsing,nfail,nclus);
! 722: if (nclus > 0) and then (max_reruns > 0)
! 723: then Rerun_Clustered(file,s,clusols);
! 724: end if;
! 725: end Continue_end_Game;
! 726:
! 727: procedure Parallel_Continue
! 728: ( file : in file_type; s : in out Solu_Info_Array;
! 729: target : in Complex_Number; tol : in double_float;
! 730: p_path,p_end : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
! 731:
! 732: -- DESCRIPTION :
! 733: -- This procedure implements the simultaneous continuation of
! 734: -- different solution paths.
! 735:
! 736: ninfi,nregu,nsing,nfail,nclus : natural := 0;
! 737: nb,index : natural;
! 738: blck : natural := block_size;
! 739:
! 740: begin
! 741: nb := 1; index := 0;
! 742: while index < s'last loop
! 743: if blck > s'last - index
! 744: then blck := s'last - index;
! 745: end if;
! 746: declare
! 747: sbk : Solu_Info_Array(1..blck) := s(index+1..index+blck);
! 748: begin
! 749: LContN1(file,sbk,target,tol,tol_path_distance,proj,p_path,c_path);
! 750: Continue_end_Game(file,sbk,target,tol,p_end,c_end);
! 751: s(index+1..index+blck) := sbk;
! 752: end;
! 753: nb := nb + 1;
! 754: index := index + blck;
! 755: end loop;
! 756: end Parallel_Continue;
! 757:
! 758: begin
! 759: ppa := Continuation_Parameters.Create_for_Path;
! 760: pen := Continuation_Parameters.Create_End_Game;
! 761: cpa := Continuation_Parameters.Create_for_Path;
! 762: cen := Continuation_Parameters.Create_End_Game;
! 763: if block_size = 1
! 764: then Sequential_Continue(file,sia,target,tol,ppa,pen,cpa,cen);
! 765: else Parallel_Continue(file,sia,target,tol,ppa,pen,cpa,cen);
! 766: end if;
! 767: Deep_Clear(sols);
! 768: sols := Shallow_Create(sia);
! 769: end Reporting_Toric_Continue;
! 770:
! 771: end Increment_and_Fix_Continuation;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>