Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Symmetry/drivers_for_symmetric_lifting.adb, Revision 1.1
1.1 ! maekawa 1: with integer_io; use 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_Floating_Numbers_io; use Standard_Floating_Numbers_io;
! 6: with Numbers_io; use Numbers_io;
! 7: with Standard_Integer_Vectors;
! 8: with Standard_Integer_Vectors_io; use Standard_Integer_Vectors_io;
! 9: with Standard_Floating_Vectors;
! 10: with Standard_Floating_Vectors_io; use Standard_Floating_Vectors_io;
! 11: with Standard_Complex_Poly_Systems_io; use Standard_Complex_Poly_Systems_io;
! 12: with Standard_Complex_Laur_Systems; use Standard_Complex_Laur_Systems;
! 13: with Standard_Poly_Laur_Convertors; use Standard_Poly_Laur_Convertors;
! 14: with Standard_Laur_Poly_Convertors; use Standard_Laur_Poly_Convertors;
! 15: with Lists_of_Integer_Vectors; use Lists_of_Integer_Vectors;
! 16: with Lists_of_Integer_Vectors_io; use Lists_of_Integer_Vectors_io;
! 17: with Arrays_of_Integer_Vector_Lists;
! 18: with Arrays_of_Integer_Vector_Lists_io; use Arrays_of_Integer_Vector_Lists_io;
! 19: with Arrays_of_Floating_Vector_Lists;
! 20: with Standard_Complex_Solutions_io; use Standard_Complex_Solutions_io;
! 21: with Drivers_for_Poly_Continuation; use Drivers_for_Poly_Continuation;
! 22: with Power_Lists; use Power_Lists;
! 23: with Integer_Faces_of_Polytope;
! 24: with Integer_Mixed_Subdivisions;
! 25: with Integer_Mixed_Subdivisions_io; use Integer_Mixed_Subdivisions_io;
! 26: with Integer_Lifting_Functions; use Integer_Lifting_Functions;
! 27: with Integer_Lifting_Utilities; use Integer_Lifting_Utilities;
! 28: with Floating_Lifting_Utilities; use Floating_Lifting_Utilities;
! 29: with Drivers_for_Lifting_Functions; use Drivers_for_Lifting_Functions;
! 30: with Pruning_Statistics;
! 31: with Integer_Pruning_Methods; use Integer_Pruning_Methods;
! 32: with Mixed_Volume_Computation; use Mixed_Volume_Computation;
! 33: with Floating_Integer_Convertors; use Floating_Integer_Convertors;
! 34: with Floating_Faces_of_Polytope;
! 35: with Floating_Mixed_Subdivisions;
! 36: with Floating_Mixed_Subdivisions_io; use Floating_Mixed_Subdivisions_io;
! 37: with Floating_Pruning_Methods; use Floating_Pruning_Methods;
! 38: with Mixed_Volume_Computation; use Mixed_Volume_Computation;
! 39: with Permutations; use Permutations;
! 40: with Symmetry_Group; use Symmetry_Group;
! 41: with Symmetry_Group_io; use Symmetry_Group_io;
! 42: with Symbol_Table,Symbol_Table_io; use Symbol_Table;
! 43: with Symbolic_Symmetry_Group_io; use Symbolic_Symmetry_Group_io;
! 44: with Drivers_for_Symmetry_Group_io; use Drivers_for_Symmetry_Group_io;
! 45: with Equivariant_Polynomial_Systems; use Equivariant_Polynomial_Systems;
! 46: with Faces_of_Symmetric_Polytopes; use Faces_of_Symmetric_Polytopes;
! 47: with Symmetric_Lifting_Functions; use Symmetric_Lifting_Functions;
! 48: with Generating_Mixed_Cells; use Generating_Mixed_Cells;
! 49: with Symmetric_Randomize;
! 50: with Symmetric_Polyhedral_Continuation; use Symmetric_Polyhedral_Continuation;
! 51:
! 52: package body Drivers_for_Symmetric_Lifting is
! 53:
! 54: procedure Symmetric_Lifting_Info is
! 55:
! 56: i : array(1..6) of string(1..65);
! 57:
! 58: begin
! 59: i(1):=" Symmetric lifting allows to exploit permutation symmetries in";
! 60: i(2):="the tuple of Newton polytopes. A symmetric subdivision is";
! 61: i(3):="induced by lifting the points in the same orbit up to the same";
! 62: i(4):="height. The corresponding random coefficient start system has";
! 63: i(5):="the same symmetric structure, so that in the homotopy, only the";
! 64: i(6):="generating solution paths need to be traced. ";
! 65: for k in i'range loop
! 66: put_line(i(k));
! 67: end loop;
! 68: end Symmetric_Lifting_Info;
! 69:
! 70: procedure Driver_for_Symmetric_Mixed_Volume_Computation
! 71: ( file : in file_type; p : in Poly_Sys; byebye : in boolean;
! 72: q : out Poly_Sys; qsols : out Solution_List;
! 73: mv : out natural ) is
! 74:
! 75: welcome : constant string
! 76: := "Mixed-Volume Computation by Symmetric Lifting";
! 77:
! 78: solsft,gft,outsubft : file_type;
! 79:
! 80: -- SWITCHES :
! 81:
! 82: invariant : boolean; -- true if the polynomials are invariant
! 83: equivaria : boolean; -- true if the system is equivariant
! 84: compmisu : boolean; -- if a mixed subdivision has to be computed
! 85: misufile : boolean; -- when the mixed subdivision has to be put on file
! 86: signsym : boolean; -- there is sign symmetry
! 87: allperms : boolean; -- equi-invariant w.r.t. all permutations
! 88: allsigns : boolean; -- equi-invariant w.r.t. all sign permutations
! 89: tosolve : boolean; -- on when the system has to be solved
! 90: torandq : boolean; -- on when random symmetric start system is solved
! 91:
! 92: procedure Read_Symmetry
! 93: ( n : in natural; pv,pw,fv,fw : in out List_of_Permutations;
! 94: fail : out boolean ) is
! 95:
! 96: -- DESCRIPTON :
! 97: -- Reads and builds representations of the symmetry groups.
! 98:
! 99: -- ON ENTRY :
! 100: -- n dimension;
! 101:
! 102: -- ON RETURN :
! 103: -- pv permutation symmetry on the unknowns;
! 104: -- pw effect of the group actions in pv on the equations;
! 105: -- fv contains pv, plus eventually sign symmetry;
! 106: -- fw effect of the group actions in fv on the equations;
! 107: -- fail when the polynomial system is not symmetric.
! 108:
! 109: ans : character;
! 110: nb : natural;
! 111: pg,fg : List_of_Permutations;
! 112:
! 113: begin
! 114: Read_Permutation_Group(n,pg,pv,allperms);
! 115: put("Is there a sign symmetry to take into account ? (y/n) ");
! 116: Ask_Yes_or_No(ans);
! 117: signsym := (ans = 'y');
! 118: if signsym
! 119: then
! 120: put("Is the system invariant under all changes of signs ? (y/n) ");
! 121: Ask_Yes_or_No(ans);
! 122: if ans = 'y'
! 123: then
! 124: allsigns := true;
! 125: fv := pv;
! 126: else
! 127: allsigns := false;
! 128: signsym := false; -- fv will contain these permutations
! 129: allperms := false; -- fv will be used for the generating solutions
! 130: put("The sign inversion of all elements is represented as ");
! 131: for i in 1..n loop
! 132: put('-');
! 133: declare
! 134: sb : Symbol;
! 135: begin
! 136: sb := (sb'range => ' ');
! 137: sb := Symbol_Table.get(i);
! 138: Symbol_Table_io.put(sb); put(" ");
! 139: end;
! 140: end loop;
! 141: new_line;
! 142: put("Give the number of generating elements in the group : ");
! 143: Read_Natural(nb);
! 144: put("Give "); put(nb,1);
! 145: put_line(" vector representations of the generating elements :");
! 146: Symbolic_Symmetry_Group_io.get(fg,n,nb);
! 147: put("Do you want the generation of the group ? (y/n) ");
! 148: Ask_Yes_or_No(ans);
! 149: if ans = 'y'
! 150: then fv := Generate(Union(fg,pv));
! 151: else fv := Union(fg,pv);
! 152: end if;
! 153: end if;
! 154: else
! 155: allsigns := false;
! 156: fv := pv;
! 157: end if;
! 158: new_line(file);
! 159: put_line(file,"THE SYMMETRY GROUP :");
! 160: new_line(file);
! 161: put_line(file,"v:"); Symbolic_Symmetry_Group_io.put(file,fv);
! 162: new_line(file);
! 163: Act(pv,p,pw,fail,invariant,equivaria);
! 164: if not Is_Null(fg)
! 165: then Act(fv,p,fw,fail,invariant,equivaria);
! 166: else fw := pw;
! 167: end if;
! 168: new_line(file);
! 169: put_line(file,"w:"); Symmetry_Group_io.put(file,fw); new_line(file);
! 170: if allsigns
! 171: then put_line(file,
! 172: "The system is invariant under all changes of signs.");
! 173: end if;
! 174: end Read_Symmetry;
! 175:
! 176: procedure Data_Management
! 177: ( n : in natural;
! 178: points : in out Arrays_of_Integer_Vector_Lists.
! 179: Array_of_Lists;
! 180: pv,pw,fv,fw : in List_of_Permutations; fltlif : out boolean;
! 181: mix : out Standard_Integer_Vectors.Link_to_Vector;
! 182: imixsub : out Integer_Mixed_Subdivisions.Mixed_Subdivision;
! 183: permp : out Poly_Sys ) is
! 184:
! 185: -- DESCRIPTION :
! 186: -- Allows to read in a mixed subdivision, determines type of mixture.
! 187:
! 188: -- ON ENTRY :
! 189: -- n dimension;
! 190: -- points supports;
! 191: -- pv permutation symmetry on the unknowns;
! 192: -- pw effect of the group actions in pv on the equations.
! 193: -- fv contains pv, eventually with sign symmetry;
! 194: -- fw effect of the group actions in fv on the equations.
! 195:
! 196: -- ON RETURN :
! 197: -- fltlif true when floating-point lifting is used, false otherwise;
! 198: -- mix type of mixture;
! 199: -- points ordered according to mix;
! 200: -- imixsub integer mixed subdivision;
! 201: -- permp system ordered according to mix.
! 202:
! 203: use Standard_Integer_Vectors;
! 204: use Arrays_of_Integer_Vector_Lists;
! 205: use Integer_Mixed_Subdivisions;
! 206:
! 207: tmpmix,perm : Link_to_Vector;
! 208: lifted_points : Array_of_Lists(p'range);
! 209: m : natural;
! 210: mixsub : Mixed_Subdivision;
! 211: ans : character;
! 212:
! 213: procedure Read_Subdivision is
! 214:
! 215: insubft : file_type;
! 216: nn,bkk : natural;
! 217:
! 218: begin
! 219: put_line("Reading the name of the input file.");
! 220: Read_Name_and_Open_File(insubft);
! 221: get(insubft,nn,m,tmpmix,mixsub);
! 222: Close(insubft);
! 223: new_line(file);
! 224: put_line(file,"MIXED SUBDIVISION :");
! 225: new_line(file);
! 226: put(file,nn,tmpmix.all,mixsub,bkk);
! 227: new_line(file);
! 228: compmisu := false;
! 229: fltlif := false;
! 230: imixsub := mixsub;
! 231: permp := p;
! 232: exception
! 233: when DATA_ERROR
! 234: => put_line("Data not in correct format. Will ignore it...");
! 235: Close(insubft);
! 236: end Read_Subdivision;
! 237:
! 238: begin
! 239: new_line;
! 240: put("Do you have already a mixed subdivision ? (y/n) ");
! 241: Ask_Yes_or_No(ans);
! 242: if ans = 'y'
! 243: then Read_Subdivision;
! 244: else compmisu := true;
! 245: end if;
! 246: if compmisu
! 247: then
! 248: put("Do you want to enforce the type of mixture ? (y/n) ");
! 249: Ask_Yes_or_No(ans);
! 250: if ans = 'y'
! 251: then put("Give the number of different supports : ");
! 252: Read_Natural(m);
! 253: put("Give the vector with occurencies : "); get(m,tmpmix);
! 254: permp := p;
! 255: else Compute_Mixture(points,tmpmix,perm);
! 256: permp := Permute(p,perm); Clear(perm);
! 257: end if;
! 258: put("Do you want to have the subdivision on separate file ? (y/n) ");
! 259: Ask_Yes_or_No(ans);
! 260: misufile := (ans = 'y');
! 261: if misufile
! 262: then put_line("Reading the name of the output file.");
! 263: Read_Name_and_Create_File(outsubft);
! 264: end if;
! 265: new_line(file);
! 266: put_line(file,"THE TYPE OF MIXTURE :");
! 267: new_line(file);
! 268: put(file,"The number of different supports : ");
! 269: put(file,tmpmix'last,1);
! 270: new_line(file);
! 271: put(file,"Vector indicating the occurrences : "); put(file,tmpmix);
! 272: new_line(file);
! 273: else
! 274: misufile := false;
! 275: end if;
! 276: mix := tmpmix;
! 277: end Data_Management;
! 278:
! 279: procedure Write_Generating_Cells
! 280: ( subfile : in file_type; n : in natural;
! 281: mix : in Standard_Integer_Vectors.Vector;
! 282: lifted : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
! 283: mixsub : in Integer_Mixed_Subdivisions.Mixed_Subdivision ) is
! 284:
! 285: -- DESCRIPTION :
! 286: -- Writes the list of generating cells on file, as the subdivision
! 287: -- of the cell that contains all lifted points.
! 288: -- By doing so, we will have no troubles recovering the lifting.
! 289:
! 290: use Arrays_of_Integer_Vector_Lists;
! 291: use Integer_Mixed_Subdivisions;
! 292:
! 293: genmic : Mixed_Cell;
! 294: genmixsub : Mixed_Subdivision;
! 295:
! 296: begin
! 297: genmic.nor := new Standard_Integer_Vectors.Vector'(1..n+1 => 0);
! 298: genmic.pts := new Array_of_Lists'(lifted);
! 299: genmic.sub := new Mixed_Subdivision'(mixsub);
! 300: Construct(genmic,genmixsub);
! 301: put(subfile,n,mix,genmixsub);
! 302: end Write_Generating_Cells;
! 303:
! 304: procedure Write_Generating_Cells
! 305: ( subfile : in file_type; n : in natural;
! 306: mix : in Standard_Integer_Vectors.Vector;
! 307: lifted : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
! 308: mixsub : in Floating_Mixed_Subdivisions.Mixed_Subdivision ) is
! 309:
! 310: -- DESCRIPTION :
! 311: -- Writes the list of generating cells on file, as the subdivision
! 312: -- of the cell that contains all lifted points.
! 313: -- By doing so, we will have no troubles recovering the lifting.
! 314:
! 315: use Arrays_of_Floating_Vector_Lists;
! 316: use Floating_Mixed_Subdivisions;
! 317:
! 318: genmic : Mixed_Cell;
! 319: genmixsub : Mixed_Subdivision;
! 320:
! 321: begin
! 322: genmic.nor := new Standard_Floating_Vectors.Vector'(1..n+1 => 0.0);
! 323: genmic.pts := new Array_of_Lists'(lifted);
! 324: genmic.sub := new Mixed_Subdivision'(mixsub);
! 325: Construct(genmic,genmixsub);
! 326: put(subfile,n,mix,genmixsub);
! 327: end Write_Generating_Cells;
! 328:
! 329: procedure Integer_Automatic_Lift_Orbits
! 330: ( file : in file_type; norb : in natural;
! 331: orbits : in out Arrays_of_Integer_Vector_Lists.
! 332: Array_of_Lists ) is
! 333:
! 334: -- DESCRIPTION :
! 335: -- Random integer numbers are generated and given to each orbit.
! 336:
! 337: lower,upper : integer;
! 338:
! 339: begin
! 340: new_line(file);
! 341: put_line(file,"AUTOMATIC RANDOM INTEGER LIFTING :");
! 342: new_line(file);
! 343: put("Give lower bound for random lifting : "); Read_Integer(lower);
! 344: put("Give upper bound for random lifting : "); Read_Integer(upper);
! 345: put(file," Lower bound for random lifting : ");
! 346: put(file,lower,1); new_line(file);
! 347: put(file," Upper bound for random lifting : ");
! 348: put(file,upper,1); new_line(file);
! 349: Integer_Random_Lift_Orbits(orbits,norb,lower,upper);
! 350: end Integer_Automatic_Lift_Orbits;
! 351:
! 352: procedure Float_Automatic_Lift_Orbits
! 353: ( file : in file_type; norb : in natural;
! 354: orbits : in out Arrays_of_Floating_Vector_Lists.
! 355: Array_of_Lists ) is
! 356:
! 357: -- DESCRIPTION :
! 358: -- Random floating-point numbers are generated and given to each orbit.
! 359:
! 360: lower,upper : double_float;
! 361:
! 362: begin
! 363: new_line(file);
! 364: put_line(file,"AUTOMATIC RANDOM FLOATING-POINT LIFTING :");
! 365: new_line(file);
! 366: put("Give lower bound for random lifting : "); Read_Double_Float(lower);
! 367: put("Give upper bound for random lifting : "); Read_Double_Float(upper);
! 368: put(file," Lower bound for random lifting : ");
! 369: put(file,lower,2,3,3); new_line(file);
! 370: put(file," Upper bound for random lifting : ");
! 371: put(file,upper,2,3,3); new_line(file);
! 372: Float_Random_Lift_Orbits(orbits,norb,lower,upper);
! 373: end Float_Automatic_Lift_Orbits;
! 374:
! 375: procedure Integer_Manual_Lift_Orbits
! 376: ( file : in file_type; norb : in natural;
! 377: orbits : in out Arrays_of_Integer_Vector_Lists.
! 378: Array_of_Lists ) is
! 379:
! 380: -- DESCRIPTION :
! 381: -- The user can give integer lifting values for every orbit.
! 382:
! 383: rv : Standard_Integer_Vectors.Vector(1..norb) := (1..norb => 0);
! 384:
! 385: begin
! 386: new_line(file);
! 387: put_line(file,"MANUAL INTEGER LIFTING :");
! 388: new_line(file);
! 389: put("Reading "); put(norb,1);
! 390: put_line(" integer numbers to lift orbits");
! 391: for i in rv'range loop
! 392: put(" give lifting for orbit "); put(i,1); put(" : ");
! 393: Read_Integer(rv(i));
! 394: end loop;
! 395: put_line(file," Lifting vector supplied by user :");
! 396: put(file,rv); new_line(file);
! 397: Integer_Lift_Orbits(orbits,rv);
! 398: end Integer_Manual_Lift_Orbits;
! 399:
! 400: procedure Float_Manual_Lift_Orbits
! 401: ( file : in file_type; norb : in natural;
! 402: orbits : in out Arrays_of_Floating_Vector_Lists.
! 403: Array_of_Lists ) is
! 404:
! 405: -- DESCRIPTION :
! 406: -- The user can give integer lifting values for every orbit.
! 407:
! 408: use Standard_Floating_Vectors;
! 409: rv : Standard_Floating_Vectors.Vector(1..norb) := (1..norb => 0.0);
! 410:
! 411: begin
! 412: new_line(file);
! 413: put_line(file,"MANUAL FLOATING-POINT LIFTING :");
! 414: new_line(file);
! 415: put("Reading "); put(norb,1);
! 416: put_line(" floating-point numbers to lift orbits");
! 417: for i in rv'range loop
! 418: put(" give lifting for orbit "); put(i,1); put(" : ");
! 419: Read_Double_Float(rv(i));
! 420: end loop;
! 421: put_line(file," Lifting vector supplied by user :");
! 422: Standard_Floating_Vectors_io.put(file,rv); new_line(file);
! 423: Float_Lift_Orbits(orbits,rv);
! 424: end Float_Manual_Lift_Orbits;
! 425:
! 426: procedure Classify_and_Lift_Orbits
! 427: ( file : in file_type;
! 428: mix : in Standard_Integer_Vectors.Vector;
! 429: points : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
! 430: pv,pw : in List_of_Permutations; fltlif : out boolean;
! 431: ilft : out Arrays_of_Integer_Vector_Lists.Array_of_Lists;
! 432: flft : out Arrays_of_Floating_Vector_Lists.Array_of_Lists ) is
! 433:
! 434: -- DESCRIPTION :
! 435: -- Classifies the points into orbits and lifts orbits.
! 436:
! 437: -- ON ENTRY :
! 438: -- file output file;
! 439: -- mix type of mixture;
! 440: -- points support sets;
! 441: -- pv representation of permutation symmetry;
! 442: -- pw effect of group actions on the system.
! 443:
! 444: -- ON RETURN :
! 445: -- fltlif true when floating-point lifting, false otherwise;
! 446: -- ilft integer-valued lifted supports;
! 447: -- flft floating-point lifted supports;
! 448:
! 449: ans : character;
! 450: cnt,norb : natural;
! 451: orbits : Arrays_of_Integer_Vector_Lists.Array_of_Lists(points'range);
! 452: fltorb : Arrays_of_Floating_Vector_Lists.Array_of_Lists(points'range);
! 453:
! 454: begin
! 455: new_line(file);
! 456: put_line(file,"CLASSIFICATION OF POINTS INTO ORBITS :");
! 457: new_line(file);
! 458: Classify_Orbits(points,mix,pv,pw,norb,orbits);
! 459: cnt := orbits'first;
! 460: new_line; put("Classified orbits,");
! 461: put_line(" last coordinate of vector is orbit number : ");
! 462: for k in mix'range loop
! 463: put("support no. "); put(cnt,1); put_line(" :"); put(orbits(cnt));
! 464: put(file,"support no. "); put(file,cnt,1);
! 465: put_line(file," :"); put(file,orbits(cnt));
! 466: cnt := cnt + mix(k);
! 467: end loop;
! 468: new_line;
! 469: put_line("MENU for Lifting of Orbits");
! 470: put(" 1. Integer Automatic : ");
! 471: put(norb,1); put_line(" random integer numbers as lifting.");
! 472: put(" 2. Manual : ");
! 473: put("you can give "); put(norb,1); put_line(" integer lifting values.");
! 474: put(" 3. Float Automatic : ");
! 475: put(norb,1); put_line(" random floating-point numbers as lifting.");
! 476: put(" 4. Manual : ");
! 477: put("you can give "); put(norb,1);
! 478: put_line(" floating-point lifting values.");
! 479: put("Type 1, 2, 3, or 4 to select lifting : ");
! 480: Ask_Alternative(ans,"1234");
! 481: case ans is
! 482: when '1' => Integer_Automatic_Lift_Orbits(file,norb,orbits);
! 483: ilft := orbits; fltlif := false;
! 484: when '2' => Integer_Manual_Lift_Orbits(file,norb,orbits);
! 485: ilft := orbits; fltlif := false;
! 486: when '3' => fltorb := Convert(orbits);
! 487: Float_Automatic_Lift_Orbits(file,norb,fltorb);
! 488: flft := fltorb; fltlif := true;
! 489: when '4' => fltorb := Convert(orbits);
! 490: Float_Manual_Lift_Orbits(file,norb,fltorb);
! 491: flft := fltorb; fltlif := true;
! 492: when others => null;
! 493: end case;
! 494: end Classify_and_Lift_Orbits;
! 495:
! 496: procedure Integer_Prune_for_Mixed_Cells
! 497: ( file : in file_type; n : in natural;
! 498: mix : in Standard_Integer_Vectors.Vector;
! 499: lifpts : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
! 500: pv : in List_of_Permutations;
! 501: mixsub : in out Integer_Mixed_Subdivisions.
! 502: Mixed_Subdivision ) is
! 503:
! 504: -- DESCRIPTION :
! 505: -- Given the lifted supports, the mixed cells will be computed.
! 506:
! 507: -- ON ENTRY :
! 508: -- file output file;
! 509: -- n dimension;
! 510: -- mix type of mixture;
! 511: -- lifpts lifted supports;
! 512: -- pv representation of permutation group.
! 513:
! 514: -- ON RETURN :
! 515: -- mixsub mixed cells;
! 516:
! 517: use Integer_Faces_of_Polytope;
! 518: use Integer_Mixed_Subdivisions;
! 519:
! 520: fa : Array_of_Faces(mix'range);
! 521: nbsucc,nbfail : Standard_Floating_Vectors.Vector(mix'range)
! 522: := (mix'range => 0.0);
! 523: timer : Timing_Widget;
! 524:
! 525: begin
! 526: tstart(timer);
! 527: for k in fa'range loop
! 528: fa(k) := Create_Lower(mix(k),n+1,lifpts(k));
! 529: end loop;
! 530: if invariant
! 531: then if allperms
! 532: then fa(fa'first) := Generating_Lifted_Faces(fa(fa'first));
! 533: else fa(fa'first) := Generating_Lifted_faces(pv,fa(fa'first));
! 534: end if;
! 535: end if;
! 536: tstop(timer);
! 537: new_line(file);
! 538: put_line(file,"CARDINALITIES OF THE LIFTED FACES :");
! 539: new_line(file);
! 540: for i in fa'range loop
! 541: put(file," # lifted "); put(file,mix(i),1);
! 542: put(file,"-faces of polytope "); put(file,i,1);
! 543: put(file," : "); put(file,Length_Of(fa(i)),1); new_line(file);
! 544: end loop;
! 545: new_line(file);
! 546: print_times(file,timer,"Creation of the Lower Faces");
! 547: new_line(file);
! 548: tstart(timer);
! 549: Create_CS(n,mix,fa,lifpts,nbsucc,nbfail,mixsub);
! 550: tstop(timer);
! 551: Pruning_Statistics(file,nbsucc,nbfail);
! 552: new_line(file);
! 553: print_times(file,timer,"Pruning for Mixed Cells");
! 554: end Integer_Prune_for_Mixed_Cells;
! 555:
! 556: procedure Float_Prune_for_Mixed_Cells
! 557: ( file : in file_type; n : in natural;
! 558: mix : in Standard_Integer_Vectors.Vector;
! 559: lifpts : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
! 560: pv : in List_of_Permutations;
! 561: mixsub : in out Floating_Mixed_Subdivisions.
! 562: Mixed_Subdivision ) is
! 563:
! 564: -- DESCRIPTION :
! 565: -- Given the lifted supports, the mixed cells will be computed.
! 566:
! 567: -- ON ENTRY :
! 568: -- file output file;
! 569: -- n dimension;
! 570: -- mix type of mixture;
! 571: -- lifpts lifted supports;
! 572: -- pv representation of permutation group.
! 573:
! 574: -- ON RETURN :
! 575: -- mixsub mixed cells;
! 576:
! 577: use Floating_Faces_of_Polytope;
! 578: use Floating_Mixed_Subdivisions;
! 579:
! 580: tol : constant double_float := 10.0**(-10);
! 581: fa : Array_of_Faces(mix'range);
! 582: nbsucc,nbfail : Standard_Floating_Vectors.Vector(mix'range)
! 583: := (mix'range => 0.0);
! 584: timer : Timing_Widget;
! 585:
! 586: begin
! 587: tstart(timer);
! 588: for k in fa'range loop
! 589: fa(k) := Create_Lower(mix(k),n+1,lifpts(k),tol);
! 590: end loop;
! 591: -- if invariant
! 592: -- then if allperms
! 593: -- then fa(fa'first) := Generating_Lifted_Faces(fa(fa'first));
! 594: -- else fa(fa'first) := Generating_Lifted_faces(pv,fa(fa'first));
! 595: -- end if;
! 596: -- end if;
! 597: tstop(timer);
! 598: new_line(file);
! 599: put_line(file,"CARDINALITIES OF THE LIFTED FACES :");
! 600: new_line(file);
! 601: for i in fa'range loop
! 602: put(file," # lifted "); put(file,mix(i),1);
! 603: put(file,"-faces of polytope "); put(file,i,1);
! 604: put(file," : "); put(file,Length_Of(fa(i)),1); new_line(file);
! 605: end loop;
! 606: new_line(file);
! 607: print_times(file,timer,"Creation of the Lower Faces");
! 608: new_line(file);
! 609: tstart(timer);
! 610: Create(n,mix,fa,lifpts,tol,nbsucc,nbfail,mixsub);
! 611: tstop(timer);
! 612: Pruning_Statistics(file,nbsucc,nbfail);
! 613: new_line(file);
! 614: print_times(file,timer,"Pruning for Mixed Cells");
! 615: end Float_Prune_for_Mixed_Cells;
! 616:
! 617: procedure Compute_Mixed_Volume
! 618: ( file : in file_type; n : in natural;
! 619: mix : in Standard_Integer_Vectors.Vector;
! 620: lifpts : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
! 621: mixsub : in out Integer_Mixed_Subdivisions.Mixed_Subdivision;
! 622: mv : out natural ) is
! 623:
! 624: -- DESCRIPTION :
! 625: -- Computes the mixed volume of the supports in lifpts and checks
! 626: -- on the mixed cells in the subdivision.
! 627: -- Results are written on the output file.
! 628:
! 629: -- ON ENTRY :
! 630: -- file output file;
! 631: -- n dimension;
! 632: -- mix type of mixture;
! 633: -- lifpts lifted supports;
! 634: -- mixsub list of mixed cells.
! 635:
! 636: -- ON RETURN :
! 637: -- mixsub can contain refinements of cells;
! 638: -- mv mixed volume.
! 639:
! 640: use Integer_Mixed_Subdivisions;
! 641:
! 642: timer : timing_widget;
! 643: bkk : natural;
! 644:
! 645: begin
! 646: new_line(file);
! 647: put_line(file,"THE LIFTED SUPPORTS :");
! 648: new_line(file);
! 649: put(file,lifpts);
! 650: new_line(file);
! 651: put_line(file,"VOLUME OF MIXED CELLS :");
! 652: new_line(file);
! 653: tstart(timer);
! 654: put(file,n,mix,mixsub,bkk);
! 655: mv := bkk;
! 656: tstop(timer);
! 657: new_line(file);
! 658: put(file,"The mixed volume : "); put(file,bkk,1); new_line(file);
! 659: new_line(file);
! 660: print_times(file,timer,"Volume computation of mixed cells");
! 661: new_line(file);
! 662: mixsub := Create(lifpts,mixsub);
! 663: new_line(file);
! 664: put_line(file,"COMPUTING AGAIN AFTER CHECKING :");
! 665: new_line(file);
! 666: tstart(timer);
! 667: put(file,n,mix,mixsub,bkk);
! 668: tstop(timer);
! 669: mv := bkk;
! 670: put(file,"The mixed volume : "); put(file,bkk,1); new_line(file);
! 671: new_line(file);
! 672: print_times(file,timer,"Checking the Mixed Volume Computation");
! 673: end Compute_Mixed_Volume;
! 674:
! 675: procedure Compute_Mixed_Volume
! 676: ( file : in file_type; n : in natural;
! 677: mix : in Standard_Integer_Vectors.Vector;
! 678: lifpts : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
! 679: mixsub : in out Floating_Mixed_Subdivisions.Mixed_Subdivision;
! 680: mv : out natural ) is
! 681:
! 682: -- DESCRIPTION :
! 683: -- Computes the mixed volume of the supports in lifpts.
! 684: -- Results are written on the output file.
! 685:
! 686: -- ON ENTRY :
! 687: -- file output file;
! 688: -- n dimension;
! 689: -- mix type of mixture;
! 690: -- lifpts lifted supports;
! 691: -- mixsub list of mixed cells.
! 692:
! 693: -- ON RETURN :
! 694: -- mixsub can contain refinements of cells;
! 695: -- mv mixed volume.
! 696:
! 697: timer : timing_widget;
! 698: bkk : natural;
! 699:
! 700: begin
! 701: new_line(file);
! 702: put_line(file,"THE LIFTED SUPPORTS :");
! 703: new_line(file);
! 704: put(file,lifpts);
! 705: new_line(file);
! 706: put_line(file,"VOLUME OF MIXED CELLS :");
! 707: new_line(file);
! 708: tstart(timer);
! 709: put(file,n,mix,mixsub,bkk);
! 710: mv := bkk;
! 711: tstop(timer);
! 712: new_line(file);
! 713: put(file,"The mixed volume : "); put(file,bkk,1); new_line(file);
! 714: new_line(file);
! 715: print_times(file,timer,"Volume computation of mixed cells");
! 716: end Compute_Mixed_Volume;
! 717:
! 718: procedure Generating_Mixed_Cells
! 719: ( file : in file_type; n : in natural;
! 720: points : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
! 721: pv,pw : in List_of_Permutations;
! 722: mix : in Standard_Integer_Vectors.Vector;
! 723: lorb : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
! 724: lifted : out Arrays_of_Integer_Vector_Lists.
! 725: Link_to_Array_of_Lists;
! 726: gensub : in out Integer_Mixed_Subdivisions.
! 727: Mixed_Subdivision ) is
! 728:
! 729: -- DESCRIPTION :
! 730: -- Computes a list of generating mixed cells.
! 731:
! 732: -- ON ENTRY :
! 733: -- file output file;
! 734: -- n dimension;
! 735: -- points support sets;
! 736: -- pv representation of permutation symmetry;
! 737: -- pw effect of group actions in pv on the system;
! 738: -- mix type of mixture;
! 739: -- lorb classified and lifted supports.
! 740:
! 741: -- ON RETURN :
! 742: -- lifted lifted points;
! 743: -- gensub generating cells.
! 744:
! 745: use Arrays_of_Integer_Vector_Lists;
! 746: use Integer_Mixed_Subdivisions;
! 747:
! 748: lifpts : Array_of_Lists(mix'range);
! 749: mixsub,genmixsub : Mixed_Subdivision;
! 750: index,bkk : natural;
! 751: timer : timing_widget;
! 752:
! 753: begin
! 754: if compmisu
! 755: then index := lorb'first;
! 756: for k in lifpts'range loop
! 757: lifpts(k) := lorb(index);
! 758: index := index + mix(k);
! 759: end loop;
! 760: Integer_Prune_for_Mixed_Cells(file,n,mix,lifpts,pv,mixsub);
! 761: Compute_Mixed_Volume(file,n,mix,lifpts,mixsub,mv);
! 762: tstart(timer);
! 763: if allperms
! 764: then genmixsub := Generating_Cells(mixsub);
! 765: else genmixsub := Generating_Cells(pv,pw,mix,mixsub);
! 766: end if;
! 767: new_line(file);
! 768: put_line(file,"THE GENERATING CELLS :");
! 769: new_line(file);
! 770: put(file,n,mix,genmixsub,bkk);
! 771: tstop(timer);
! 772: if misufile
! 773: then Write_Generating_Cells(outsubft,n,mix,lifpts,genmixsub);
! 774: end if;
! 775: new_line(file);
! 776: put(file,"Number of generating solutions : "); put(file,bkk,1);
! 777: new_line(file); new_line(file);
! 778: print_times(file,timer,"Computing generating cells");
! 779: gensub := genmixsub;
! 780: else lifpts := Induced_Lifting(n,mix,points,gensub);
! 781: new_line(file);
! 782: put_line(file,"THE LIFTED SUPPORTS :");
! 783: new_line(file);
! 784: put(file,lifpts);
! 785: new_line(file);
! 786: end if;
! 787: lifted := new Array_of_Lists'(lifpts);
! 788: end Generating_Mixed_Cells;
! 789:
! 790: procedure Generating_Mixed_Cells
! 791: ( file : in file_type; n : in natural;
! 792: points : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
! 793: pv,pw : in List_of_Permutations;
! 794: mix : in Standard_Integer_Vectors.Vector;
! 795: lorb : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
! 796: lifted : out Arrays_of_Floating_Vector_Lists.
! 797: Link_to_Array_of_Lists;
! 798: gensub : out Floating_Mixed_Subdivisions.
! 799: Mixed_Subdivision ) is
! 800:
! 801: -- DESCRIPTION :
! 802: -- Computes a list of generating mixed cells.
! 803:
! 804: -- ON ENTRY :
! 805: -- file output file;
! 806: -- n dimension;
! 807: -- points support sets;
! 808: -- pv representation of permutation symmetry;
! 809: -- pw effect of group actions in pv on the system;
! 810: -- mix type of mixture;
! 811: -- lorb classified and lifted supports.
! 812:
! 813: use Arrays_of_Floating_Vector_Lists;
! 814: use Floating_Mixed_Subdivisions;
! 815:
! 816: fpoints,lifpts : Array_of_Lists(mix'range);
! 817: mixsub,genmixsub : Mixed_Subdivision;
! 818: index,bkk : natural;
! 819: timer : timing_widget;
! 820:
! 821: begin
! 822: if compmisu
! 823: then index := lorb'first;
! 824: for k in lifpts'range loop
! 825: lifpts(k) := lorb(index);
! 826: index := index + mix(k);
! 827: end loop;
! 828: Float_Prune_for_Mixed_Cells(file,n,mix,lifpts,pv,mixsub);
! 829: Compute_Mixed_Volume(file,n,mix,lifpts,mixsub,mv);
! 830: else fpoints := Convert(points);
! 831: lifpts := Induced_Lifting(n,mix,fpoints,mixsub);
! 832: new_line(file);
! 833: put_line(file,"THE LIFTED SUPPORTS : ");
! 834: new_line(file);
! 835: put(file,lifpts);
! 836: new_line(file);
! 837: end if;
! 838: tstart(timer);
! 839: if allperms
! 840: then genmixsub := Generating_Cells(mixsub);
! 841: else genmixsub := Generating_Cells(pv,pw,mix,mixsub);
! 842: end if;
! 843: new_line(file);
! 844: put_line(file,"THE GENERATING CELLS :");
! 845: new_line(file);
! 846: put(file,n,mix,genmixsub,bkk);
! 847: tstop(timer);
! 848: if misufile
! 849: then Write_Generating_Cells(outsubft,n,mix,lifpts,genmixsub);
! 850: end if;
! 851: new_line(file);
! 852: put(file,"Number of generating solutions : "); put(file,bkk,1);
! 853: new_line(file); new_line(file);
! 854: print_times(file,timer,"Computing generating cells");
! 855: lifted := new Array_of_Lists'(lifpts);
! 856: gensub := genmixsub;
! 857: end Generating_Mixed_Cells;
! 858:
! 859: procedure Settings_for_Polyhedral_Continuation is
! 860:
! 861: -- DESCRIPTION :
! 862: -- Displays the menu and allows the user to set the parameters.
! 863:
! 864: ans : character;
! 865: oc : natural;
! 866:
! 867: begin
! 868: new_line;
! 869: put_line("MENU for Symmetric Polyhedral Continuation : ");
! 870: put_line(" 0. No polyhedral continuation, leave the menu.");
! 871: put_line(" 1. Solve given system by polyhedral continuation.");
! 872: put_line(" 2. Create and solve random coefficient system.");
! 873: put("Type 0,1, or 2 to choose : "); Ask_Alternative(ans,"012");
! 874: tosolve := not (ans = '0');
! 875: torandq := (ans = '2');
! 876: if tosolve
! 877: then if torandq
! 878: then
! 879: put_line("Reading a name of a file to write start system on.");
! 880: Read_Name_and_Create_File(gft);
! 881: else
! 882: new_line;
! 883: put_line
! 884: ("Reading a name of a file to write start solutions on.");
! 885: Read_Name_and_Create_File(solsft);
! 886: end if;
! 887: new_line;
! 888: Driver_for_Continuation_Parameters(file);
! 889: new_line;
! 890: Driver_for_Process_io(file,oc);
! 891: end if;
! 892: if byebye
! 893: then new_line;
! 894: put_line("No more input expected. See output file for results.");
! 895: new_line;
! 896: else new_line;
! 897: put_line("Starting the Computations ...");
! 898: new_line;
! 899: end if;
! 900: end Settings_for_Polyhedral_Continuation;
! 901:
! 902: procedure Symmetric_Polyhedral_Continuation
! 903: ( file : in file_type;
! 904: pp : in Poly_Sys; fv,fw : List_of_Permutations;
! 905: n : in natural; mix : in Standard_Integer_Vectors.Vector;
! 906: lifpts : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
! 907: gensub : in Integer_Mixed_Subdivisions.
! 908: Mixed_Subdivision ) is
! 909:
! 910: -- DESCRIPTION :
! 911: -- Constructs and solves a symmetric random-coefficient start system.
! 912:
! 913: -- ON ENTRY :
! 914: -- file output file;
! 915: -- pp polynomial system, ordered according to mixture;
! 916: -- fv representation of symmetry group;
! 917: -- fw effect on group actions on system;
! 918: -- n dimension;
! 919: -- mix type of mixture;
! 920: -- lifpts lifted points;
! 921: -- gensub generating mixed cells.
! 922:
! 923: use Arrays_of_Integer_Vector_Lists;
! 924: use Integer_Mixed_Subdivisions;
! 925:
! 926: lq,lifted_lq : Laur_Sys(p'range);
! 927: lp : Laur_Sys(p'range);
! 928: qq : Poly_Sys(p'range);
! 929: qqsols : Solution_List;
! 930: timer : timing_widget;
! 931:
! 932: begin
! 933: new_line(file);
! 934: put_line(file,"COMPUTING THE GENERATING SOLUTIONS :");
! 935: new_line(file);
! 936: tstart(timer);
! 937: lp := Polynomial_to_Laurent_System(pp);
! 938: if torandq
! 939: then lq := Symmetric_Randomize(lp,fv,fw);
! 940: qq := Laurent_to_Polynomial_System(lq); q := qq;
! 941: put(gft,qq);
! 942: else lq := lp; q := p;
! 943: end if;
! 944: lifted_lq := Perform_Lifting(n,mix,lifpts,lq);
! 945: if allperms
! 946: then qqsols := Symmetric_Mixed_Solve
! 947: (file,signsym,lifted_lq,gensub,n,mix);
! 948: else qqsols := Symmetric_Mixed_Solve
! 949: (file,fv,signsym,lifted_lq,gensub,n,mix);
! 950: end if;
! 951: tstop(timer);
! 952: new_line(file);
! 953: put(file,qqsols);
! 954: if torandq
! 955: then new_line(gft);
! 956: put_line(gft,"THE GENERATING SOLUTIONS :"); new_line(gft);
! 957: put(gft,Length_Of(qqsols),n,qqsols);
! 958: Close(gft);
! 959: else put(solsft,Length_Of(qqsols),n,qqsols);
! 960: Close(solsft);
! 961: end if;
! 962: new_line(file);
! 963: print_times(file,timer,"Symmetric polyhedral continuation");
! 964: qsols := qqsols;
! 965: end Symmetric_Polyhedral_Continuation;
! 966:
! 967: procedure Main_Driver is
! 968:
! 969: n : constant natural := p'length;
! 970: timer : timing_widget;
! 971: notsym : boolean;
! 972: pv,pw,fv,fw : List_of_Permutations;
! 973: igencells : Integer_Mixed_Subdivisions.Mixed_Subdivision;
! 974: fgencells : Floating_Mixed_Subdivisions.Mixed_Subdivision;
! 975: mix : Standard_Integer_Vectors.Link_to_Vector;
! 976: permp : Poly_Sys(p'range);
! 977: points,iliforb : Arrays_of_Integer_Vector_Lists.Array_of_Lists(p'range);
! 978: fliforb : Arrays_of_Floating_Vector_Lists.Array_of_Lists(p'range);
! 979: fltlif : boolean;
! 980: ilifpts : Arrays_of_Integer_Vector_Lists.Link_to_Array_of_Lists;
! 981: flifpts : Arrays_of_Floating_Vector_Lists.Link_to_Array_of_Lists;
! 982:
! 983: begin
! 984: new_line; put_line(welcome);
! 985: tstart(timer);
! 986: Read_Symmetry(n,pv,pw,fv,fw,notsym);
! 987: if notsym
! 988: then put_line("The given system is not symmetric !");
! 989: put_line(file,"The given system is not symmetric !");
! 990: else points := Create(p);
! 991: Data_Management(n,points,pv,pw,fv,fw,fltlif,mix,igencells,permp);
! 992: if compmisu
! 993: then Classify_and_Lift_Orbits
! 994: (file,mix.all,points,pv,pw,fltlif,iliforb,fliforb);
! 995: end if;
! 996: Settings_for_Polyhedral_Continuation;
! 997: tstart(timer);
! 998: if fltlif
! 999: then
! 1000: Generating_Mixed_Cells
! 1001: (file,n,points,pv,pw,mix.all,fliforb,flifpts,fgencells);
! 1002: else
! 1003: Generating_Mixed_Cells
! 1004: (file,n,points,pv,pw,mix.all,iliforb,ilifpts,igencells);
! 1005: if tosolve
! 1006: then Symmetric_Polyhedral_Continuation
! 1007: (file,permp,fv,fw,n,mix.all,ilifpts.all,igencells);
! 1008: end if;
! 1009: end if;
! 1010: end if;
! 1011: tstop(timer);
! 1012: new_line(file);
! 1013: print_times(file,timer,"All Computations");
! 1014: end Main_Driver;
! 1015:
! 1016: begin
! 1017: Main_Driver;
! 1018: end Driver_for_Symmetric_Mixed_Volume_Computation;
! 1019:
! 1020: end Drivers_for_Symmetric_Lifting;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>