Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Stalift/floating_polyhedral_continuation.adb, Revision 1.1.1.1
1.1 maekawa 1: with integer_io; use integer_io;
2: with Standard_Floating_Numbers; use Standard_Floating_Numbers;
3: with Standard_Floating_Numbers_io; use Standard_Floating_Numbers_io;
4: with Standard_Mathematical_Functions; use Standard_Mathematical_Functions;
5: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
6: with Standard_Floating_Vectors_io; use Standard_Floating_Vectors_io;
7: with Standard_Complex_Vectors;
8: with Standard_Complex_Vectors_io; use Standard_Complex_Vectors_io;
9: with Standard_Complex_Norms_Equals; use Standard_Complex_Norms_Equals;
10: with Standard_Integer_VecVecs;
11: with Standard_Floating_VecVecs;
12: with Standard_Complex_Matrices; use Standard_Complex_Matrices;
13: with Standard_Complex_Polynomials;
14: with Standard_Complex_Laur_Polys;
15: with Standard_Complex_Laur_Functions; use Standard_Complex_Laur_Functions;
16: with Standard_Complex_Poly_Systems; use Standard_Complex_Poly_Systems;
17: with Standard_Laur_Poly_Convertors; use Standard_Laur_Poly_Convertors;
18: with Standard_Complex_Substitutors; use Standard_Complex_Substitutors;
19: with Power_Lists; use Power_Lists;
20: with Lists_of_Floating_Vectors; use Lists_of_Floating_Vectors;
21: with Floating_Lifting_Utilities; use Floating_Lifting_Utilities;
22: with Floating_Integer_Convertors; use Floating_Integer_Convertors;
23: with Transforming_Integer_Vector_Lists; use Transforming_Integer_Vector_Lists;
24: with Transforming_Laurent_Systems; use Transforming_Laurent_Systems;
25: with Continuation_Parameters;
26: with Increment_and_Fix_Continuation; use Increment_and_Fix_Continuation;
27: with Fewnomial_System_Solvers; use Fewnomial_System_Solvers;
28: with BKK_Bound_Computations; use BKK_Bound_Computations;
29:
30: package body Floating_Polyhedral_Continuation is
31:
32: -- UTILITIES FOR POLYHEDRAL COEFFICIENT HOMOTOPY :
33:
34: procedure put ( file : in file_type;
35: v : in Standard_Floating_Vectors.Vector;
36: fore,aft,exp : in natural ) is
37: begin
38: for i in v'range loop
39: put(file,v(i),fore,aft,exp);
40: end loop;
41: end put;
42:
43: procedure put ( file : in file_type;
44: v : in Standard_Complex_Vectors.Vector;
45: fore,aft,exp : in natural ) is
46: begin
47: for i in v'range loop
48: put(file,REAL_PART(v(i)),fore,aft,exp);
49: put(file,IMAG_PART(v(i)),fore,aft,exp);
50: end loop;
51: end put;
52:
53: function Power ( x,m : double_float ) return double_float is
54:
55: -- DESCRIPTION :
56: -- Computes x**m for high powers of m to avoid RANGE_ERROR.
57:
58: -- intm : integer := integer(m);
59: -- fltm : double_float;
60:
61: begin
62: -- if m < 10.0
63: -- then
64: return (x**m); -- GNAT is better at this
65: -- else if double_float(intm) > m
66: -- then intm := intm-1;
67: -- end if;
68: -- fltm := m - double_float(intm);
69: -- return ((x**intm)*(x**fltm));
70: -- end if;
71: end Power;
72:
73: function Minimum ( v : Standard_Floating_Vectors.Vector )
74: return double_float is
75:
76: -- DESCRIPTION :
77: -- Returns the minimal element (/= 0) in the vector v.
78:
79: tol : constant double_float := 10.0**(-7);
80: min : double_float := 0.0;
81: tmp : double_float;
82:
83: begin
84: for i in v'range loop
85: tmp := abs(v(i));
86: if tmp > tol
87: then if (min = 0.0) or else (tmp < min)
88: then min := tmp;
89: end if;
90: end if;
91: end loop;
92: return min;
93: end Minimum;
94:
95: function Minimum ( v : Standard_Floating_VecVecs.VecVec )
96: return double_float is
97:
98: -- DESCRIPTION :
99: -- Returns the minimal nonzero element in the vectors of v.
100:
101: tol : constant double_float := 10.0**(-7);
102: min : double_float := 0.0;
103: tmp : double_float;
104:
105: begin
106: for i in v'range loop
107: tmp := Minimum(v(i).all);
108: if abs(tmp) > tol
109: then if (min = 0.0) or else (tmp < min)
110: then min := tmp;
111: end if;
112: end if;
113: end loop;
114: return min;
115: end Minimum;
116:
117: function Scale ( v : Standard_Floating_Vectors.Vector; s : double_float )
118: return Standard_Floating_Vectors.Vector is
119:
120: -- DESCRIPTION :
121: -- Returns the scaled vector, by dividing every element by s.
122:
123: res : Standard_Floating_Vectors.Vector(v'range);
124:
125: begin
126: for i in res'range loop
127: res(i) := v(i)/s;
128: end loop;
129: return res;
130: end Scale;
131:
132: function Scale ( v : Standard_Floating_VecVecs.VecVec )
133: return Standard_Floating_VecVecs.VecVec is
134:
135: -- DESCRIPTION :
136: -- Returns an array of scaled vectors.
137:
138: res : Standard_Floating_VecVecs.VecVec(v'range);
139: min : constant double_float := Minimum(v);
140: tol : constant double_float := 10.0**(-8);
141:
142: begin
143: if (abs(min) > tol) and (min /= 1.0)
144: then
145: for i in v'range loop
146: res(i) := new Standard_Floating_Vectors.Vector'(Scale(v(i).all,min));
147: end loop;
148: else
149: for i in v'range loop
150: res(i) := new Standard_Floating_Vectors.Vector'(v(i).all);
151: end loop;
152: end if;
153: return res;
154: end Scale;
155:
156: procedure Shift ( v : in out Standard_Floating_Vectors.Vector ) is
157:
158: -- DESCRIPTION :
159: -- Shifts the elements in v, such that the minimal element equals zero.
160:
161: min : double_float := v(v'first);
162:
163: begin
164: for i in v'first+1..v'last loop
165: if v(i) < min
166: then min := v(i);
167: end if;
168: end loop;
169: if min /= 0.0
170: then for i in v'range loop
171: v(i) := v(i) - min;
172: end loop;
173: end if;
174: end Shift;
175:
176: function Create ( e : Standard_Integer_VecVecs.VecVec;
177: l : List; normal : Standard_Floating_Vectors.Vector )
178: return Standard_Floating_Vectors.Vector is
179:
180: -- DESCRIPTION :
181: -- Returns a vector with all inner products of the normal with
182: -- the exponents in the list, such that minimal value equals zero.
183:
184: res : Standard_Floating_Vectors.Vector(e'range);
185: use Standard_Floating_Vectors;
186: found : boolean;
187: lif : double_float;
188:
189: begin
190: for i in e'range loop
191: declare
192: fei : constant Standard_Floating_Vectors.Vector := Convert(e(i).all);
193: begin
194: Search_Lifting(l,fei,found,lif);
195: if not found
196: then res(i) := 1000.0;
197: else res(i) := fei*normal(fei'range) + lif*normal(normal'last);
198: end if;
199: end;
200: end loop;
201: Shift(res);
202: return res;
203: end Create;
204:
205: function Create ( e : Exponent_Vectors_Array;
206: l : Array_of_Lists; mix : Standard_Integer_Vectors.Vector;
207: normal : Standard_Floating_Vectors.Vector )
208: return Standard_Floating_VecVecs.VecVec is
209:
210: res : Standard_Floating_VecVecs.VecVec(normal'first..normal'last-1);
211: cnt : natural := res'first;
212:
213: begin
214: for i in mix'range loop
215: declare
216: rescnt : constant Standard_Floating_Vectors.Vector
217: := Create(e(cnt).all,l(i),normal);
218: begin
219: res(cnt) := new Standard_Floating_Vectors.Vector(rescnt'range);
220: for j in rescnt'range loop
221: res(cnt)(j) := rescnt(j);
222: end loop;
223: end;
224: Shift(res(cnt).all);
225: for k in 1..(mix(i)-1) loop
226: res(cnt+k) := new Standard_Floating_Vectors.Vector(res(cnt)'range);
227: for j in res(cnt)'range loop
228: res(cnt+k)(j) := res(cnt)(j);
229: end loop;
230: end loop;
231: cnt := cnt + mix(i);
232: end loop;
233: return res;
234: end Create;
235:
236: procedure Eval ( c : in Standard_Complex_Vectors.Vector;
237: t : in double_float; m : in Standard_Floating_Vectors.Vector;
238: ctm : in out Standard_Complex_Vectors.Vector ) is
239:
240: -- DESCRIPTION : ctm = c*t**m.
241:
242: begin
243: for i in ctm'range loop
244: -- ctm(i) := c(i)*Create((t**m(i)));
245: ctm(i) := c(i)*Create(Power(t,m(i)));
246: end loop;
247: end Eval;
248:
249: procedure Eval ( c : in Standard_Complex_VecVecs.VecVec;
250: t : in double_float; m : in Standard_Floating_VecVecs.VecVec;
251: ctm : in out Standard_Complex_VecVecs.VecVec ) is
252:
253: -- DESCRIPTION : ctm = c*t**m.
254:
255: begin
256: for i in ctm'range loop
257: Eval(c(i).all,t,m(i).all,ctm(i).all);
258: end loop;
259: end Eval;
260:
261: -- USEFUL PRIMITIVES :
262:
263: function Is_In ( l : List;
264: d : Standard_Complex_Laur_Polys.Degrees )
265: return boolean is
266:
267: -- DESCRIPTION :
268: -- Returns true if the degrees belong to the list l.
269:
270: tmp : List := l;
271: pt : Standard_Floating_Vectors.Link_to_Vector;
272: fld : Standard_Floating_Vectors.Vector(d'range);
273: equ : boolean;
274:
275: begin
276: for i in fld'range loop
277: fld(i) := double_float(d(i));
278: end loop;
279: while not Is_Null(tmp) loop
280: pt := Head_Of(tmp);
281: equ := true;
282: for i in fld'range loop
283: if pt(i) /= fld(i)
284: then equ := false;
285: end if;
286: exit when not equ;
287: end loop;
288: if equ
289: then return true;
290: else tmp := Tail_Of(tmp);
291: end if;
292: end loop;
293: return false;
294: end Is_In;
295:
296: function Select_Terms ( p : Standard_Complex_Laur_Polys.Poly; l : List )
297: return Standard_Complex_Laur_Polys.Poly is
298:
299: use Standard_Complex_Laur_Polys;
300: res : Poly := Null_Poly;
301:
302: procedure Visit_Term ( t : in Term; cont : out boolean ) is
303: begin
304: if Is_In(l,t.dg)
305: then Add(res,t);
306: end if;
307: cont := true;
308: end Visit_Term;
309: procedure Visit_Terms is new Visiting_Iterator(Visit_Term);
310:
311: begin
312: Visit_Terms(p);
313: return res;
314: end Select_Terms;
315:
316: function Select_Subsystem
317: ( p : Laur_Sys; mix : Standard_Integer_Vectors.Vector;
318: mic : Mixed_Cell ) return Laur_Sys is
319:
320: -- DESCRIPTION :
321: -- Given a Laurent polynomial system and a mixed cell,
322: -- the corresponding subsystem will be returned.
323:
324: -- ON ENTRY :
325: -- p a Laurent polynomial system;
326: -- mix type of mixture: occurencies of the supports;
327: -- mic a mixed cell.
328:
329: -- REQUIRED :
330: -- The polynomials in p must be ordered according to the type of mixture.
331:
332: res : Laur_Sys(p'range);
333: cnt : natural := 0;
334:
335: begin
336: for k in mix'range loop
337: for l in 1..mix(k) loop
338: cnt := cnt + 1;
339: res(cnt) := Select_Terms(p(cnt),mic.pts(k));
340: end loop;
341: end loop;
342: return res;
343: end Select_Subsystem;
344:
345: procedure Extract_Regular ( sols : in out Solution_List ) is
346:
347: function To_Be_Removed ( flag : in natural ) return boolean is
348: begin
349: return ( flag /= 1 );
350: end To_Be_Removed;
351: procedure Extract_Regular_Solutions is new
352: Standard_Complex_Solutions.Delete(To_Be_Removed);
353:
354: begin
355: Extract_Regular_Solutions(sols);
356: end Extract_Regular;
357:
358: procedure Refine ( file : in file_type; p : in Laur_Sys;
359: sols : in out Solution_List ) is
360:
361: -- DESCRIPTION :
362: -- Given a polyhedral homotopy p and a list of solution for t=1,
363: -- this list of solutions will be refined.
364:
365: pp : Poly_Sys(p'range) := Laurent_to_Polynomial_System(p);
366: n : constant natural := p'length;
367: eps : constant double_float := 10.0**(-12);
368: tolsing : constant double_float := 10.0**(-8);
369: max : constant natural := 3;
370: numb : natural := 0;
371:
372: begin
373: pp := Laurent_to_Polynomial_System(p);
374: Substitute(n+1,Create(1.0),pp);
375: -- Reporting_Root_Refiner(file,pp,sols,eps,eps,tolsing,numb,max,false);
376: Clear(pp); Extract_Regular(sols);
377: end Refine;
378:
379: -- FIRST LAYER OF CONTINUATION ROUTINES :
380:
381: procedure Mixed_Continuation
382: ( mix : in Standard_Integer_Vectors.Vector;
383: lifted : in Array_of_Lists; h : in Eval_Coeff_Laur_Sys;
384: c : in Standard_Complex_VecVecs.VecVec;
385: e : in Exponent_Vectors_Array;
386: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
387: normal : in Standard_Floating_Vectors.Vector;
388: sols : in out Solution_List ) is
389:
390: pow : Standard_Floating_VecVecs.VecVec(c'range)
391: := Create(e,lifted,mix,normal);
392: scapow : Standard_Floating_VecVecs.VecVec(c'range) := Scale(pow);
393: ctm : Standard_Complex_VecVecs.VecVec(c'range);
394:
395: use Standard_Floating_Vectors;
396: use Standard_Complex_Laur_Polys;
397:
398: function Eval ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
399: return Standard_Complex_Vectors.Vector is
400: begin
401: Eval(c,REAL_PART(t),scapow,ctm);
402: return Eval(h,ctm,x);
403: end Eval;
404:
405: function dHt ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
406: return Standard_Complex_Vectors.Vector is
407:
408: res : Standard_Complex_Vectors.Vector(h'range);
409: xtl : constant integer := x'last+1;
410:
411: begin
412: Eval(c,REAL_PART(t),scapow,ctm);
413: for i in res'range loop
414: res(i) := Eval(j(i,xtl),m(i,xtl).all,ctm(i).all,x);
415: end loop;
416: return res;
417: end dHt;
418:
419: function dHx ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
420: return matrix is
421:
422: mt : Matrix(x'range,x'range);
423:
424: begin
425: Eval(c,REAL_PART(t),scapow,ctm);
426: for k in mt'range(1) loop
427: for l in mt'range(2) loop
428: mt(k,l) := Eval(j(k,l),m(k,l).all,ctm(k).all,x);
429: end loop;
430: end loop;
431: return mt;
432: end dHx;
433:
434: procedure Laur_Cont is new Silent_Continue(Max_Norm,Eval,dHt,dHx);
435:
436: begin
437: for i in c'range loop
438: ctm(i)
439: := new Standard_Complex_Vectors.Vector'(c(i).all'range => Create(0.0));
440: end loop;
441: Laur_Cont(sols,false);
442: Standard_Floating_VecVecs.Clear(pow);
443: Standard_Floating_VecVecs.Clear(scapow);
444: Standard_Complex_VecVecs.Clear(ctm);
445: Extract_Regular(sols);
446: end Mixed_Continuation;
447:
448: procedure Mixed_Continuation
449: ( file : in file_type;
450: mix : in Standard_Integer_Vectors.Vector;
451: lifted : in Array_of_Lists; h : in Eval_Coeff_Laur_Sys;
452: c : in Standard_Complex_VecVecs.VecVec;
453: e : in Exponent_Vectors_Array;
454: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
455: normal : in Standard_Floating_Vectors.Vector;
456: sols : in out Solution_List ) is
457:
458: pow : Standard_Floating_VecVecs.VecVec(c'range)
459: := Create(e,lifted,mix,normal);
460: scapow : Standard_Floating_VecVecs.VecVec(c'range) := Scale(pow);
461: ctm : Standard_Complex_VecVecs.VecVec(c'range);
462:
463: use Standard_Floating_Vectors;
464: use Standard_Complex_Laur_Polys;
465:
466: function Eval ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
467: return Standard_Complex_Vectors.Vector is
468: begin
469: Eval(c,REAL_PART(t),scapow,ctm);
470: return Eval(h,ctm,x);
471: end Eval;
472:
473: function dHt ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
474: return Standard_Complex_Vectors.Vector is
475:
476: res : Standard_Complex_Vectors.Vector(h'range);
477: xtl : constant integer := x'last+1;
478:
479: begin
480: Eval(c,REAL_PART(t),scapow,ctm);
481: for i in res'range loop
482: res(i) := Eval(j(i,xtl),m(i,xtl).all,ctm(i).all,x);
483: end loop;
484: return res;
485: end dHt;
486:
487: function dHx ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
488: return Matrix is
489:
490: mt : Matrix(x'range,x'range);
491:
492: begin
493: Eval(c,REAL_PART(t),scapow,ctm);
494: for k in m'range(1) loop
495: for l in m'range(1) loop
496: mt(k,l) := Eval(j(k,l),m(k,l).all,ctm(k).all,x);
497: end loop;
498: end loop;
499: return mt;
500: end dHx;
501:
502: procedure Laur_Cont is new Reporting_Continue(Max_Norm,Eval,dHt,dHx);
503:
504: begin
505: -- put_line(file,"The coefficient vectors :" );
506: -- for i in c'range loop
507: -- put(file,c(i).all,3,3,3); new_line(file);
508: -- end loop;
509: for i in c'range loop
510: ctm(i)
511: := new Standard_Complex_Vectors.Vector'(c(i).all'range => Create(0.0));
512: end loop;
513: -- put(file,"The normal : "); put(file,normal,3,3,3); new_line(file);
514: -- put_line(file,"The exponent vector : ");
515: -- for i in pow'range loop
516: -- put(file,pow(i).all,3,3,3); new_line(file);
517: -- end loop;
518: -- put_line(file,"The scaled exponent vector : ");
519: -- for i in pow'range loop
520: -- put(file,scapow(i).all,3,3,3); new_line(file);
521: -- end loop;
522: Laur_Cont(file,sols,false);
523: Standard_Floating_VecVecs.Clear(pow);
524: Standard_Floating_VecVecs.Clear(scapow);
525: Standard_Complex_VecVecs.Clear(ctm);
526: Extract_Regular(sols);
527: end Mixed_Continuation;
528:
529: -- UTILITIES FOR SECOND LAYER :
530:
531: function Remove_Lifting ( l : List ) return List is
532:
533: -- DESCRIPTION :
534: -- Removes the lifting value from the vectors.
535:
536: tmp,res,res_last : List;
537:
538: begin
539: tmp := l;
540: while not Is_Null(tmp) loop
541: declare
542: d1 : constant Standard_Floating_Vectors.Vector := Head_Of(tmp).all;
543: d2 : constant Standard_Floating_Vectors.Vector
544: := d1(d1'first..d1'last-1);
545: begin
546: Append(res,res_last,d2);
547: end;
548: tmp := Tail_Of(tmp);
549: end loop;
550: return res;
551: end Remove_Lifting;
552:
553: function Sub_Lifting ( q : Laur_Sys; mix : Standard_Integer_Vectors.Vector;
554: mic : Mixed_Cell ) return Array_of_Lists is
555:
556: -- DESCRIPTION :
557: -- Returns the lifting used to subdivide the cell.
558:
559: res : Array_of_Lists(mix'range);
560: sup : Array_of_Lists(q'range);
561: n : constant natural := q'last;
562: cnt : natural := sup'first;
563:
564: begin
565: for i in mic.pts'range loop
566: sup(cnt) := Remove_Lifting(mic.pts(i));
567: for j in 1..(mix(i)-1) loop
568: Copy(sup(cnt),sup(cnt+j));
569: end loop;
570: cnt := cnt + mix(i);
571: end loop;
572: res := Induced_Lifting(n,mix,sup,mic.sub.all);
573: Deep_Clear(sup);
574: return res;
575: end Sub_Lifting;
576:
577: function Sub_Polyhedral_Homotopy
578: ( l : List; e : Standard_Integer_VecVecs.VecVec;
579: c : Standard_Complex_Vectors.Vector )
580: return Standard_Complex_Vectors.Vector is
581:
582: -- DESCRIPTION :
583: -- For every vector in e that does not belong to l, the corresponding
584: -- index in c will be set to zero, otherwise it is copied to the result.
585:
586: res : Standard_Complex_Vectors.Vector(c'range);
587: found : boolean;
588: lif : double_float;
589:
590: begin
591: for i in e'range loop
592: declare
593: fei : constant Standard_Floating_Vectors.Vector := Convert(e(i).all);
594: begin
595: Search_Lifting(l,fei,found,lif);
596: if not found
597: then res(i) := Create(0.0);
598: else res(i) := c(i);
599: end if;
600: end;
601: end loop;
602: return res;
603: end Sub_Polyhedral_Homotopy;
604:
605: function Sub_Polyhedral_Homotopy
606: ( mix : Standard_Integer_Vectors.Vector; mic : Mixed_Cell;
607: e : Exponent_Vectors_Array;
608: c : Standard_Complex_VecVecs.VecVec )
609: return Standard_Complex_VecVecs.VecVec is
610:
611: -- DESCRIPTION :
612: -- Given a subsystem q of p and the coefficient vector of p, the
613: -- vector on return will have only nonzero entries for coefficients
614: -- that belong to q.
615:
616: res : Standard_Complex_VecVecs.VecVec(c'range);
617:
618: begin
619: for i in mix'range loop
620: declare
621: cri : constant Standard_Complex_Vectors.Vector
622: := Sub_Polyhedral_Homotopy(mic.pts(i),e(i).all,c(i).all);
623: begin
624: res(i) := new Standard_Complex_Vectors.Vector'(cri);
625: for j in 1..(mix(i)-1) loop
626: declare
627: crj : constant Standard_Complex_Vectors.Vector
628: := Sub_Polyhedral_Homotopy(mic.pts(i),e(i+j).all,c(i+j).all);
629: begin
630: res(i+j) := new Standard_Complex_Vectors.Vector'(crj);
631: end;
632: end loop;
633: end;
634: end loop;
635: return res;
636: end Sub_Polyhedral_Homotopy;
637:
638: procedure Refined_Mixed_Solve
639: ( q : in Laur_Sys; mix : in Standard_Integer_Vectors.Vector;
640: mic : in Mixed_Cell; h : in Eval_Coeff_Laur_Sys;
641: c : in Standard_Complex_VecVecs.VecVec;
642: e : in Exponent_Vectors_Array;
643: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
644: qsols : in out Solution_List ) is
645:
646: -- DESCRIPTION :
647: -- Polyhedral coeffient-homotopy for subsystem q.
648:
649: -- REQUIRED : mic.sub /= null.
650:
651: lif : Array_of_Lists(mix'range) := Sub_Lifting(q,mix,mic);
652: cq : Standard_Complex_VecVecs.VecVec(c'range)
653: := Sub_Polyhedral_Homotopy(mix,mic,e,c);
654:
655: begin
656: Mixed_Solve(q,lif,h,cq,e,j,m,mix,mic.sub.all,qsols);
657: Standard_Complex_VecVecs.Clear(cq); Deep_Clear(lif);
658: end Refined_Mixed_Solve;
659:
660: procedure Refined_Mixed_Solve
661: ( file : in file_type; q : in Laur_Sys;
662: mix : in Standard_Integer_Vectors.Vector;
663: mic : in Mixed_Cell; h : in Eval_Coeff_Laur_Sys;
664: c : in Standard_Complex_VecVecs.VecVec;
665: e : in Exponent_Vectors_Array;
666: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
667: qsols : in out Solution_List ) is
668:
669: -- DESCRIPTION :
670: -- Polyhedral coeffient-homotopy for subsystem q.
671:
672: -- REQUIRED : mic.sub /= null.
673:
674: lif : Array_of_Lists(mix'range) := Sub_Lifting(q,mix,mic);
675: cq : Standard_Complex_VecVecs.VecVec(c'range)
676: := Sub_Polyhedral_Homotopy(mix,mic,e,c);
677:
678: begin
679: Mixed_Solve(file,q,lif,h,cq,e,j,m,mix,mic.sub.all,qsols);
680: Standard_Complex_VecVecs.Clear(cq); Deep_Clear(lif);
681: end Refined_Mixed_Solve;
682:
683: -- SECOND LAYER :
684:
685: procedure Mixed_Solve
686: ( p : in Laur_Sys; lifted : in Array_of_Lists;
687: h : in Eval_Coeff_Laur_Sys;
688: c : in Standard_Complex_VecVecs.VecVec;
689: e : in Exponent_Vectors_Array;
690: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
691: mix : in Standard_Integer_Vectors.Vector;
692: mic : in Mixed_Cell;
693: sols,sols_last : in out Solution_List ) is
694:
695: q : Laur_Sys(p'range) := Select_Subsystem(p,mix,mic);
696: sq : Laur_Sys(q'range) := Shift(q);
697: pq : Poly_Sys(q'range);
698: qsols : Solution_List;
699: len : natural := 0;
700: fail : boolean;
701:
702: begin
703: Solve(sq,qsols,fail);
704: if fail
705: then if mic.sub = null
706: then pq := Laurent_to_Polynomial_System(sq);
707: qsols := Solve_by_Static_Lifting(pq);
708: Clear(pq);
709: else Refined_Mixed_Solve(q,mix,mic,h,c,e,j,m,qsols);
710: end if;
711: Set_Continuation_Parameter(qsols,Create(0.0));
712: end if;
713: len := Length_Of(qsols);
714: if len > 0
715: then Mixed_Continuation(mix,lifted,h,c,e,j,m,mic.nor.all,qsols);
716: Concat(sols,sols_last,qsols);
717: end if;
718: Clear(sq); Clear(q); Clear(qsols);
719: end Mixed_Solve;
720:
721: procedure Mixed_Solve
722: ( file : in file_type;
723: p : in Laur_Sys; lifted : in Array_of_Lists;
724: h : in Eval_Coeff_Laur_Sys;
725: c : in Standard_Complex_VecVecs.VecVec;
726: e : in Exponent_Vectors_Array;
727: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
728: mix : in Standard_Integer_Vectors.Vector;
729: mic : in Mixed_Cell;
730: sols,sols_last : in out Solution_List ) is
731:
732: q : Laur_Sys(p'range) := Select_Subsystem(p,mix,mic);
733: sq : Laur_Sys(q'range) := Shift(q);
734: pq : Poly_Sys(q'range);
735: qsols : Solution_List;
736: len : natural := 0;
737: fail : boolean;
738:
739: begin
740: Solve(sq,qsols,fail);
741: if not fail
742: then put_line(file,"It is a fewnomial system.");
743: else put_line(file,"No fewnomial system.");
744: if mic.sub = null
745: then put_line(file,"Calling the black box solver.");
746: pq := Laurent_to_Polynomial_System(sq);
747: qsols := Solve_by_Static_Lifting(file,pq);
748: Clear(pq);
749: else put_line(file,"Using the refinement of the cell.");
750: Refined_Mixed_Solve(file,q,mix,mic,h,c,e,j,m,qsols);
751: end if;
752: Set_Continuation_Parameter(qsols,Create(0.0));
753: end if;
754: len := Length_Of(qsols);
755: put(file,len,1); put_line(file," solutions found.");
756: if len > 0
757: then
758: Mixed_Continuation(file,mix,lifted,h,c,e,j,m,mic.nor.all,qsols);
759: Concat(sols,sols_last,qsols);
760: end if;
761: Clear(sq); Clear(q); Clear(qsols);
762: end Mixed_Solve;
763:
764: -- THIRD LAYER :
765:
766: procedure Mixed_Solve
767: ( p : in Laur_Sys; lifted : in Array_of_Lists;
768: h : in Eval_Coeff_Laur_Sys;
769: c : in Standard_Complex_VecVecs.VecVec;
770: e : in Exponent_Vectors_Array;
771: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
772: mix : in Standard_Integer_Vectors.Vector;
773: mixsub : in Mixed_Subdivision;
774: sols : in out Solution_List ) is
775:
776: tmp : Mixed_Subdivision := mixsub;
777: mic : Mixed_Cell;
778: sols_last : Solution_List;
779:
780: begin
781: while not Is_Null(tmp) loop
782: mic := Head_Of(tmp);
783: Mixed_Solve(p,lifted,h,c,e,j,m,mix,mic,sols,sols_last);
784: tmp := Tail_Of(tmp);
785: end loop;
786: end Mixed_Solve;
787:
788: procedure Mixed_Solve
789: ( file : in file_type;
790: p : in Laur_Sys; lifted : in Array_of_Lists;
791: h : in Eval_Coeff_Laur_Sys;
792: c : in Standard_Complex_VecVecs.VecVec;
793: e : in Exponent_Vectors_Array;
794: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
795: mix : in Standard_Integer_Vectors.Vector;
796: mixsub : in Mixed_Subdivision;
797: sols : in out Solution_List ) is
798:
799: tmp : Mixed_Subdivision := mixsub;
800: mic : Mixed_Cell;
801: sols_last : Solution_List;
802: cnt : natural := 0;
803:
804: begin
805: while not Is_Null(tmp) loop
806: mic := Head_Of(tmp);
807: cnt := cnt + 1;
808: new_line(file);
809: put(file,"*** PROCESSING SUBSYSTEM "); put(file,cnt,1);
810: put_line(file," ***");
811: new_line(file);
812: Mixed_Solve(file,p,lifted,h,c,e,j,m,mix,mic,sols,sols_last);
813: tmp := Tail_Of(tmp);
814: end loop;
815: end Mixed_Solve;
816:
817: end Floating_Polyhedral_Continuation;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>