Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Stalift/drivers_for_static_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_Complex_Numbers; use Standard_Complex_Numbers;
6: with Standard_Integer_Vectors; use Standard_Integer_Vectors;
7: with Standard_Integer_Vectors_io; use Standard_Integer_Vectors_io;
8: with Standard_Floating_Vectors;
9: with Standard_Floating_Vectors_io; use Standard_Floating_Vectors_io;
10: with Standard_Complex_Vectors;
11: with Standard_Complex_Vectors_io; use Standard_Complex_Vectors_io;
12: with Standard_Integer_VecVecs;
13: with Standard_Integer_VecVecs_io; use Standard_Integer_VecVecs_io;
14: with Standard_Floating_VecVecs;
15: with Standard_Complex_VecVecs;
16: with Standard_Complex_Poly_Systems_io; use Standard_Complex_Poly_Systems_io;
17: with Standard_Complex_Laur_Polys; use Standard_Complex_Laur_Polys;
18: with Standard_Complex_Laur_Functions; use Standard_Complex_Laur_Functions;
19: with Standard_Complex_Laur_Systems; use Standard_Complex_Laur_Systems;
20: with Standard_Complex_Laur_SysFun; use Standard_Complex_Laur_SysFun;
21: with Standard_Complex_Laur_Jacomats; use Standard_Complex_Laur_Jacomats;
22: with Exponent_Vectors; use Exponent_Vectors;
23: with Standard_Poly_Laur_Convertors; use Standard_Poly_Laur_Convertors;
24: with Standard_Laur_Poly_Convertors; use Standard_Laur_Poly_Convertors;
25: with Lists_of_Integer_Vectors; use Lists_of_Integer_Vectors;
26: with Lists_of_Integer_Vectors_io; use Lists_of_Integer_Vectors_io;
27: with Arrays_of_Integer_Vector_Lists; use Arrays_of_Integer_Vector_Lists;
28: with Arrays_of_Integer_Vector_Lists_io; use Arrays_of_Integer_Vector_Lists_io;
29: with Arrays_of_Floating_Vector_Lists; use Arrays_of_Floating_Vector_Lists;
30: with Floating_Integer_Convertors; use Floating_Integer_Convertors;
31: with Integer_Faces_of_Polytope;
32: with Floating_Faces_of_Polytope;
33: with Standard_Complex_Solutions; use Standard_Complex_Solutions;
34: with Standard_Complex_Solutions_io; use Standard_Complex_Solutions_io;
35: with Power_Lists; use Power_Lists;
36: with Transforming_Integer_Vector_Lists; use Transforming_Integer_Vector_Lists;
37: with Integer_Mixed_Subdivisions;
38: with Integer_Mixed_Subdivisions_io; use Integer_Mixed_Subdivisions_io;
39: with Floating_Mixed_Subdivisions;
40: with Floating_Mixed_Subdivisions_io; use Floating_Mixed_Subdivisions_io;
41: with Mixed_Volume_Computation; use Mixed_Volume_Computation;
42: with Integer_Lifting_Functions; use Integer_Lifting_Functions;
43: with Integer_Lifting_Utilities; use Integer_Lifting_Utilities;
44: with Floating_Lifting_Functions; use Floating_Lifting_Functions;
45: with Floating_Lifting_Utilities; use Floating_Lifting_Utilities;
46: with Integer_Pruning_Methods; use Integer_Pruning_Methods;
47: with Floating_Pruning_Methods; use Floating_Pruning_Methods;
48: with Driver_for_Criterion;
49: with Drivers_for_Lifting_Functions; use Drivers_for_Lifting_Functions;
50: with Pruning_Statistics;
51: with Integer_Polyhedral_Continuation; use Integer_Polyhedral_Continuation;
52: with Floating_Polyhedral_Continuation; use Floating_Polyhedral_Continuation;
53: --with Power_Polyhedral_Continuation; use Power_Polyhedral_Continuation;
54: with Driver_for_Polyhedral_Continuation;
55:
56: package body Drivers_for_Static_Lifting is
57:
58: procedure Static_Lifting_Info is
59:
60: i : array(1..11) of string(1..65);
61:
62: begin
63: i( 1):=" Static lifting is a general procedure to construct regular";
64: i( 2):="mixed subdivisions of a tuple of polytopes. For mixed-volume";
65: i( 3):="computation, only those cells that are spanned by a tuple of";
66: i( 4):="edges contribute to the mixed volume. These cells are the so-";
67: i( 5):="called mixed cells in the subdivision. The collection of mixed";
68: i( 6):="cells is computed efficiently by pruning in the tree of lifted";
69: i( 7):="edge-edge combinations. ";
70: i( 8):=" These mixed cells provide the start systems in the polyhedral";
71: i( 9):="homotopy methods used to solve a random coefficient start system.";
72: i(10):="Recursion is applied in case the lifting does not induce at once";
73: i(11):="a fine mixed subdivision. ";
74: for k in i'range loop
75: put_line(i(k));
76: end loop;
77: end Static_Lifting_Info;
78:
79: procedure Driver_for_Mixed_Volume_Computation
80: ( file : in file_type; p : in Poly_Sys; byebye : in boolean;
81: q : out Poly_Sys; qsols : out Solution_List;
82: mv : out natural ) is
83:
84: welcome : constant string := "Mixed-Volume Computation by Static Lifting";
85:
86: permp : Poly_Sys(p'range); -- permuted system
87: tmv,nbcells : natural;
88: mix : Standard_Integer_Vectors.Link_to_Vector;
89: imixsub : Integer_Mixed_Subdivisions.Mixed_Subdivision;
90: fmixsub : Floating_Mixed_Subdivisions.Mixed_Subdivision;
91:
92: -- the switches, to do or not to do, if true then :
93:
94: compmix : boolean; -- compute the type of mixture
95: compmisu : boolean; -- compute the subdivision
96: report : boolean; -- report during creation of the subdivision
97: misufile : boolean; -- put the subdivision on separate file
98: tosolve : boolean; -- solve the system
99: ranstart : boolean; -- construct random coefficient start system
100: contrep : boolean; -- intermediate output during continuation
101:
102: -- the files :
103:
104: solsft,gft : file_type;
105:
106: -- AUXILIARIES :
107:
108: function Select_Terms
109: ( p : Poly_Sys; mix : Standard_Integer_Vectors.Vector;
110: pts : Arrays_of_Integer_Vector_Lists.Array_of_Lists )
111: return Poly_Sys is
112:
113: -- DESCRIPTION :
114: -- Returns those terms of p whose exponents belong to the lists pts.
115: -- The type of mixture is in mix and pts'range = mix'range.
116:
117: res : Poly_Sys(p'range);
118: ind : natural := 0;
119:
120: begin
121: for i in pts'range loop
122: for j in 1..mix(i) loop
123: ind := ind + 1;
124: res(ind) := Select_Terms(p(ind),pts(i));
125: end loop;
126: end loop;
127: return res;
128: end Select_Terms;
129:
130: function Select_Lifted
131: ( p : Poly_Sys; mix : Standard_Integer_Vectors.Vector;
132: lifsup : Arrays_of_Floating_Vector_Lists.Array_of_Lists )
133: return Poly_Sys is
134:
135: -- DESCRIPTION :
136: -- Returns the system whose terms have exponents that occur in the
137: -- lifted supports.
138:
139: res : Poly_Sys(p'range);
140: intsup : Arrays_of_Integer_Vector_Lists.Array_of_Lists(lifsup'range);
141:
142: begin
143: intsup := Convert(lifsup);
144: for i in intsup'range loop
145: Reduce(intsup(i),p'last+1);
146: end loop;
147: res := Select_Terms(p,mix,intsup);
148: Arrays_of_Integer_Vector_Lists.Deep_Clear(intsup);
149: return res;
150: end Select_Lifted;
151:
152: -- REPORT DURING CREATION :
153:
154: procedure Write_Cell ( mic : in Integer_Mixed_Subdivisions.Mixed_Cell;
155: continue : out boolean ) is
156:
157: vol : natural;
158:
159: begin
160: nbcells := nbcells + 1;
161: put(file,"Cell no. "); put(file,nbcells,1); put_line(file," : ");
162: put(file," normal to cell : "); put(file,mic.nor); new_line(file);
163: put_line(file," the points in the cell : ");
164: for k in mic.pts'range loop
165: put(file," component "); put(file,k,1); put(file," with ");
166: put(file,Length_Of(mic.pts(k)),1); put_line(file," points :");
167: put(file,mic.pts(k));
168: end loop;
169: vol := Mixed_Volume(p'length,mix.all,mic);
170: put(file," with volume addition : ");
171: put(file,tmv,1); put(file," + "); put(file,vol,1);
172: tmv := tmv + vol; put(file," = "); put(file,tmv,1); new_line(file);
173: continue := true;
174: end Write_Cell;
175: procedure Report_and_Create1_CS is new Gen1_Create_CS(Write_Cell);
176:
177: procedure Compute_Mixture
178: ( file : in file_type; n : in natural;
179: compmixture : in boolean;
180: supports : in out Arrays_of_Integer_Vector_Lists.Array_of_Lists;
181: mix : in out Standard_Integer_Vectors.Link_to_Vector;
182: permp : out Poly_Sys ) is
183:
184: -- DESCRIPTION :
185: -- Computes the type of mixture and permutes if necessary,
186: -- the equations in the polynomial system.
187:
188: perm : Standard_Integer_Vectors.Link_to_Vector;
189:
190: begin
191: if compmixture
192: then Compute_Mixture(supports,mix,perm);
193: else perm := Compute_Permutation(n,mix.all,supports);
194: end if;
195: permp := Permute(p,perm); Clear(perm);
196: new_line(file);
197: put(file,"TYPE OF MIXTURE : "); put(file,"#supports : ");
198: put(file,mix'last,1);
199: put(file," occurrences : "); put(file,mix);
200: new_line(file);
201: end Compute_Mixture;
202:
203: function Expand
204: ( mix : Vector;
205: points : Arrays_of_Integer_Vector_Lists.Array_of_Lists )
206: return Arrays_of_Integer_Vector_Lists.Array_of_Lists is
207:
208: -- DESCRIPTION :
209: -- Returns a tuple of expanded lists, according to the type of mixture.
210:
211: sum : integer := Standard_Integer_Vectors.Sum(mix);
212: res : Arrays_of_Integer_Vector_Lists.Array_of_Lists(1..sum);
213: cnt : natural := 0;
214:
215: begin
216: for i in mix'range loop
217: for j in 1..mix(i) loop
218: cnt := cnt + 1;
219: res(cnt) := points(i);
220: end loop;
221: end loop;
222: return res;
223: end Expand;
224:
225: procedure Write_Cardinalities
226: ( file : in file_type;
227: mix,card : in Standard_Integer_Vectors.Vector ) is
228:
229: begin
230: new_line(file);
231: put_line(file,"CARDINALITIES OF THE LIFTED FACES :");
232: new_line(file);
233: for i in card'range loop
234: put(file," #lifted "); put(file,mix(i),1);
235: put(file,"-faces of polytope "); put(file,i,1);
236: put(file," : "); put(file,card(i),1); new_line(file);
237: end loop;
238: end Write_Cardinalities;
239:
240: procedure Create_Mixed_Cells
241: ( file : in file_type; n : in natural; mix : in Vector;
242: mixpts : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
243: lifted : in out Arrays_of_Integer_Vector_Lists.Array_of_Lists;
244: mixsub : in out Integer_Mixed_Subdivisions.Mixed_Subdivision ) is
245:
246: -- DESCRIPTION :
247: -- The pruning algorithm will be applied to compute the mixed cells.
248:
249: use Integer_Faces_of_Polytope;
250: afa : Array_of_Faces(mix'range);
251: cardafa : Standard_Integer_Vectors.Vector(mix'range);
252: nbsucc,nbfail : Standard_Floating_Vectors.Vector(mix'range)
253: := (mix'range => 0.0);
254: timer : timing_widget;
255:
256: begin
257: tstart(timer);
258: for i in afa'range loop
259: afa(i) := Create_Lower(mix(i),n+1,lifted(i));
260: end loop;
261: tstop(timer);
262: for i in afa'range loop
263: cardafa(i) := Length_Of(afa(i));
264: end loop;
265: Write_Cardinalities(file,mix,cardafa);
266: new_line(file);
267: print_times(file,timer,"Creation of the faces of lower hull");
268: new_line(file);
269: put_line(file,"PRUNING TO EXTRACT THE MIXED CELLS :");
270: tstart(timer);
271: if report
272: then nbcells := 0; tmv := 0;
273: Report_and_Create1_CS(n,mix,afa,lifted,nbsucc,nbfail,mixsub);
274: else Create_CS(n,mix,afa,lifted,nbsucc,nbfail,mixsub);
275: end if;
276: tstop(timer);
277: Pruning_Statistics(file,nbsucc,nbfail);
278: new_line(file);
279: print_times(file,timer,"Pruning for Mixed Cells");
280: end Create_Mixed_Cells;
281:
282: procedure Create_Mixed_Cells
283: ( file : in file_type;
284: n : in natural; mix : in Standard_Integer_Vectors.Vector;
285: fltsup : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
286: lilifu : in Standard_Floating_VecVecs.Link_to_VecVec;
287: lifsup : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
288: fltsub : in out Floating_Mixed_Subdivisions.Mixed_Subdivision ) is
289:
290: use Standard_Floating_VecVecs;
291: use Floating_Faces_of_Polytope;
292: timer : timing_widget;
293: tol : constant double_float := 10.0**(-8);
294: supfa,liffaces : Array_of_Faces(mix'range);
295: cardafa : Standard_Integer_Vectors.Vector(mix'range);
296: nbsucc,nbfail : Standard_Floating_Vectors.Vector(mix'range)
297: := (mix'range => 0.0);
298:
299: begin
300: tstart(timer);
301: if lilifu /= null
302: then for i in supfa'range loop
303: supfa(i) := Create(mix(i),n,fltsup(i),tol);
304: liffaces(i) := Linear_Lift(supfa(i),lilifu(i).all);
305: end loop;
306: else for i in liffaces'range loop
307: liffaces(i) := Create_Lower(mix(i),n+1,lifsup(i),tol);
308: end loop;
309: end if;
310: tstop(timer);
311: for i in liffaces'range loop
312: cardafa(i) := Length_Of(liffaces(i));
313: end loop;
314: Write_Cardinalities(file,mix,cardafa);
315: new_line(file);
316: print_times(file,timer,"Creation of the faces of lower hull");
317: new_line(file);
318: put_line(file,"PRUNING TO EXTRACT THE MIXED CELLS :");
319: tstart(timer);
320: Create(n,mix,liffaces,lifsup,tol,nbsucc,nbfail,fltsub);
321: tstop(timer);
322: Pruning_Statistics(file,nbsucc,nbfail);
323: new_line(file);
324: print_times(file,timer,"Pruning for Mixed Cells.");
325: end Create_Mixed_Cells;
326:
327: procedure Polyhedral_Homotopy_Continuation
328: ( file : in file_type; qq : in out Poly_Sys;
329: qqsols : in out Solution_List;
330: lifted : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
331: mixsub : in Integer_Mixed_Subdivisions.Mixed_Subdivision ) is
332:
333: -- DESCRIPTION :
334: -- This procedure constructs and solves a random coefficient start system.
335: -- Only those monomials whose exponents occur in the subdivision are
336: -- contained in the start system.
337:
338: timer : timing_widget;
339: n : constant natural := p'length;
340: lifted_lq,lq : Laur_Sys(q'range);
341: h : Eval_Coeff_Laur_Sys(q'range);
342: c : Standard_Complex_VecVecs.VecVec(h'range);
343: e : Exponent_Vectors_Array(h'range);
344: j : Eval_Coeff_Jaco_Mat(h'range,h'first..h'last+1);
345: m : Mult_Factors(j'range(1),j'range(2));
346:
347: begin
348: new_line(file);
349: put_line(file,"POLYHEDRAL HOMOTOPY CONTINUATION :");
350: lq := Polynomial_to_Laurent_System(qq);
351: lifted_lq := Perform_Lifting(n,mix.all,lifted,lq);
352: Clear(lq);
353: lq := Eval(lifted_lq,Create(1.0),n+1);
354: qq := Laurent_to_Polynomial_System(lq);
355: h := Create(lq);
356: for i in c'range loop
357: declare
358: coeff_lq : constant Standard_Complex_Vectors.Vector := Coeff(lq(i));
359: begin
360: c(i) := new Standard_Complex_Vectors.Vector(coeff_lq'range);
361: for k in coeff_lq'range loop
362: c(i)(k) := coeff_lq(k);
363: end loop;
364: end;
365: end loop;
366: e := Create(lq);
367: Create(lq,j,m);
368: tstart(timer);
369: if contrep
370: then --Mixed_Solve(file,lifted_lq,mix.all,mixsub,qqsols);
371: Mixed_Solve(file,lifted_lq,lifted,h,c,e,j,m,mix.all,mixsub,qqsols);
372: else --Mixed_Solve(lifted_lq,mix.all,mixsub,qqsols);
373: Mixed_Solve(lifted_lq,lifted,h,c,e,j,m,mix.all,mixsub,qqsols);
374: end if;
375: tstop(timer);
376: new_line(file);
377: print_times(file,timer,"Polyhedral Continuation");
378: q := qq; qsols := qqsols;
379: end Polyhedral_Homotopy_Continuation;
380:
381: function Select_Terms
382: ( p : Poly_Sys;
383: lifsup : Arrays_of_Floating_Vector_Lists.Array_of_Lists )
384: return Poly_Sys is
385:
386: -- DESCRIPTION :
387: -- Returns the system whose terms have exponents that occur in the
388: -- lifted supports.
389:
390: res : Poly_Sys(p'range);
391: intsup : Arrays_of_Integer_Vector_Lists.Array_of_Lists(lifsup'range);
392:
393: begin
394: intsup := Convert(lifsup);
395: for i in intsup'range loop
396: Reduce(intsup(i),p'last+1);
397: end loop;
398: res := Select_Terms(p,intsup);
399: Arrays_of_Integer_Vector_Lists.Deep_Clear(intsup);
400: return res;
401: end Select_Terms;
402:
403: procedure Polyhedral_Homotopy_Continuation
404: ( file : in file_type;
405: n : in natural; mix : in Standard_Integer_Vectors.Vector;
406: qq : in Poly_Sys; qqsols : in out Solution_List;
407: lifsup : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
408: fltsub : in Floating_Mixed_Subdivisions.Mixed_Subdivision;
409: contrep : in boolean ) is
410:
411: lq : Laur_Sys(qq'range) := Polynomial_to_Laurent_System(qq);
412: h : Eval_Coeff_Laur_Sys(qq'range);
413: c : Standard_Complex_VecVecs.VecVec(h'range);
414: e : Exponent_Vectors_Array(h'range);
415: j : Eval_Coeff_Jaco_Mat(h'range,h'first..h'last+1);
416: m : Mult_Factors(j'range(1),j'range(2));
417: timer : timing_widget;
418:
419: begin
420: new_line(file);
421: put_line(file,"POLYHEDRAL HOMOTOPY CONTINUATION :");
422: h := Create(lq);
423: for i in c'range loop
424: declare
425: coeff_lq : constant Standard_Complex_Vectors.Vector := Coeff(lq(i));
426: begin
427: c(i) := new Standard_Complex_Vectors.Vector(coeff_lq'range);
428: for k in coeff_lq'range loop
429: c(i)(k) := coeff_lq(k);
430: end loop;
431: end;
432: end loop;
433: e := Create(lq);
434: Create(lq,j,m);
435: tstart(timer);
436: if contrep
437: then Mixed_Solve(file,lq,lifsup,h,c,e,j,m,mix,fltsub,qqsols);
438: else Mixed_Solve(lq,lifsup,h,c,e,j,m,mix,fltsub,qqsols);
439: end if;
440: tstop(timer);
441: new_line(file);
442: print_times(file,timer,"Polyhedral Homotopy Continuation");
443: q := qq; qsols := qqsols;
444: end Polyhedral_Homotopy_Continuation;
445:
446: procedure Volume_Computation
447: ( file : in file_type;
448: n : in natural; mix : in Vector;
449: lifpts : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
450: mixsub : in out Integer_Mixed_Subdivisions.Mixed_Subdivision ) is
451:
452: -- DESCRIPTION :
453: -- Computes the volumes of the mixed cells in mixsub.
454:
455: timer : timing_widget;
456: mixvol : natural;
457:
458: begin
459: new_line(file);
460: put_line(file,"VOLUMES OF MIXED CELLS :");
461: new_line(file);
462: tstart(timer);
463: put(file,n,mix,mixsub,mixvol);
464: tstop(timer);
465: put(file,"The total mixed volume equals ");
466: put(file,mixvol,1); new_line(file);
467: new_line(file);
468: print_times(file,timer,"Volume computation of mixed cells");
469: if compmisu
470: then mixsub := Integer_Mixed_Subdivisions.Create(lifpts,mixsub);
471: new_line(file);
472: put_line(file,"VOLUMES OF MIXED CELLS, AFTER REFINEMENT :");
473: new_line(file);
474: tstart(timer);
475: put(file,n,mix,mixsub,mixvol);
476: tstop(timer);
477: put(file,"The total mixed volume equals ");
478: put(file,mixvol,1); new_line(file);
479: new_line(file);
480: print_times(file,timer,"Volume computation of mixed cells");
481: end if;
482: mv := mixvol;
483: end Volume_Computation;
484:
485: procedure Volume_Computation
486: ( file : in file_type; n : in natural; mix : in Vector;
487: mixsub : in out Floating_Mixed_Subdivisions.Mixed_Subdivision ) is
488:
489: timer : timing_widget;
490: mixvol : natural;
491:
492: begin
493: new_line(file);
494: put_line(file,"THE MIXED SUBDIVISION : ");
495: new_line(file);
496: tstart(timer);
497: Floating_Mixed_Subdivisions_io.put(file,n,mix,mixsub,mixvol);
498: tstop(timer);
499: put(file,"The mixed volume equals : ");
500: put(file,mixvol,1); new_line(file);
501: new_line(file);
502: print_times(file,timer,"Volume computation of mixed cells");
503: mv := mixvol;
504: end Volume_Computation;
505:
506: procedure Data_Management
507: ( mix : in out Standard_Integer_Vectors.Link_to_Vector;
508: compmisu,compmix,fltlif : out boolean ) is
509:
510: -- DESCRIPTION :
511: -- This procedure allows to use previously computed mixed subdivisions.
512:
513: ans : character;
514: m : natural;
515:
516: begin
517: new_line;
518: put("Do you already have a mixed subdivision ? (y/n) ");
519: Ask_Yes_or_No(ans);
520: if ans = 'y'
521: then put("Induced by integer or floating-point lifting (i/f) ");
522: Ask_Alternative(ans,"if");
523: fltlif := (ans = 'f');
524: declare
525: insubft : file_type;
526: nn : natural;
527: begin
528: put_line("Reading the name of the input file.");
529: Read_Name_and_Open_File(insubft);
530: if ans = 'f'
531: then get(insubft,nn,m,mix,fmixsub);
532: else get(insubft,nn,m,mix,imixsub);
533: end if;
534: Close(insubft);
535: new_line(file);
536: put_line(file,"Mixed subdivision supplied by user.");
537: new_line(file);
538: compmisu := false; compmix := false;
539: exception
540: when DATA_ERROR
541: => put_line("Data not in correct format. Will ignore it...");
542: Close(insubft);
543: end;
544: else compmisu := true;
545: put("Do you want to enforce a type mixture ? (y/n) ");
546: Ask_Yes_or_No(ans);
547: if ans = 'y'
548: then put("Give number of different supports : "); get(m);
549: put("Give vector indicating occurrences : ");
550: get(m,mix);
551: compmix := false;
552: else compmix := true;
553: end if;
554: end if;
555: end Data_Management;
556:
557: procedure Main_Driver is
558:
559: n : constant natural := p'length;
560: sp,qq : Poly_Sys(p'range);
561: qqsols : Solution_List;
562: totaltimer : timing_widget;
563: points : Arrays_of_Integer_Vector_Lists.Array_of_Lists(p'range);
564: ilili : Standard_Integer_VecVecs.Link_to_VecVec;
565: flili : Standard_Floating_VecVecs.Link_to_VecVec;
566: fltlif : boolean;
567: mixpts,mixpts1,ilifpts
568: : Arrays_of_Integer_Vector_Lists.Link_to_Array_of_Lists;
569: fpts,flifpts : Arrays_of_Floating_Vector_Lists.Link_to_Array_of_Lists;
570: ans : character;
571:
572: outsubft : file_type;
573:
574: procedure Driver_for_Integer_Lifting is
575: begin
576: if compmisu
577: then new_line;
578: put("Do you want intermediate output on file,");
579: put(" during creation ? (y/n) ");
580: Ask_Yes_or_No(ans);
581: report := (ans = 'y');
582: put("Do you want the mixed cells on separate file ? (y/n) ");
583: Ask_Yes_or_No(ans);
584: misufile := (ans = 'y');
585: if misufile
586: then put_line("Reading the name of the output file.");
587: Read_Name_and_Create_File(outsubft);
588: end if;
589: else ilifpts.all := Induced_Lifting(n,mix.all,points,imixsub);
590: end if;
591: Driver_for_Polyhedral_Continuation
592: (file,sp,0,byebye,qq,gft,solsft,tosolve,ranstart,contrep);
593: if compmisu
594: then Create_Mixed_Cells(file,n,mix.all,mixpts.all,ilifpts.all,imixsub);
595: end if;
596: if not Integer_Mixed_Subdivisions.Is_Null(imixsub)
597: then Volume_Computation(file,n,mix.all,ilifpts.all,imixsub);
598: if compmisu and then misufile
599: then put(outsubft,n,mix.all,imixsub);
600: end if;
601: if tosolve
602: then Polyhedral_Homotopy_Continuation
603: (file,qq,qqsols,ilifpts.all,imixsub);
604: end if;
605: end if;
606: end Driver_for_Integer_Lifting;
607:
608: procedure Driver_for_Float_Lifting is
609: begin
610: if compmisu
611: then new_line;
612: put("Do you want the mixed cells on separate file ? (y/n) ");
613: Ask_Yes_or_No(ans);
614: misufile := (ans = 'y');
615: if misufile
616: then put_line("Reading the name of the output file.");
617: Read_Name_and_Create_File(outsubft);
618: end if;
619: else -- flifpts.all := Induced_Lifting(n,mix.all,fpts.all,fmixsub);
620: flifpts.all := Occured_Lifting(n,mix.all,fpts.all,fmixsub);
621: sp := Select_Lifted(p,mix.all,flifpts.all);
622: end if;
623: Driver_for_Polyhedral_Continuation
624: (file,sp,0,byebye,qq,gft,solsft,tosolve,ranstart,contrep);
625: if compmisu
626: then Create_Mixed_Cells
627: (file,n,mix.all,fpts.all,flili,flifpts.all,fmixsub);
628: if misufile
629: then put(outsubft,n,mix.all,fmixsub);
630: end if;
631: end if;
632: if not Floating_Mixed_Subdivisions.Is_Null(fmixsub)
633: then Volume_Computation(file,n,mix.all,fmixsub);
634: if tosolve
635: then Polyhedral_Homotopy_Continuation
636: (file,n,mix.all,qq,qqsols,flifpts.all,fmixsub,contrep);
637: end if;
638: end if;
639: end Driver_for_Float_Lifting;
640:
641: begin
642: new_line; put_line(welcome);
643: tstart(totaltimer);
644:
645: points := Create(p);
646:
647: Data_Management(mix,compmisu,compmix,fltlif);
648:
649: if compmisu
650: then
651: Compute_Mixture(file,n,compmix,points,mix,permp);
652: mixpts1 := new Arrays_of_Integer_Vector_Lists.
653: Array_of_Lists'(Typed_Lists(mix.all,points));
654:
655: Driver_for_Criterion(file,mixpts1.all);
656:
657: mixpts := new Arrays_of_Integer_Vector_Lists.
658: Array_of_Lists'(Expand(mix.all,mixpts1.all));
659: Compute_Mixture(file,n,compmix,mixpts.all,mix,permp);
660: mixpts := new Arrays_of_Integer_Vector_Lists.
661: Array_of_Lists'(Typed_Lists(mix.all,mixpts.all));
662:
663: ilifpts := new Arrays_of_Integer_Vector_Lists.
664: Array_of_Lists(mix'range);
665: fpts := new Arrays_of_Floating_Vector_Lists.Array_of_Lists(mix'range);
666: flifpts
667: := new Arrays_of_Floating_Vector_Lists.Array_of_Lists(mix'range);
668:
669: sp := Select_Terms(permp,mix.all,mixpts.all);
670:
671: new_line;
672: Driver_for_Lifting_Functions
673: (file,sp,mixpts.all,fltlif,fpts.all,ilifpts.all,
674: flifpts.all,ilili,flili);
675: else
676: mixpts := new Arrays_of_Integer_Vector_Lists.
677: Array_of_Lists'(Typed_Lists(mix.all,points));
678: ilifpts := new Arrays_of_Integer_Vector_Lists.
679: Array_of_Lists(mix'range);
680: fpts := new Arrays_of_Floating_Vector_Lists.
681: Array_of_Lists(points'range);
682: fpts.all := Convert(points);
683: flifpts := new Arrays_of_Floating_Vector_Lists.
684: Array_of_Lists(mix'range);
685: sp := p;
686: end if;
687: if fltlif
688: then Driver_for_Float_Lifting;
689: else Driver_for_Integer_Lifting;
690: end if;
691:
692: if tosolve
693: then new_line(file);
694: put_line(file,"THE RANDOM COEFFICIENT START SYSTEM :");
695: new_line(file);
696: put_line(file,qq);
697: new_line(file);
698: put_line(file,"THE START SOLUTIONS :");
699: new_line(file);
700: put(file,Length_Of(qqsols),qq'length,qqsols);
701: if ranstart
702: then new_line(gft);
703: put_line(gft,"THE SOLUTIONS : "); new_line(gft);
704: put(gft,Length_Of(qqsols),n,qqsols);
705: Close(gft);
706: else put(solsft,Length_Of(qqsols),n,qqsols);
707: Close(solsft);
708: end if;
709: end if;
710:
711: tstop(totaltimer);
712: new_line(file);
713: print_times(file,totaltimer,"All Computations");
714: end Main_Driver;
715:
716: begin
717: Main_Driver;
718: end Driver_for_Mixed_Volume_Computation;
719:
720: end Drivers_for_Static_Lifting;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>