Annotation of OpenXM_contrib/PHC/Ada/Schubert/driver_for_pieri_homotopies.adb, Revision 1.1
1.1 ! maekawa 1: with text_io,integer_io; use text_io,integer_io;
! 2: with Communications_with_User; use Communications_with_User;
! 3: with Timing_Package; use Timing_Package;
! 4: with Standard_Floating_Numbers; use Standard_Floating_Numbers;
! 5: with Standard_Natural_Vectors;
! 6: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
! 7: with Standard_Complex_Vectors;
! 8: with Standard_Complex_Vectors_io; use Standard_Complex_Vectors_io;
! 9: with Standard_Natural_Matrices;
! 10: with Standard_Natural_Matrices_io; use Standard_Natural_Matrices_io;
! 11: with Standard_Floating_Matrices;
! 12: with Standard_Complex_Matrices;
! 13: with Standard_Complex_Matrices_io; use Standard_Complex_Matrices_io;
! 14: with Standard_Complex_Norms_Equals; use Standard_Complex_Norms_Equals;
! 15: with Standard_Random_Numbers; use Standard_Random_Numbers;
! 16: with Standard_Random_Vectors; use Standard_Random_Vectors;
! 17: with Standard_Matrix_Inversion; use Standard_Matrix_Inversion;
! 18: with Standard_Complex_VecMats; use Standard_Complex_VecMats;
! 19: with Symbol_Table; use Symbol_Table;
! 20: with Matrix_Indeterminates;
! 21: with Standard_Complex_Polynomials; use Standard_Complex_Polynomials;
! 22: with Standard_Complex_Poly_Matrices;
! 23: with Standard_Complex_Poly_Matrices_io; use Standard_Complex_Poly_Matrices_io;
! 24: with Standard_Complex_Poly_Systems; use Standard_Complex_Poly_Systems;
! 25: with Standard_Complex_Poly_SysFun; use Standard_Complex_Poly_SysFun;
! 26: with Standard_Complex_Poly_Systems_io; use Standard_Complex_Poly_Systems_io;
! 27: with Homotopy;
! 28: with Standard_Complex_Solutions; use Standard_Complex_Solutions;
! 29: with Standard_Complex_Solutions_io; use Standard_Complex_Solutions_io;
! 30: with Standard_Root_Refiners; use Standard_Root_Refiners;
! 31: with Increment_and_Fix_Continuation; use Increment_and_Fix_Continuation;
! 32: with Drivers_for_Poly_Continuation; use Drivers_for_Poly_Continuation;
! 33: with Brackets,Brackets_io; use Brackets,Brackets_io;
! 34: with Bracket_Monomials,Bracket_Systems; use Bracket_Monomials,Bracket_Systems;
! 35: with Specialization_of_Planes; use Specialization_of_Planes;
! 36: with Symbolic_Minor_Equations; use Symbolic_Minor_Equations;
! 37: with Numeric_Minor_Equations; use Numeric_Minor_Equations;
! 38: with Determinantal_Systems; use Determinantal_Systems;
! 39: with Plane_Representations; use Plane_Representations;
! 40: with Localization_Posets; use Localization_Posets;
! 41: with Localization_Posets_io; use Localization_Posets_io;
! 42: with Deformation_Posets; use Deformation_Posets;
! 43: with Drivers_for_Input_Planes; use Drivers_for_Input_Planes;
! 44:
! 45: procedure Driver_for_Pieri_Homotopies
! 46: ( file : in file_type; n,d : in natural ) is
! 47:
! 48: -- AUXILIARIES IN THE SOLVERS :
! 49:
! 50: procedure Add_t_Symbol is
! 51:
! 52: -- DESCRIPTION :
! 53: -- Adds the symbol for the continuation parameter t to the symbol table.
! 54:
! 55: tsb : Symbol;
! 56:
! 57: begin
! 58: Symbol_Table.Enlarge(1);
! 59: tsb(1) := 't';
! 60: for i in 2..tsb'last loop
! 61: tsb(i) := ' ';
! 62: end loop;
! 63: Symbol_Table.Add(tsb);
! 64: end Add_t_Symbol;
! 65:
! 66: procedure Set_Parameters ( file : in file_type; report : out boolean ) is
! 67:
! 68: -- DESCRIPTION :
! 69: -- Interactive determination of the continuation and output parameters.
! 70:
! 71: oc : natural;
! 72:
! 73: begin
! 74: new_line;
! 75: Driver_for_Continuation_Parameters(file);
! 76: new_line;
! 77: Driver_for_Process_io(file,oc);
! 78: report := not (oc = 0);
! 79: new_line;
! 80: put_line("No more input expected. See output file for results...");
! 81: new_line;
! 82: new_line(file);
! 83: end Set_Parameters;
! 84:
! 85: function First_Standard_Plane
! 86: ( m,p : natural ) return Standard_Complex_Matrices.Matrix is
! 87:
! 88: -- DESCRIPTION :
! 89: -- Returns the m-plane spanned by the first m standard basis vectors.
! 90:
! 91: res : Standard_Complex_Matrices.Matrix(1..m+p,1..m);
! 92:
! 93: begin
! 94: for j in 1..m loop -- assign j-th column
! 95: for i in 1..m+p loop
! 96: res(i,j) := Create(0.0); -- initialize with zeros
! 97: end loop;
! 98: res(j,j) := Create(1.0); -- j-th column = j-th basis vector
! 99: end loop;
! 100: return res;
! 101: end First_Standard_Plane;
! 102:
! 103: function Last_Standard_Plane
! 104: ( m,p : natural ) return Standard_Complex_Matrices.Matrix is
! 105:
! 106: -- DESCRIPTION :
! 107: -- Returns the m-plane spanned by the last m standard basis vectors.
! 108:
! 109: res : Standard_Complex_Matrices.Matrix(1..m+p,1..m);
! 110:
! 111: begin
! 112: for j in 1..m loop -- assign j-th column
! 113: for i in 1..m+p loop
! 114: res(i,j) := Create(0.0); -- initialize with zeros
! 115: end loop;
! 116: res(p+j,j) := Create(1.0); -- j-th vector = (p+j)-th basis vector
! 117: end loop;
! 118: return res;
! 119: end Last_Standard_Plane;
! 120:
! 121: procedure Basis_Change ( n : in natural; vm : in VecMat; transvm : out VecMat;
! 122: trans : out Standard_Complex_Matrices.Matrix ) is
! 123:
! 124: -- DESCRIPTION :
! 125: -- Changes basis so that the last two planes in vm are spanned by
! 126: -- the first and last standard basis vectors respectively.
! 127:
! 128: wrk : Standard_Complex_Matrices.Matrix(1..n,1..n);
! 129: -- penuplane : constant Standard_Complex_Matrices.Matrix
! 130: -- := vm(vm'last-1).all;
! 131: frstplane : constant Standard_Complex_Matrices.Matrix := vm(vm'first).all;
! 132: lastplane : constant Standard_Complex_Matrices.Matrix := vm(vm'last).all;
! 133: colind : natural := 0;
! 134: use Standard_Complex_Matrices;
! 135: ranflt : double_float;
! 136:
! 137: begin
! 138: for j in frstplane'range(2) loop -- fill up the work matrix
! 139: colind := colind + 1;
! 140: for i in frstplane'range(1) loop
! 141: wrk(i,colind) := frstplane(i,j);
! 142: end loop;
! 143: end loop;
! 144: for j in colind+1..(n-lastplane'length(2)) loop -- random spacing
! 145: for i in 1..n loop
! 146: ranflt := Random;
! 147: wrk(i,j) := Create(ranflt);
! 148: end loop;
! 149: end loop;
! 150: colind := n+1;
! 151: for j in reverse lastplane'range(2) loop
! 152: colind := colind - 1;
! 153: for i in lastplane'range(1) loop
! 154: wrk(i,colind) := lastplane(i,j);
! 155: end loop;
! 156: end loop;
! 157: trans := Inverse(wrk); -- transformation = inverse
! 158: for i in vm'first+1..vm'last-1 loop
! 159: transvm(i-1) := new Standard_Complex_Matrices.Matrix'
! 160: (trans*vm(i).all);
! 161: end loop;
! 162: transvm(transvm'last-1)
! 163: := new Standard_Complex_Matrices.Matrix'(trans*vm(vm'first).all);
! 164: transvm(transvm'last)
! 165: := new Standard_Complex_Matrices.Matrix'(trans*vm(vm'last).all);
! 166: end Basis_Change;
! 167:
! 168: function Solution_Plane ( locmap : Standard_Natural_Matrices.Matrix;
! 169: mat : Standard_Complex_Matrices.Matrix )
! 170: return Solution is
! 171:
! 172: -- DESCRIPTION :
! 173: -- Returns the representation of the solution plane as a vector.
! 174:
! 175: solloc : constant Standard_Complex_Vectors.Vector
! 176: := Vector_Rep(locmap,Localize(locmap,mat));
! 177: sol : Solution(solloc'length);
! 178:
! 179: begin
! 180: sol.m := 1;
! 181: sol.t := Create(0.0);
! 182: sol.res := 0.0;
! 183: sol.err := 0.0;
! 184: sol.rco := 0.0;
! 185: sol.v := solloc;
! 186: return sol;
! 187: end Solution_Plane;
! 188:
! 189: function Solution_Planes ( locmap : Standard_Natural_Matrices.Matrix;
! 190: vm : VecMat ) return Solution_List is
! 191:
! 192: -- DESCRIPTION :
! 193: -- Returns the representation of the vector of planes as a solution list.
! 194:
! 195: res,res_last : Solution_List;
! 196:
! 197: begin
! 198: for i in vm'range loop
! 199: Append(res,res_last,Solution_Plane(locmap,vm(i).all));
! 200: end loop;
! 201: return res;
! 202: end Solution_Planes;
! 203:
! 204: function Create_Hypersurface_System
! 205: ( n : natural; locmap : Standard_Natural_Matrices.Matrix;
! 206: xpm : Standard_Complex_Poly_Matrices.Matrix; planes : VecMat )
! 207: return Poly_Sys is
! 208:
! 209: -- DESCRIPTION :
! 210: -- Returns the polynomial system that collects the hypersurface
! 211: -- intersection conditions for meeting the given m-planes.
! 212: -- The system is localized according to the given localization map.
! 213:
! 214: wrksys : Poly_Sys(1..n) := Polynomial_Equations(planes(1..n),xpm);
! 215: res : Poly_Sys(1..n) := Localize(locmap,wrksys);
! 216:
! 217: begin
! 218: Clear(wrksys);
! 219: return res;
! 220: end Create_Hypersurface_System;
! 221:
! 222: function Create_General_System
! 223: ( locmap : Standard_Natural_Matrices.Matrix;
! 224: xpm : Standard_Complex_Poly_Matrices.Matrix; planes : VecMat )
! 225: return Poly_Sys is
! 226:
! 227: -- DESCRIPTION :
! 228: -- Returns the polynomial system that collects the general
! 229: -- intersection conditions for meeting the given (m+1-k(i))-planes.
! 230: -- The system is localized according to the given localization map.
! 231:
! 232: wrksys : constant Poly_Sys := Polynomial_Equations(planes,xpm);
! 233: res : constant Poly_Sys := Localize(locmap,wrksys);
! 234: tmp : Poly;
! 235:
! 236: begin
! 237: for i in wrksys'range loop
! 238: tmp := wrksys(i);
! 239: Clear(tmp);
! 240: end loop;
! 241: return res;
! 242: end Create_General_System;
! 243:
! 244: procedure Evaluate_Roots ( file : in file_type;
! 245: p : in Poly_sys; sols : in out Solution_List ) is
! 246:
! 247: -- DESCRIPTION :
! 248: -- Evaluates the roots at the system, good for overdetermined systems.
! 249:
! 250: tmp : Solution_List := sols;
! 251:
! 252: begin
! 253: for i in 1..Length_Of(sols) loop
! 254: put(file,"Solution "); put(file,i,1);
! 255: put_line(file," evaluated at the system : ");
! 256: put_line(file,Eval(p,Head_Of(tmp).v));
! 257: tmp := Tail_Of(tmp);
! 258: end loop;
! 259: end Evaluate_Roots;
! 260:
! 261: function Square ( n : natural; p : Poly_Sys ) return Poly_Sys is
! 262:
! 263: -- DESCRIPTION :
! 264: -- Returns a n-by-n system, by adding random linear combinations of
! 265: -- the polynomials p(i), i > n, to the first n polynomials.
! 266:
! 267: res : Poly_Sys(1..n);
! 268: acc : Poly;
! 269:
! 270: begin
! 271: for i in res'range loop
! 272: Copy(p(i),res(i));
! 273: for j in n+1..p'last loop
! 274: acc := Random1*p(j);
! 275: Add(res(i),acc);
! 276: Clear(acc);
! 277: end loop;
! 278: end loop;
! 279: return res;
! 280: end Square;
! 281:
! 282: procedure Refine_Roots ( file : in file_type;
! 283: p : in Poly_Sys; sols : in out Solution_List ) is
! 284:
! 285: -- DESCRIPTION :
! 286: -- Calls the root refiner, for square polynomial systems only.
! 287:
! 288: epsxa : constant double_float := 10.0**(-8);
! 289: epsfa : constant double_float := 10.0**(-8);
! 290: tolsing : constant double_float := 10.0**(-8);
! 291: max : constant natural := 3;
! 292: numit : natural := 0;
! 293:
! 294: begin
! 295: Reporting_Root_Refiner(file,p,sols,epsxa,epsfa,tolsing,numit,max,false);
! 296: end Refine_Roots;
! 297:
! 298: function General_Homotopy
! 299: ( xpm : Standard_Complex_Poly_Matrices.Matrix;
! 300: locmap : Standard_Natural_Matrices.Matrix;
! 301: start,target : VecMat ) return Poly_Sys is
! 302:
! 303: -- DESCRIPTION :
! 304: -- Returns a general homotopy between start and target planes.
! 305: -- The continuation parameter is inside the determinants.
! 306:
! 307: -- REQUIRED : dimensions of start and target matrices must correspond.
! 308:
! 309: res : Link_to_Poly_Sys;
! 310: n : constant natural := xpm'length(1);
! 311: p : constant natural := xpm'length(2);
! 312: m : constant natural := n-p;
! 313: nva : constant natural := n*p + 1;
! 314:
! 315: begin
! 316: for i in start'range loop
! 317: declare
! 318: moving : Standard_Complex_Poly_Matrices.Matrix
! 319: (start(i)'range(1),start(i)'range(2))
! 320: := Moving_U_Matrix(nva,start(i).all,target(i).all);
! 321: kd : constant natural := p + start(i)'length(2);
! 322: bm : Bracket_Monomial := Maximal_Minors(n,kd);
! 323: bs : Bracket_System(0..Number_of_Brackets(bm))
! 324: := Minor_Equations(kd,kd-p,bm);
! 325: sys : Poly_Sys(1..bs'last)
! 326: := Lifted_Expanded_Minors(moving,xpm,bs);
! 327: begin
! 328: Concat(res,sys);
! 329: Standard_Complex_Poly_Matrices.Clear(moving);
! 330: end;
! 331: end loop;
! 332: declare
! 333: locres : constant Poly_Sys := Localize(locmap,res.all);
! 334: begin
! 335: Clear(res);
! 336: return locres;
! 337: end;
! 338: end General_Homotopy;
! 339:
! 340: procedure Continuation ( file : in file_type; sols : in out Solution_List;
! 341: report : in boolean ) is
! 342:
! 343: -- DESCRIPTION :
! 344: -- Calls the path trackers starting at the given solutions.
! 345:
! 346: -- REQUIRED : Homotopy is properly created.
! 347:
! 348: procedure Sil_Cont is
! 349: new Silent_Continue(Max_Norm,
! 350: Homotopy.Eval,Homotopy.Diff,Homotopy.Diff);
! 351: procedure Rep_Cont is
! 352: new Reporting_Continue(Max_Norm,
! 353: Homotopy.Eval,Homotopy.Diff,Homotopy.Diff);
! 354:
! 355: begin
! 356: Set_Continuation_Parameter(sols,Create(0.0));
! 357: if report
! 358: then Rep_Cont(file,sols,false,Create(1.0));
! 359: else Sil_Cont(sols,false,Create(1.0));
! 360: end if;
! 361: end Continuation;
! 362:
! 363: procedure General_Path_Following
! 364: ( file : in file_type; target,homsys : in Poly_Sys;
! 365: sols : in out Solution_List; report : in boolean ) is
! 366:
! 367: -- DESCRIPTION :
! 368: -- Given a homotopy with start solutions, the path trackers will
! 369: -- trace the paths defined by this homotopy.
! 370:
! 371: -- REQUIRED : not Is_Null(sols).
! 372:
! 373: timer : Timing_Widget;
! 374: neq : constant natural := homsys'last; -- number of equations
! 375: dim : constant natural := Head_Of(sols).n; -- actual dimension
! 376: squhom : Poly_Sys(1..dim) := Square(dim,homsys);
! 377:
! 378: begin
! 379: tstart(timer);
! 380: Homotopy.Create(squhom,dim+1);
! 381: Continuation(file,sols,report);
! 382: tstop(timer);
! 383: new_line(file);
! 384: print_times(file,timer,"Determinantal Cheater's homotopy to target system");
! 385: new_line(file);
! 386: Evaluate_Roots(file,target,sols);
! 387: end General_Path_Following;
! 388:
! 389: procedure Path_Following_with_Cheater
! 390: ( file : in file_type; start,target : in Poly_Sys;
! 391: sols : in out Solution_List; report : in boolean ) is
! 392:
! 393: -- DESCRIPTION :
! 394: -- Calls the standard continuation routines to solve a specific
! 395: -- target system, starting at the solutions of the start system.
! 396: -- This is the usual linear cheater between start and target system,
! 397: -- although it will take nonsquare inputs, it should only be used
! 398: -- for hypersurface intersection conditions.
! 399:
! 400: -- REQUIRED : not Is_Null(sols).
! 401:
! 402: timer : Timing_Widget;
! 403: n : constant natural := target'last;
! 404: a : Standard_Complex_Vectors.Vector(1..n) := Random_Vector(1,n);
! 405: b : Standard_Complex_Vectors.Vector(1..n) := Random_Vector(1,n);
! 406: dimsol : constant natural := Head_Of(sols).n;
! 407: squ_target,squ_start : Poly_Sys(1..dimsol);
! 408:
! 409: begin
! 410: tstart(timer);
! 411: if dimsol = n
! 412: then Homotopy.Create(target,start,2,a,b,true); -- linear cheater
! 413: else squ_target := Square(dimsol,target);
! 414: squ_start := Square(dimsol,start);
! 415: Homotopy.Create(squ_target,squ_start,2,a,b,true);
! 416: end if;
! 417: Continuation(file,sols,report);
! 418: tstop(timer);
! 419: new_line(file);
! 420: print_times(file,timer,"Linear Cheater's homotopy to target system");
! 421: if dimsol = n
! 422: then Refine_Roots(file,target,sols);
! 423: else Refine_Roots(file,squ_target,sols);
! 424: Evaluate_Roots(file,target,sols);
! 425: end if;
! 426: end Path_Following_with_Cheater;
! 427:
! 428: procedure Solve_Hypersurface_Target_System
! 429: ( file : in file_type; m,p : in natural;
! 430: start_planes,target_planes : in VecMat;
! 431: index_poset : in Array_of_Array_of_Nodes;
! 432: deform_poset : in Array_of_Array_of_VecMats;
! 433: target_level : in natural; report : in boolean ) is
! 434:
! 435: -- DESCRIPTION :
! 436: -- This procedure tests the output of the deformation poset,
! 437: -- creating polynomial representations of the intersection conditions
! 438: -- and solution lists representing the solution planes.
! 439:
! 440: -- ON ENTRY :
! 441: -- file to write intermediate output on;
! 442: -- m dimension of the input planes;
! 443: -- p dimension of the solution planes;
! 444: -- start_planes input m-planes in general position;
! 445: -- target_planes specific input m-planes;
! 446: -- index_poset indexed localization poset;
! 447: -- deform_poset poset with the solution p-planes;
! 448: -- target_level indicates lowest node in deform_poset that is filled;
! 449: -- report switch for intermediate output during continuation.
! 450:
! 451: dim : constant natural := m*p;
! 452: xpm : Standard_Complex_Poly_Matrices.Matrix(1..m+p,1..p)
! 453: := Localization_Pattern(m+p,index_poset(dim)(1).top,
! 454: index_poset(dim)(1).bottom);
! 455: solplanes : constant VecMat := deform_poset(target_level)(1).all;
! 456: locmap : Standard_Natural_Matrices.Matrix(1..m+p,1..p)
! 457: := Standard_Coordinate_Frame(xpm,solplanes(1).all);
! 458: locsys : Poly_Sys(start_planes'range)
! 459: := Create_Hypersurface_System(dim,locmap,xpm,start_planes);
! 460: target : Poly_Sys(target_planes'range)
! 461: := Create_Hypersurface_System(dim,locmap,xpm,target_planes);
! 462: sols : Solution_List := Solution_Planes(locmap,solplanes);
! 463:
! 464: begin
! 465: Matrix_Indeterminates.Reduce_Symbols(locmap);
! 466: put_line(file,"THE GENERIC SYSTEM : ");
! 467: put_line(file,locsys);
! 468: new_line(file);
! 469: put_line(file,"The localization map :"); put(file,locmap);
! 470: Refine_Roots(file,locsys,sols);
! 471: new_line(file);
! 472: put_line(file,"THE TARGET SYSTEM : ");
! 473: put_line(file,target);
! 474: new_line(file);
! 475: Path_Following_with_Cheater(file,locsys,target,sols,report);
! 476: end Solve_Hypersurface_Target_System;
! 477:
! 478: procedure Solve_General_Target_System
! 479: ( file : in file_type; m,p : in natural; k : in Bracket;
! 480: start_planes,target_planes : in VecMat;
! 481: index_poset : in Array_of_Array_of_Nodes;
! 482: deform_poset : in Array_of_Array_of_VecMats;
! 483: target_level : in natural; report : in boolean ) is
! 484:
! 485: -- DESCRIPTION :
! 486: -- This procedure tests the output of the deformation poset,
! 487: -- creating polynomial representations of the intersection conditions
! 488: -- and solution lists representing the solution planes.
! 489:
! 490: -- ON ENTRY :
! 491: -- file to write intermediate output on;
! 492: -- m dimension of the input planes;
! 493: -- p dimension of the solution planes;
! 494: -- k co-dimension conditions;
! 495: -- start_planes input (m+1-k(i))-planes in general position;
! 496: -- target_planes specific input (m+1-k(i))-planes;
! 497: -- index_poset indexed localization poset;
! 498: -- deform_poset poset with the solution p-planes;
! 499: -- target_level indicates lowest node in deform_poset that is filled;
! 500: -- report switch for intermediate output during continuation.
! 501:
! 502: dim : constant natural := m*p;
! 503: xpm : Standard_Complex_Poly_Matrices.Matrix(1..m+p,1..p)
! 504: := Localization_Pattern(m+p,index_poset(dim)(1).top,
! 505: index_poset(dim)(1).bottom);
! 506: solplanes : constant VecMat := deform_poset(target_level)(1).all;
! 507: locmap : Standard_Natural_Matrices.Matrix(1..m+p,1..p)
! 508: := Standard_Coordinate_Frame(xpm,solplanes(1).all);
! 509: homtpy : constant Poly_Sys
! 510: := General_Homotopy(xpm,locmap,start_planes,target_planes);
! 511: locsys : constant Poly_Sys
! 512: := Create_General_System(locmap,xpm,start_planes);
! 513: target : constant Poly_Sys
! 514: := Create_General_System(locmap,xpm,target_planes);
! 515: sols : Solution_List := Solution_Planes(locmap,solplanes);
! 516:
! 517: begin
! 518: Matrix_Indeterminates.Reduce_Symbols(locmap);
! 519: put_line(file,"THE GENERIC SYSTEM : ");
! 520: put_line(file,locsys);
! 521: new_line(file);
! 522: put_line(file,"The localization map :"); put(file,locmap);
! 523: Evaluate_Roots(file,locsys,sols);
! 524: new_line(file);
! 525: put_line(file,"THE TARGET SYSTEM : ");
! 526: put_line(file,target);
! 527: new_line(file);
! 528: General_Path_Following(file,target,homtpy,sols,report);
! 529: end Solve_General_Target_System;
! 530:
! 531: procedure Write_Poset_Times
! 532: ( file : in file_type; timer : in Timing_Widget;
! 533: npaths : in Standard_Natural_Vectors.Vector;
! 534: timings : in Duration_Array ) is
! 535:
! 536: -- DESCRIPTION :
! 537: -- Writes a overview of #paths and timings spent during deformations
! 538: -- along the poset structure.
! 539:
! 540: begin
! 541: new_line(file);
! 542: put_line(file,"--------------------------------------");
! 543: put_line(file,"| TIMING INFORMATION OVERVIEW |");
! 544: put_line(file,"--------------------------------------");
! 545: put_line(file,"| n | #paths | user cpu time |");
! 546: put_line(file,"--------------------------------------");
! 547: for i in npaths'range loop
! 548: if npaths(i) /= 0
! 549: then put(file,"|"); put(file,i,4); put(file," |");
! 550: put(file,npaths(i),7); put(file," | ");
! 551: print_hms(file,timings(i)); put(file," |"); new_line(file);
! 552: end if;
! 553: end loop;
! 554: put_line(file,"--------------------------------------");
! 555: put(file,"| total |");
! 556: put(file,Standard_Natural_Vectors.Sum(npaths),7);
! 557: put(file," | ");
! 558: print_hms(file,Elapsed_User_Time(timer));
! 559: put(file," |"); new_line(file);
! 560: put_line(file,"--------------------------------------");
! 561: end Write_Poset_Times;
! 562:
! 563: procedure Solve_Hypersurface_Deformation_Poset
! 564: ( file : in file_type; m,p : in natural;
! 565: level_poset : in Array_of_Nodes;
! 566: index_poset : in Array_of_Array_of_Nodes ) is
! 567:
! 568: -- DESCRIPTION :
! 569: -- Creates a deformation poset and applies the Solve operator.
! 570:
! 571: n : constant natural := m+p;
! 572: deform_poset : Array_of_Array_of_VecMats(index_poset'range)
! 573: := Create(index_poset);
! 574: planes : VecMat(1..m*p) := Random_Complex_Planes(m,p);
! 575: target_planes : VecMat(1..m*p);
! 576: ans : character;
! 577: report,outlog : boolean;
! 578: timer : Timing_Widget;
! 579: target_level : natural := m*p;
! 580: nbp : natural := 0;
! 581: npaths : Standard_Natural_Vectors.Vector(1..target_level)
! 582: := (1..target_level => 0);
! 583: timings : Duration_Array(1..target_level) := (1..target_level => 0.0);
! 584:
! 585: begin
! 586: put_line("The size of the deformation poset : ");
! 587: put_line(file,"The size of the deformation poset : ");
! 588: put_roco(index_poset);
! 589: put_roco(file,index_poset);
! 590: new_line;
! 591: put("Give target level <= "); put(target_level,1);
! 592: put(" = root level by default : "); get(target_level);
! 593: for i in 1..target_level loop
! 594: nbp := nbp + Row_Root_Count_Sum(level_poset,i);
! 595: end loop;
! 596: put("The number of paths : "); put(nbp,1); new_line;
! 597: put(file,"The number of paths : "); put(file,nbp,1); new_line(file);
! 598: new_line;
! 599: put("Do you want to have the homotopies on file ? (y/n) ");
! 600: Ask_Yes_or_No(ans);
! 601: outlog := (ans = 'y');
! 602: if target_level < m*p
! 603: then planes(m*p).all := Last_Standard_Plane(m,p);
! 604: if target_level < m*p-1
! 605: then planes(m*p-1).all := First_Standard_Plane(m,p);
! 606: end if;
! 607: end if;
! 608: Driver_for_Input_Planes(file,m,p,target_planes);
! 609: Matrix_Indeterminates.Initialize_Symbols(m+p,p);
! 610: Add_t_Symbol;
! 611: Set_Parameters(file,report);
! 612: tstart(timer);
! 613: for i in index_poset(target_level)'range loop
! 614: declare
! 615: root : Node := index_poset(target_level)(i).all;
! 616: begin
! 617: Solve(file,m+p,deform_poset,root,planes(1..target_level),
! 618: report,outlog,npaths,timings);
! 619: end;
! 620: end loop;
! 621: tstop(timer);
! 622: new_line(file);
! 623: print_times(file,timer,"Solving along the deformation poset");
! 624: Write_Poset_Times(file,timer,
! 625: npaths(1..target_level),timings(1..target_level));
! 626: if deform_poset(target_level)(1) /= null
! 627: then new_line(file);
! 628: Solve_Hypersurface_Target_System
! 629: (file,m,p,planes,target_planes,index_poset,deform_poset,
! 630: target_level,report);
! 631: end if;
! 632: end Solve_Hypersurface_Deformation_Poset;
! 633:
! 634: procedure Solve_General_Deformation_Poset
! 635: ( file : in file_type; m,p : in natural; k : in Bracket;
! 636: index_poset : in Array_of_Array_of_Nodes ) is
! 637:
! 638: -- DESCRIPTION :
! 639: -- Applies the solver to general intersection conditions.
! 640:
! 641: deform_poset : Array_of_Array_of_VecMats(index_poset'range)
! 642: := Create(index_poset);
! 643: planes : VecMat(k'range) := Random_Complex_Planes(m,p,k);
! 644: target_planes : VecMat(k'range);
! 645: ans : character;
! 646: report,outlog : boolean;
! 647: timer : Timing_Widget;
! 648: target_level : natural := m*p;
! 649: npaths : Standard_Natural_Vectors.Vector(1..target_level)
! 650: := (1..target_level => 0);
! 651: timings : Duration_Array(1..target_level) := (1..target_level => 0.0);
! 652:
! 653: begin
! 654: put_line("The size of the deformation poset : ");
! 655: put_line(file,"The size of the deformation poset : ");
! 656: put_roco(index_poset);
! 657: put_roco(file,index_poset);
! 658: new_line;
! 659: put("Give target level <= "); put(target_level,1);
! 660: put(" = root level by default : "); get(target_level);
! 661: new_line;
! 662: put("Do you want to have the homotopies on file ? (y/n) ");
! 663: Ask_Yes_or_No(ans);
! 664: outlog := (ans = 'y');
! 665: Driver_for_Input_Planes(file,m,p,k,target_planes);
! 666: Matrix_Indeterminates.Initialize_Symbols(m+p,p);
! 667: Add_t_Symbol;
! 668: Set_Parameters(file,report);
! 669: tstart(timer);
! 670: for i in index_poset(target_level)'range loop
! 671: declare
! 672: root : Node := index_poset(target_level)(i).all;
! 673: begin
! 674: Solve(file,m+p,k,deform_poset,root,planes,report,outlog,
! 675: npaths,timings);
! 676: end;
! 677: end loop;
! 678: tstop(timer);
! 679: new_line(file);
! 680: print_times(file,timer,"Solving along the deformation poset");
! 681: Write_Poset_Times(file,timer,
! 682: npaths(1..target_level),timings(1..target_level));
! 683: if deform_poset(target_level)(1) /= null
! 684: then new_line(file);
! 685: Solve_General_Target_System
! 686: (file,m,p,k,planes,target_planes,index_poset,deform_poset,
! 687: target_level,report);
! 688: end if;
! 689: end Solve_General_Deformation_Poset;
! 690:
! 691: -- HYPERSURFACE SOLVERS :
! 692:
! 693: procedure Create_Top_Hypersurface_Poset
! 694: ( file : in file_type; m,p : in natural ) is
! 695:
! 696: -- DESCRIPTION :
! 697: -- Create the poset by incrementing only top pivots.
! 698:
! 699: timer : Timing_Widget;
! 700: root : Node(p) := Trivial_Root(m,p);
! 701: lnkroot : Link_to_Node := new Node'(root);
! 702: level_poset : Array_of_Nodes(0..m*p);
! 703: index_poset : Array_of_Array_of_Nodes(0..m*p);
! 704:
! 705: begin
! 706: tstart(timer);
! 707: Top_Create(lnkroot,m+p);
! 708: put_line("The poset created from the top : ");
! 709: put_line(file,"The poset created from the top : ");
! 710: level_poset := Create_Leveled_Poset(lnkroot);
! 711: Count_Roots(level_poset);
! 712: index_poset := Create_Indexed_Poset(level_poset);
! 713: put(index_poset);
! 714: put(file,index_poset);
! 715: Solve_Hypersurface_Deformation_Poset(file,m,p,level_poset,index_poset);
! 716: tstop(timer);
! 717: new_line(file);
! 718: print_times(file,timer,
! 719: "Total time for Hypersurface Pieri Homotopy Algorithm");
! 720: end Create_Top_Hypersurface_Poset;
! 721:
! 722: procedure Create_Bottom_Hypersurface_Poset
! 723: ( file : in file_type; m,p : in natural ) is
! 724:
! 725: -- DESCRIPTION :
! 726: -- Create the poset by decrementing only bottom pivots.
! 727:
! 728: timer : Timing_Widget;
! 729: root : Node(p) := Trivial_Root(m,p);
! 730: lnkroot : Link_to_Node := new Node'(root);
! 731: level_poset : Array_of_Nodes(0..m*p);
! 732: index_poset : Array_of_Array_of_Nodes(0..m*p);
! 733:
! 734: begin
! 735: tstart(timer);
! 736: Bottom_Create(lnkroot);
! 737: put_line("The poset created from the bottom : ");
! 738: put_line(file,"The poset created from the bottom : ");
! 739: level_poset := Create_Leveled_Poset(lnkroot);
! 740: Count_Roots(level_poset);
! 741: index_poset := Create_Indexed_Poset(level_poset);
! 742: put(index_poset);
! 743: put(file,index_poset);
! 744: Solve_Hypersurface_Deformation_Poset(file,m,p,level_poset,index_poset);
! 745: tstop(timer);
! 746: new_line(file);
! 747: print_times(file,timer,
! 748: "Total time for Hypersurface Pieri Homotopy Algorithm");
! 749: end Create_Bottom_Hypersurface_Poset;
! 750:
! 751: procedure Create_Mixed_Hypersurface_Poset
! 752: ( file : in file_type; m,p : in natural ) is
! 753:
! 754: -- DESCRIPTION :
! 755: -- Create the poset by incrementing top and decrementing bottom pivots.
! 756:
! 757: timer : Timing_Widget;
! 758: root : Node(p) := Trivial_Root(m,p);
! 759: lnkroot : Link_to_Node := new Node'(root);
! 760: level_poset : Array_of_Nodes(0..m*p);
! 761: index_poset : Array_of_Array_of_Nodes(0..m*p);
! 762:
! 763: begin
! 764: tstart(timer);
! 765: Top_Bottom_Create(lnkroot,m+p);
! 766: put_line("The poset created in a mixed fashion : ");
! 767: put_line(file,"The poset created in a mixed fashion : ");
! 768: level_poset := Create_Leveled_Poset(lnkroot);
! 769: Count_Roots(level_poset);
! 770: index_poset := Create_Indexed_Poset(level_poset);
! 771: put(index_poset);
! 772: put(file,index_poset);
! 773: Solve_Hypersurface_Deformation_Poset(file,m,p,level_poset,index_poset);
! 774: tstop(timer);
! 775: new_line(file);
! 776: print_times(file,timer,
! 777: "Total time for Hypersurface Pieri Homotopy Algorithm");
! 778: end Create_Mixed_Hypersurface_Poset;
! 779:
! 780: -- GENERAL SOLVERS :
! 781:
! 782: procedure Create_Top_General_Poset
! 783: ( file : in file_type; m,p : in natural ) is
! 784:
! 785: -- DESCRIPTION :
! 786: -- Creates a poset for counting general subspace intersections,
! 787: -- by consistently incrementing the top pivots.
! 788:
! 789: timer : Timing_Widget;
! 790: root : Node(p) := Trivial_Root(m,p);
! 791: lnkroot : Link_to_Node := new Node'(root);
! 792: codim : constant Bracket := Read_Codimensions(m,p,0);
! 793: level_poset : Array_of_Nodes(0..m*p);
! 794: index_poset : Array_of_Array_of_Nodes(0..m*p);
! 795:
! 796: begin
! 797: put(file," k = "); put(file,codim); new_line(file);
! 798: tstart(timer);
! 799: Top_Create(lnkroot,codim,m+p);
! 800: put_line("The poset created from the top : ");
! 801: put_line(file,"The poset created from the top : ");
! 802: level_poset := Create_Leveled_Poset(lnkroot);
! 803: Count_Roots(level_poset);
! 804: index_poset := Create_Indexed_Poset(level_poset);
! 805: put(index_poset);
! 806: put(file,index_poset);
! 807: Solve_General_Deformation_Poset(file,m,p,codim,index_poset);
! 808: tstop(timer);
! 809: new_line(file);
! 810: print_times(file,timer,
! 811: "Total time for General Pieri Homotopy Algorithm");
! 812: end Create_Top_General_Poset;
! 813:
! 814: procedure Create_Bottom_General_Poset
! 815: ( file : in file_type; m,p : in natural ) is
! 816:
! 817: -- DESCRIPTION :
! 818: -- Creates a poset for counting general subspace intersections,
! 819: -- by consistently incrementing the top pivots.
! 820:
! 821: timer : Timing_Widget;
! 822: root : Node(p) := Trivial_Root(m,p);
! 823: lnkroot : Link_to_Node := new Node'(root);
! 824: codim : constant Bracket := Read_Codimensions(m,p,0);
! 825: level_poset : Array_of_Nodes(0..m*p);
! 826: index_poset : Array_of_Array_of_Nodes(0..m*p);
! 827:
! 828: begin
! 829: put(file," k = "); put(file,codim); new_line(file);
! 830: tstart(timer);
! 831: Bottom_Create(lnkroot,codim);
! 832: put_line("The poset created from the bottom : ");
! 833: put_line(file,"The poset created from the bottom : ");
! 834: level_poset := Create_Leveled_Poset(lnkroot);
! 835: Count_Roots(level_poset);
! 836: index_poset := Create_Indexed_Poset(level_poset);
! 837: put(index_poset);
! 838: put(file,index_poset);
! 839: Solve_General_Deformation_Poset(file,m,p,codim,index_poset);
! 840: tstop(timer);
! 841: new_line(file);
! 842: print_times(file,timer,
! 843: "Total time for General Pieri Homotopy Algorithm");
! 844: end Create_Bottom_General_Poset;
! 845:
! 846: procedure Create_Mixed_General_Poset
! 847: ( file : in file_type; m,p : in natural ) is
! 848:
! 849: -- DESCRIPTION :
! 850: -- Creates a poset for counting general subspace intersections,
! 851: -- by incrementing the top and decrementing the bottom pivots.
! 852:
! 853: timer : Timing_Widget;
! 854: root : Node(p) := Trivial_Root(m,p);
! 855: lnkroot : Link_to_Node := new Node'(root);
! 856: codim : constant Bracket := Read_Codimensions(m,p,0);
! 857: level_poset : Array_of_Nodes(0..m*p);
! 858: index_poset : Array_of_Array_of_Nodes(0..m*p);
! 859:
! 860: begin
! 861: put(file," k = "); put(file,codim); new_line(file);
! 862: tstart(timer);
! 863: Top_Bottom_Create(lnkroot,codim,m+p);
! 864: put_line("The poset created in a mixed fashion : ");
! 865: put_line(file,"The poset created in a mixed fashion : ");
! 866: level_poset := Create_Leveled_Poset(lnkroot);
! 867: Count_Roots(level_poset);
! 868: index_poset := Create_Indexed_Poset(level_poset);
! 869: put(index_poset);
! 870: put(file,index_poset);
! 871: Solve_General_Deformation_Poset(file,m,p,codim,index_poset);
! 872: tstop(timer);
! 873: new_line(file);
! 874: print_times(file,timer,
! 875: "Total time for General Pieri Homotopy Algorithm");
! 876: end Create_Mixed_General_Poset;
! 877:
! 878: procedure Main is
! 879:
! 880: p : constant natural := d;
! 881: m : constant natural := n-d;
! 882: ans : character;
! 883:
! 884: begin
! 885: new_line;
! 886: put_line("MENU for deforming p-planes in (m+p)-space, co-dimensions k : ");
! 887: put_line(" 1. k_i = 1 consistently incrementing the top pivots.");
! 888: put_line(" 2. consistently decrementing the bottom pivots.");
! 889: put_line(" 3. mixed top-bottom sequence for poset creation.");
! 890: put_line(" 4. k_i >= 1 consistently incrementing the top pivots.");
! 891: put_line(" 5. consistently decrementing the bottom pivots.");
! 892: put_line(" 6. mixed top-bottom sequence for poset creation.");
! 893: put("Type 1, 2, 3, 4, 5, or 6 to choose : ");
! 894: Ask_Alternative(ans,"123456");
! 895: new_line;
! 896: case ans is
! 897: when '1' => new_line(file); Create_Top_Hypersurface_Poset(file,m,p);
! 898: when '2' => new_line(file); Create_Bottom_Hypersurface_Poset(file,m,p);
! 899: when '3' => new_line(file); Create_Mixed_Hypersurface_Poset(file,m,p);
! 900: when '4' => Create_Top_General_Poset(file,m,p);
! 901: when '5' => Create_Bottom_General_Poset(file,m,p);
! 902: when '6' => Create_Mixed_General_Poset(file,m,p);
! 903: when others => put_line("Option not recognized. Please try again.");
! 904: end case;
! 905: end Main;
! 906:
! 907: begin
! 908: Main;
! 909: end Driver_for_Pieri_Homotopies;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>