Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Symmetry/drivers_for_symmetric_lifting.adb, Revision 1.1.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>