Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Stalift/integer_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_Complex_Numbers; use Standard_Complex_Numbers;
4: with Standard_Complex_Numbers_io; use Standard_Complex_Numbers_io;
5: with Standard_Mathematical_Functions; use Standard_Mathematical_Functions;
6: with Standard_Integer_Vectors_io; use Standard_Integer_Vectors_io;
7: with Standard_Integer_VecVecs;
8: with Standard_Integer_VecVecs_io; use Standard_Integer_VecVecs_io;
9: with Standard_Floating_Vectors;
10: with Standard_Floating_VecVecs;
11: with Standard_Complex_Vectors;
12: with Standard_Complex_Norms_Equals; use Standard_Complex_Norms_Equals;
13: with Standard_Complex_Matrices; use Standard_Complex_Matrices;
14: with Standard_Complex_Polynomials;
15: with Standard_Complex_Laur_Polys;
16: with Standard_Complex_Laur_Functions; use Standard_Complex_Laur_Functions;
17: with Standard_Complex_Poly_Systems; use Standard_Complex_Poly_Systems;
18: with Standard_Laur_Poly_Convertors; use Standard_Laur_Poly_Convertors;
19: with Standard_Complex_Substitutors; use Standard_Complex_Substitutors;
20: with Lists_of_Integer_Vectors; use Lists_of_Integer_Vectors;
21: with Power_Lists; use Power_Lists;
22: with Integer_Lifting_Utilities; use Integer_Lifting_Utilities;
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 Integer_Polyhedral_Continuation is
31:
32: procedure Write ( file : in file_type;
33: c : in Standard_Complex_VecVecs.VecVec ) is
34: begin
35: for i in c'range loop
36: put(file,i,1); put(file," : ");
37: for j in c(i)'range loop
38: if REAL_PART(c(i)(j)) = 0.0
39: then put(file," 0");
40: else put(file,c(i)(j),2,3,0);
41: end if;
42: end loop;
43: new_line(file);
44: end loop;
45: end Write;
46:
47: -- UTILITIES FOR POLYHEDRAL COEFFICIENT HOMOTOPY :
48:
49: function Power ( x,m : double_float ) return double_float is
50:
51: -- DESCRIPTION :
52: -- Computes x**m for high powers of m to avoid RANGE_ERROR.
53:
54: -- intm : integer := integer(m);
55: -- fltm : double_float;
56:
57: begin
58: -- if m < 10.0
59: -- then
60: return (x**m); -- FOR GNAT 3.07
61: -- else if double_float(intm) > m
62: -- then intm := intm-1;
63: -- end if;
64: -- fltm := m - double_float(intm);
65: -- return ((x**intm)*(x**fltm));
66: -- end if;
67: end Power;
68:
69: function Minimum ( v : Standard_Integer_Vectors.Vector ) return integer is
70:
71: -- DESCRIPTION :
72: -- Returns the minimal element in the vector v, different from zero.
73:
74: tmp,min : integer := 0;
75:
76: begin
77: for i in v'range loop
78: if v(i) /= 0
79: then if v(i) < 0
80: then tmp := -v(i);
81: end if;
82: if min = 0
83: then min := tmp;
84: elsif tmp < min
85: then min := tmp;
86: end if;
87: end if;
88: end loop;
89: return min;
90: end Minimum;
91:
92: function Scale ( v : Standard_Integer_Vectors.Vector )
93: return Standard_Floating_Vectors.Vector is
94:
95: -- DESCRIPTION :
96: -- Returns the vector v divided by its minimal element different from zero,
97: -- such that the smallest positive element in the scaled vector equals one.
98:
99: res : Standard_Floating_Vectors.Vector(v'range);
100: min : constant integer := Minimum(v);
101:
102: begin
103: if (min = 0) or (min = 1)
104: then for i in res'range loop
105: res(i) := double_float(v(i));
106: end loop;
107: else for i in res'range loop
108: res(i) := double_float(v(i))/double_float(min);
109: end loop;
110: end if;
111: return res;
112: end Scale;
113:
114: function Scale ( v : Standard_Integer_VecVecs.VecVec )
115: return Standard_Floating_VecVecs.VecVec is
116:
117: -- DESCRIPTION :
118: -- Returns an array of scaled vectors.
119:
120: res : Standard_Floating_VecVecs.VecVec(v'range);
121:
122: begin
123: for i in v'range loop
124: declare
125: sv : constant Standard_Floating_Vectors.Vector := Scale(v(i).all);
126: begin
127: res(i) := new Standard_Floating_Vectors.Vector(sv'range);
128: for j in sv'range loop
129: res(i)(j) := sv(j);
130: end loop;
131: end; -- detour set up for GNAT 3.07
132: -- res(i) := new Standard_Floating_Vectors.Vector'(Scale(v(i).all));
133: end loop;
134: return res;
135: end Scale;
136:
137: procedure Shift ( v : in out Standard_Integer_Vectors.Vector ) is
138:
139: -- DESCRIPTION :
140: -- Shifts the elements in v, such that the minimal element equals zero.
141:
142: min : integer := v(v'first);
143:
144: begin
145: for i in v'first+1..v'last loop
146: if v(i) < min
147: then min := v(i);
148: end if;
149: end loop;
150: if min /= 0
151: then for i in v'range loop
152: v(i) := v(i) - min;
153: end loop;
154: end if;
155: end Shift;
156:
157: function Create ( e : Standard_Integer_VecVecs.VecVec;
158: l : List; normal : Vector )
159: return Standard_Integer_Vectors.Vector is
160:
161: -- DESCRIPTION :
162: -- Returns a vector with all inner products of the normal with
163: -- the exponents in the list, such that minimal value equals zero.
164:
165: res : Standard_Integer_Vectors.Vector(e'range);
166: lei : Standard_Integer_Vectors.Vector(normal'first..normal'last-1);
167: found : boolean;
168: lif : integer;
169:
170: begin
171: for i in e'range loop
172: lei := e(i).all;
173: Search_Lifting(l,lei,found,lif);
174: if not found
175: then res(i) := 1000;
176: else res(i) := lei*normal(lei'range) + normal(normal'last)*lif;
177: end if;
178: end loop;
179: Shift(res);
180: return res;
181: end Create;
182:
183: function Create ( e : Exponent_Vectors_Array;
184: l : Array_of_Lists; mix,normal : Vector )
185: return Standard_Integer_VecVecs.VecVec is
186:
187: res : Standard_Integer_VecVecs.VecVec(e'range);
188: cnt : natural := res'first;
189:
190: begin
191: for i in mix'range loop
192: declare
193: rescnt : constant Standard_Integer_Vectors.Vector
194: := Create(e(cnt).all,l(i),normal);
195: begin
196: res(cnt) := new Standard_Integer_Vectors.Vector(rescnt'range);
197: for j in rescnt'range loop
198: res(cnt)(j) := rescnt(j);
199: end loop;
200: end;
201: Shift(res(cnt).all);
202: for k in 1..(mix(i)-1) loop
203: res(cnt+k) := new Standard_Integer_Vectors.Vector(res(cnt)'range);
204: for j in res(cnt)'range loop
205: res(cnt+k)(j) := res(cnt)(j);
206: end loop;
207: end loop;
208: cnt := cnt + mix(i);
209: end loop;
210: return res;
211: end Create;
212:
213: function Chebychev_Poly
214: ( k : integer; t : double_float ) return double_float is
215:
216: -- DESCRIPTION : returns T_k(t), T_k = kth Chebychev polynomial.
217: -- note that k can also be negative...
218:
219: begin
220: return COS(double_float(k)*ARCCOS(t));
221: end Chebychev_Poly;
222:
223: function Chebychev_Interpolate
224: ( k : natural; t : double_float ) return double_float is
225:
226: -- DESCRIPTION :
227: -- Uses Chebychev polynomials to return a polynomial f of degree k,
228: -- evaluated at t, such that f(1) = 1 and f(0) = 0 (except if k=0).
229:
230: arg : double_float;
231:
232: begin
233: if k = 0
234: then return 1.0;
235: else arg := (1.0-t)*COS(PI/(2.0*double_float(k))) + t;
236: return Chebychev_Poly(k,arg);
237: end if;
238: end Chebychev_Interpolate;
239:
240: function Interpolate
241: ( k : natural; t : double_float ) return Complex_Number is
242:
243: -- DESCRIPTION :
244: -- Evaluates t^k on the complex unit circle.
245:
246: arg : double_float := 2.0*double_float(k)*PI*t;
247:
248: begin
249: return ((Create(1.0) - Create(SIN(arg),COS(arg)))/Create(2.0));
250: end Interpolate;
251:
252: procedure Eval ( c : in Standard_Complex_Vectors.Vector;
253: t : in double_float; m : in Standard_Integer_Vectors.Vector;
254: ctm : in out Standard_Complex_Vectors.Vector ) is
255:
256: -- DESCRIPTION : ctm = c*t**m.
257:
258: begin
259: for i in ctm'range loop
260: ctm(i) := c(i)*Create((t**m(i)));
261: -- ctm(i) := c(i)*Create(Chebychev_Interpolate(m(i),t));
262: -- ctm(i) := c(i)*Interpolate(m(i),t);
263: end loop;
264: end Eval;
265:
266: procedure Eval ( c : in Standard_Complex_Vectors.Vector;
267: t : in double_float; m : in Standard_Floating_Vectors.Vector;
268: ctm : in out Standard_Complex_Vectors.Vector ) is
269:
270: -- DESCRIPTION : ctm = c*t**m.
271:
272: begin
273: for i in ctm'range loop
274: -- ctm(i) := c(i)*Create((t**m(i)));
275: if (REAL_PART(c(i)) = 0.0) and (IMAG_PART(c(i)) = 0.0)
276: then ctm(i) := Create(0.0);
277: else ctm(i) := c(i)*Create(Power(t,m(i)));
278: end if;
279: end loop;
280: end Eval;
281:
282: procedure Eval ( c : in Standard_Complex_VecVecs.VecVec;
283: t : in double_float;
284: m : in Standard_Integer_VecVecs.VecVec;
285: ctm : in out Standard_Complex_VecVecs.VecVec ) is
286:
287: -- DESCRIPTION : ctm = c*t**m.
288:
289: begin
290: for i in ctm'range loop
291: Eval(c(i).all,t,m(i).all,ctm(i).all);
292: end loop;
293: end Eval;
294:
295: procedure Eval ( c : in Standard_Complex_VecVecs.VecVec;
296: t : in double_float; m : in Standard_Floating_VecVecs.VecVec;
297: ctm : in out Standard_Complex_VecVecs.VecVec ) is
298:
299: -- DESCRIPTION : ctm = c*t**m.
300:
301: begin
302: for i in ctm'range loop
303: Eval(c(i).all,t,m(i).all,ctm(i).all);
304: end loop;
305: end Eval;
306:
307: -- pragma inline(Eval);
308:
309: -- HOMOTOPY CONSTRUCTOR :
310:
311: function Select_Subsystem ( p : Laur_Sys; mix : Vector; mic : Mixed_Cell )
312: return Laur_Sys is
313:
314: res : Laur_Sys(p'range);
315: cnt : natural := 0;
316:
317: begin
318: for k in mix'range loop
319: for l in 1..mix(k) loop
320: cnt := cnt + 1;
321: res(cnt) := Select_Terms(p(cnt),mic.pts(k));
322: end loop;
323: end loop;
324: return res;
325: end Select_Subsystem;
326:
327: function Construct_Homotopy ( p : Laur_Sys; normal : Vector )
328: return Laur_Sys is
329:
330: -- DESCRIPTION :
331: -- Given a Laurent polynomial system of dimension n*(n+1) and a
332: -- normal, a homotopy will be constructed, with t = x(n+1)
333: -- and so that the support of the start system corresponds with
334: -- all points which give the minimal product with the normal.
335:
336: res : Laur_Sys(p'range);
337: n : constant natural := p'length;
338: use Standard_Complex_Laur_Polys;
339:
340: function Construct_Polynomial ( p : Poly; v : Vector ) return Poly is
341:
342: res : Poly := Null_Poly;
343:
344: procedure Construct_Term ( t : in Term; cont : out boolean ) is
345:
346: rt : term;
347:
348: begin
349: rt.cf := t.cf;
350: rt.dg := new Standard_Integer_Vectors.Vector'(t.dg.all);
351: rt.dg(n+1) := t.dg.all*v;
352: Add(res,rt);
353: Clear(rt);
354: cont := true;
355: end Construct_Term;
356: procedure Construct_Terms is
357: new Standard_Complex_Laur_Polys.Visiting_Iterator(Construct_Term);
358:
359: begin
360: Construct_Terms(p);
361: return res;
362: end Construct_Polynomial;
363:
364: begin
365: -- SUBSTITUTIONS :
366: for k in p'range loop
367: res(k) := Construct_Polynomial(p(k),normal);
368: end loop;
369: -- SHIFT :
370: for k in res'range loop
371: declare
372: d : integer := Minimal_Degree(res(k),n+1);
373: t : Term;
374: begin
375: t.cf := Create(1.0);
376: t.dg := new Standard_Integer_Vectors.Vector'(1..n+1 => 0);
377: t.dg(n+1) := -d;
378: Mul(res(k),t);
379: Clear(t);
380: end;
381: end loop;
382: return res;
383: end Construct_Homotopy;
384:
385: function Determine_Power ( n : natural; h : Laur_Sys ) return positive is
386:
387: -- DESCRIPTION :
388: -- Returns the smallest power of the last unknown,
389: -- over all polynomials in h.
390:
391: res : positive := 1;
392: first : boolean := true;
393: d : integer;
394: use Standard_Complex_Laur_Polys;
395:
396: procedure Scan ( t : in Term; cont : out boolean ) is
397: begin
398: if (t.dg(n+1) > 0) and then (t.dg(n+1) < d)
399: then d := t.dg(n+1);
400: end if;
401: cont := true;
402: end Scan;
403: procedure Search_Positive_Minimum is new Visiting_Iterator(Scan);
404:
405: begin
406: for i in h'range loop
407: d := Maximal_Degree(h(i),n+1);
408: if d > 0
409: then Search_Positive_Minimum(h(i));
410: if first
411: then res := d;
412: first := false;
413: elsif d < res
414: then res := d;
415: end if;
416: end if;
417: exit when (d=1);
418: end loop;
419: if res = 1
420: then return res;
421: else return 2;
422: end if;
423: end Determine_Power;
424:
425: procedure Extract_Regular ( sols : in out Solution_List ) is
426:
427: function To_Be_Removed ( flag : in natural ) return boolean is
428: begin
429: return ( flag /= 1 );
430: end To_Be_Removed;
431: procedure Extract_Regular_Solutions is
432: new Standard_Complex_Solutions.Delete(To_Be_Removed);
433:
434: begin
435: Extract_Regular_Solutions(sols);
436: end Extract_Regular;
437:
438: procedure Refine ( file : in file_type; p : in Laur_Sys;
439: sols : in out Solution_List ) is
440:
441: -- DESCRIPTION :
442: -- Given a polyhedral homotopy p and a list of solution for t=1,
443: -- this list of solutions will be refined.
444:
445: pp : Poly_Sys(p'range) := Laurent_to_Polynomial_System(p);
446: n : constant natural := p'length;
447: eps : constant double_float := 10.0**(-12);
448: tolsing : constant double_float := 10.0**(-8);
449: max : constant natural := 3;
450: numb : natural := 0;
451:
452: begin
453: pp := Laurent_to_Polynomial_System(p);
454: Substitute(n+1,Create(1.0),pp);
455: -- Reporting_Root_Refiner(file,pp,sols,eps,eps,tolsing,numb,max,false);
456: Clear(pp); Extract_Regular(sols);
457: end Refine;
458:
459: -- FIRST LAYER OF CONTINUATION ROUTINES :
460:
461: procedure Mixed_Continuation
462: ( p : in Laur_Sys; normal : in Vector;
463: sols : in out Solution_List ) is
464:
465: n : constant natural := p'length;
466:
467: h : Laur_Sys(p'range) := Construct_Homotopy(p,normal);
468: hpe : Eval_Laur_Sys(h'range) := Create(h);
469: j : Jaco_Mat(h'range,h'first..h'last+1) := Create(h);
470: je : Eval_Jaco_Mat(j'range(1),j'range(2)) := Create(j);
471:
472: use Standard_Complex_Laur_Polys;
473:
474: function Eval ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
475: return Standard_Complex_Vectors.Vector is
476:
477: xt : Standard_Complex_Vectors.Vector(x'first..x'last+1);
478:
479: begin
480: xt(x'range) := x;
481: xt(xt'last) := t;
482: return Eval(hpe,xt);
483: end Eval;
484:
485: function dHt ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
486: return Standard_Complex_Vectors.Vector is
487:
488: res : Standard_Complex_Vectors.Vector(p'range);
489: xt : Standard_Complex_Vectors.Vector(x'first..x'last+1);
490:
491: begin
492: xt(x'range) := x;
493: xt(xt'last) := t;
494: for i in res'range loop
495: res(i) := Eval(je(i,xt'last),xt);
496: end loop;
497: return res;
498: end dHt;
499:
500: function dHx ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
501: return matrix is
502:
503: m : Matrix(x'range,x'range);
504: xt : Standard_Complex_Vectors.Vector(x'first..x'last+1);
505:
506: begin
507: xt(x'range) := x;
508: xt(xt'last) := t;
509: for i in m'range(1) loop
510: for j in m'range(1) loop
511: m(i,j) := Eval(je(i,j),xt);
512: end loop;
513: end loop;
514: return m;
515: end dHx;
516:
517: -- pragma inline(Eval,dHt,dHx);
518:
519: procedure Laur_Cont is new Silent_Continue(Max_Norm,Eval,dHt,dHx);
520:
521: begin
522: -- Continuation_Parameters.power_of_t := Determine_Power(h'length,h);
523: Laur_Cont(sols,false);
524: Clear(h); Clear(hpe); Clear(j); Clear(je);
525: Extract_Regular(sols);
526: end Mixed_Continuation;
527:
528: procedure Mixed_Continuation
529: ( file : in file_type; p : in Laur_Sys;
530: normal : in Vector; sols : in out Solution_List ) is
531:
532: h : Laur_Sys(p'range) := Construct_Homotopy(p,normal);
533: hpe : Eval_Laur_Sys(h'range) := Create(h);
534: j : Jaco_Mat(h'range,h'first..h'last+1) := Create(h);
535: je : Eval_Jaco_Mat(j'range(1),j'range(2)) := Create(j);
536:
537: use Standard_Complex_Laur_Polys;
538:
539: function Eval ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
540: return Standard_Complex_Vectors.Vector is
541:
542: xt : Standard_Complex_Vectors.Vector(x'first..x'last+1);
543:
544: begin
545: xt(x'range) := x;
546: xt(xt'last) := t;
547: return Eval(hpe,xt);
548: end Eval;
549:
550: function dHt ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
551: return Standard_Complex_Vectors.Vector is
552:
553: res : Standard_Complex_Vectors.Vector(p'range);
554: xt : Standard_Complex_Vectors.Vector(x'first..x'last+1);
555:
556: begin
557: xt(x'range) := x;
558: xt(xt'last) := t;
559: for i in res'range loop
560: res(i) := Eval(je(i,xt'last),xt);
561: end loop;
562: return res;
563: end dHt;
564:
565: function dHx ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
566: return Matrix is
567:
568: m : Matrix(x'range,x'range);
569: xt : Standard_Complex_Vectors.Vector(x'first..x'last+1);
570:
571: begin
572: xt(x'range) := x;
573: xt(xt'last) := t;
574: for i in m'range(1) loop
575: for j in m'range(1) loop
576: m(i,j) := Eval(je(i,j),xt);
577: end loop;
578: end loop;
579: return m;
580: end dHx;
581:
582: -- pragma inline(Eval,dHt,dHx);
583:
584: procedure Laur_Cont is new Reporting_Continue(Max_Norm,Eval,dHt,dHx);
585:
586: begin
587: -- Continuation_Parameters.power_of_t := Determine_Power(h'length,h);
588: Laur_Cont(file,sols,false);
589: Clear(h); Clear(hpe); Clear(j); Clear(je);
590: Extract_Regular(sols);
591: end Mixed_Continuation;
592:
593: procedure Mixed_Continuation
594: ( mix : in Standard_Integer_Vectors.Vector;
595: lifted : in Array_of_Lists; h : in Eval_Coeff_Laur_Sys;
596: c : in Standard_Complex_VecVecs.VecVec;
597: e : in Exponent_Vectors_Array;
598: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
599: normal : in Vector; sols : in out Solution_List ) is
600:
601: pow : Standard_Integer_VecVecs.VecVec(c'range)
602: := Create(e,lifted,mix,normal);
603: -- scapow : Standard_Floating_VecVecs.VecVec(c'range) := Scale(pow);
604: ctm : Standard_Complex_VecVecs.VecVec(c'range);
605:
606: use Standard_Complex_Laur_Polys;
607:
608: function Eval ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
609: return Standard_Complex_Vectors.Vector is
610: begin
611: -- Eval(c,REAL_PART(t),scapow,ctm);
612: Eval(c,REAL_PART(t),pow,ctm);
613: return Eval(h,ctm,x);
614: end Eval;
615:
616: function dHt ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
617: return Standard_Complex_Vectors.Vector is
618:
619: res : Standard_Complex_Vectors.Vector(h'range);
620: xtl : constant integer := x'last+1;
621:
622: begin
623: -- Eval(c,REAL_PART(t),scapow,ctm);
624: Eval(c,REAL_PART(t),pow,ctm);
625: for i in res'range loop
626: res(i) := Eval(j(i,xtl),m(i,xtl).all,ctm(i).all,x);
627: end loop;
628: return res;
629: end dHt;
630:
631: function dHx ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
632: return matrix is
633:
634: mt : Matrix(x'range,x'range);
635:
636: begin
637: -- Eval(c,REAL_PART(t),scapow,ctm);
638: Eval(c,REAL_PART(t),pow,ctm);
639: for k in mt'range(1) loop
640: for l in mt'range(2) loop
641: mt(k,l) := Eval(j(k,l),m(k,l).all,ctm(k).all,x);
642: end loop;
643: end loop;
644: return mt;
645: end dHx;
646:
647: -- pragma inline(Eval,dHt,dHx);
648:
649: procedure Laur_Cont is new Silent_Continue(Max_Norm,Eval,dHt,dHx);
650:
651: begin
652: for i in c'range loop
653: ctm(i) := new Standard_Complex_Vectors.Vector(c(i)'range);
654: end loop;
655: Laur_Cont(sols,false);
656: Standard_Integer_VecVecs.Clear(pow);
657: -- Standard_Floating_VecVecs.Clear(scapow);
658: Standard_Complex_VecVecs.Clear(ctm);
659: Extract_Regular(sols);
660: end Mixed_Continuation;
661:
662: procedure Mixed_Continuation
663: ( file : in file_type; mix : in Standard_Integer_Vectors.Vector;
664: lifted : in Array_of_Lists; h : in Eval_Coeff_Laur_Sys;
665: c : in Standard_Complex_VecVecs.VecVec;
666: e : in Exponent_Vectors_Array;
667: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
668: normal : in Vector; sols : in out Solution_List ) is
669:
670: pow : Standard_Integer_VecVecs.VecVec(c'range)
671: := Create(e,lifted,mix,normal);
672: -- scapow : Standard_Floating_VecVecs.VecVec(c'range) := Scale(pow);
673: ctm : Standard_Complex_VecVecs.VecVec(c'range);
674:
675: use Standard_Complex_Laur_Polys;
676:
677: function Eval ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
678: return Standard_Complex_Vectors.Vector is
679: begin
680: -- Eval(c,REAL_PART(t),scapow,ctm);
681: Eval(c,REAL_PART(t),pow,ctm);
682: return Eval(h,ctm,x);
683: end Eval;
684:
685: function dHt ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
686: return Standard_Complex_Vectors.Vector is
687:
688: res : Standard_Complex_Vectors.Vector(h'range);
689: xtl : constant integer := x'last+1;
690:
691: begin
692: -- Eval(c,REAL_PART(t),scapow,ctm);
693: Eval(c,REAL_PART(t),pow,ctm);
694: for i in res'range loop
695: res(i) := Eval(j(i,xtl),m(i,xtl).all,ctm(i).all,x);
696: end loop;
697: return res;
698: end dHt;
699:
700: function dHx ( x : Standard_Complex_Vectors.Vector; t : Complex_Number )
701: return Matrix is
702:
703: mt : Matrix(x'range,x'range);
704:
705: begin
706: -- Eval(c,REAL_PART(t),scapow,ctm);
707: Eval(c,REAL_PART(t),pow,ctm);
708: for k in m'range(1) loop
709: for l in m'range(1) loop
710: mt(k,l) := Eval(j(k,l),m(k,l).all,ctm(k).all,x);
711: end loop;
712: end loop;
713: return mt;
714: end dHx;
715:
716: -- pragma inline(Eval,dHt,dHx);
717:
718: procedure Laur_Cont is new Reporting_Continue(Max_Norm,Eval,dHt,dHx);
719:
720: begin
721: -- put(file,"The normal : "); put(file,normal); new_line(file);
722: -- put_line(file,"The exponent vector : ");
723: -- for i in pow'range loop
724: -- put(file,pow(i)); new_line(file);
725: -- end loop;
726: -- put_line(file,"The coefficient vector : "); Write(file,c);
727: for i in c'range loop
728: ctm(i) := new Standard_Complex_Vectors.Vector(c(i)'range);
729: end loop;
730: Laur_Cont(file,sols,false);
731: Standard_Integer_VecVecs.Clear(pow);
732: -- Standard_Floating_VecVecs.Clear(scapow);
733: Standard_Complex_VecVecs.Clear(ctm);
734: Extract_Regular(sols);
735: end Mixed_Continuation;
736:
737: -- UTILITIES FOR SECOND LAYER :
738:
739: function Sub_Lifting ( q : Laur_Sys; mix : Vector; mic : Mixed_Cell )
740: return Array_of_Lists is
741:
742: -- DESCRIPTION :
743: -- Returns the lifting used to subdivide the cell.
744:
745: res : Array_of_Lists(mix'range);
746: sup : Array_of_Lists(q'range);
747: n : constant natural := q'last;
748: cnt : natural := sup'first;
749:
750: begin
751: for i in mic.pts'range loop
752: sup(cnt) := Reduce(mic.pts(i),q'last+1);
753: for j in 1..(mix(i)-1) loop
754: Copy(sup(cnt),sup(cnt+j));
755: end loop;
756: cnt := cnt + mix(i);
757: end loop;
758: res := Induced_Lifting(n,mix,sup,mic.sub.all);
759: Deep_Clear(sup);
760: return res;
761: end Sub_Lifting;
762:
763: procedure Refined_Mixed_Solve
764: ( q : in Laur_Sys; mix : in Vector; mic : in Mixed_Cell;
765: qsols : in out Solution_List ) is
766:
767: -- DESCRIPTION :
768: -- Solves a subsystem q using the refinement of the cell mic.
769:
770: -- REQUIRED : mic.sub /= null.
771:
772: lif : Array_of_Lists(mix'range) := Sub_Lifting(q,mix,mic);
773: lifq : Laur_Sys(q'range) := Perform_Lifting(q'last,mix,lif,q);
774:
775: begin
776: Mixed_Solve(lifq,mix,mic.sub.all,qsols);
777: Deep_Clear(lif); Clear(lifq);
778: end Refined_Mixed_Solve;
779:
780: procedure Refined_Mixed_Solve
781: ( file : in file_type;
782: q : in Laur_Sys; mix : in Vector; mic : in Mixed_Cell;
783: qsols : in out Solution_List ) is
784:
785: -- DESCRIPTION :
786: -- Solves a subsystem q using the refinement of the cell mic.
787:
788: -- REQUIRED : mic.sub /= null.
789:
790: lif : Array_of_Lists(mix'range) := Sub_Lifting(q,mix,mic);
791: lifq : Laur_Sys(q'range) := Perform_Lifting(q'last,mix,lif,q);
792:
793: begin
794: Mixed_Solve(file,lifq,mix,mic.sub.all,qsols);
795: Deep_Clear(lif); Clear(lifq);
796: end Refined_Mixed_Solve;
797:
798: function Sub_Polyhedral_Homotopy
799: ( l : List; e : Standard_Integer_VecVecs.VecVec;
800: c : Standard_Complex_Vectors.Vector )
801: return Standard_Complex_Vectors.Vector is
802:
803: -- DESCRIPTION :
804: -- For every vector in e that does not belong to l, the corresponding
805: -- index in c will be set to zero, otherwise it is copied to the result.
806:
807: res : Standard_Complex_Vectors.Vector(c'range);
808: found : boolean;
809: lif : integer;
810:
811: begin
812: for i in e'range loop
813: Search_Lifting(l,e(i).all,found,lif);
814: if not found
815: then res(i) := Create(0.0);
816: else res(i) := c(i);
817: end if;
818: end loop;
819: return res;
820: end Sub_Polyhedral_Homotopy;
821:
822: function Sub_Polyhedral_Homotopy
823: ( mix : Vector; mic : Mixed_Cell;
824: e : Exponent_Vectors_Array;
825: c : Standard_Complex_VecVecs.VecVec )
826: return Standard_Complex_VecVecs.VecVec is
827:
828: -- DESCRIPTION :
829: -- Given a subsystem q of p and the coefficient vector of p, the
830: -- vector on return will have only nonzero entries for coefficients
831: -- that belong to q.
832:
833: res : Standard_Complex_VecVecs.VecVec(c'range);
834: ind : natural := 0;
835:
836: begin
837: for i in mix'range loop
838: ind := ind+1;
839: declare
840: cri : constant Standard_Complex_Vectors.Vector
841: := Sub_Polyhedral_Homotopy(mic.pts(i),e(ind).all,c(ind).all);
842: begin
843: res(ind) := new Standard_Complex_Vectors.Vector'(cri);
844: for j in 1..(mix(i)-1) loop
845: declare
846: crj : constant Standard_Complex_Vectors.Vector
847: := Sub_Polyhedral_Homotopy(mic.pts(i),e(i+j).all,c(i+j).all);
848: begin
849: ind := ind+1;
850: res(ind) := new Standard_Complex_Vectors.Vector'(crj);
851: end;
852: end loop;
853: end;
854: end loop;
855: return res;
856: end Sub_Polyhedral_Homotopy;
857:
858: procedure Refined_Mixed_Solve
859: ( q : in Laur_Sys; mix : in Vector; mic : in Mixed_Cell;
860: h : in Eval_Coeff_Laur_Sys;
861: c : in Standard_Complex_VecVecs.VecVec;
862: e : in Exponent_Vectors_Array;
863: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
864: qsols : in out Solution_List ) is
865:
866: -- DESCRIPTION :
867: -- Polyhedral coeffient-homotopy for subsystem q.
868:
869: -- REQUIRED : mic.sub /= null.
870:
871: lif : Array_of_Lists(mix'range) := Sub_Lifting(q,mix,mic);
872: lq : Laur_Sys(q'range) := Perform_Lifting(q'last,mix,lif,q);
873: cq : Standard_Complex_VecVecs.VecVec(c'range)
874: := Sub_Polyhedral_Homotopy(mix,mic,e,c);
875:
876: begin
877: Mixed_Solve(lq,lif,h,cq,e,j,m,mix,mic.sub.all,qsols);
878: Standard_Complex_VecVecs.Clear(cq); Deep_Clear(lif); Clear(lq);
879: end Refined_Mixed_Solve;
880:
881: procedure Refined_Mixed_Solve
882: ( file : in file_type; q : in Laur_Sys; mix : in Vector;
883: mic : in Mixed_Cell; h : in Eval_Coeff_Laur_Sys;
884: c : in Standard_Complex_VecVecs.VecVec;
885: e : in Exponent_Vectors_Array;
886: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
887: qsols : in out Solution_List ) is
888:
889: -- DESCRIPTION :
890: -- Polyhedral coeffient-homotopy for subsystem q.
891:
892: -- REQUIRED : mic.sub /= null.
893:
894: lif : Array_of_Lists(mix'range) := Sub_Lifting(q,mix,mic);
895: lq : Laur_Sys(q'range) := Perform_Lifting(q'last,mix,lif,q);
896: cq : Standard_Complex_VecVecs.VecVec(c'range)
897: := Sub_Polyhedral_Homotopy(mix,mic,e,c);
898:
899: begin
900: Mixed_Solve(file,lq,lif,h,cq,e,j,m,mix,mic.sub.all,qsols);
901: Standard_Complex_VecVecs.Clear(cq); Deep_Clear(lif); Clear(lq);
902: end Refined_Mixed_Solve;
903:
904: -- TARGET ROUTINES FOR SECOND LAYER :
905:
906: procedure Mixed_Solve
907: ( p : in Laur_Sys; mix : in Vector; mic : in Mixed_Cell;
908: sols,sols_last : in out Solution_List ) is
909:
910: q : Laur_Sys(p'range) := Select_Subsystem(p,mix,mic);
911: sq : Laur_Sys(q'range);
912: pq : Poly_Sys(q'range);
913: qsols : Solution_List;
914: len : natural := 0;
915: fail : boolean;
916:
917: begin
918: Reduce(q'last+1,q); sq := Shift(q);
919: Solve(sq,qsols,fail);
920: if fail
921: then if mic.sub = null
922: then pq := Laurent_to_Polynomial_System(sq);
923: qsols := Solve_by_Static_Lifting(pq);
924: Clear(pq);
925: else Refined_Mixed_Solve(q,mix,mic,qsols);
926: end if;
927: Set_Continuation_Parameter(qsols,Create(0.0));
928: end if;
929: len := Length_Of(qsols);
930: if len > 0
931: then Mixed_Continuation(p,mic.nor.all,qsols);
932: Concat(sols,sols_last,qsols);
933: end if;
934: Clear(sq); Clear(q); Shallow_Clear(qsols);
935: end Mixed_Solve;
936:
937: procedure Mixed_Solve
938: ( file : in file_type; p : in Laur_Sys;
939: mix : in Vector; mic : in Mixed_Cell;
940: sols,sols_last : in out Solution_List ) is
941:
942: q : Laur_Sys(p'range) := Select_Subsystem(p,mix,mic);
943: sq : Laur_Sys(q'range);
944: pq : Poly_Sys(q'range);
945: qsols : Solution_List;
946: len : natural := 0;
947: fail : boolean;
948:
949: begin
950: Reduce(q'last+1,q); sq := Shift(q);
951: Solve(sq,qsols,fail);
952: if not fail
953: then put_line(file,"It is a fewnomial system.");
954: else put_line(file,"No fewnomial system.");
955: if mic.sub = null
956: then put_line(file,"Calling the black box solver.");
957: pq := Laurent_to_Polynomial_System(sq);
958: qsols := Solve_by_Static_Lifting(file,pq);
959: Clear(pq);
960: else put_line(file,"Using the refinement of the cell.");
961: Refined_Mixed_Solve(file,q,mix,mic,qsols);
962: end if;
963: Set_Continuation_Parameter(qsols,Create(0.0));
964: end if;
965: len := Length_Of(qsols);
966: put(file,len,1); put_line(file," solutions found.");
967: if len > 0
968: then Mixed_Continuation(file,p,mic.nor.all,qsols);
969: Concat(sols,sols_last,qsols);
970: end if;
971: Clear(sq); Clear(q); Shallow_Clear(qsols);
972: end Mixed_Solve;
973:
974: procedure Mixed_Solve
975: ( p : in Laur_Sys; lifted : in Array_of_Lists;
976: h : in Eval_Coeff_Laur_Sys;
977: c : in Standard_Complex_VecVecs.VecVec;
978: e : in Exponent_Vectors_Array;
979: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
980: mix : in Vector; mic : in Mixed_Cell;
981: sols,sols_last : in out Solution_List ) is
982:
983: q : Laur_Sys(p'range) := Select_Subsystem(p,mix,mic);
984: sq : Laur_Sys(q'range);
985: pq : Poly_Sys(q'range);
986: qsols : Solution_List;
987: len : natural := 0;
988: fail : boolean;
989:
990: begin
991: Reduce(q'last+1,q); sq := Shift(q);
992: if mic.sub = null
993: then Solve(sq,qsols,fail);
994: else fail := true;
995: end if;
996: if fail
997: then if mic.sub = null
998: then pq := Laurent_to_Polynomial_System(sq);
999: qsols := Solve_by_Static_Lifting(pq);
1000: Clear(pq);
1001: else -- Refined_Mixed_Solve(q,mix,mic,qsols);
1002: Refined_Mixed_Solve(q,mix,mic,h,c,e,j,m,qsols);
1003: end if;
1004: Set_Continuation_Parameter(qsols,Create(0.0));
1005: end if;
1006: len := Length_Of(qsols);
1007: if len > 0
1008: then Mixed_Continuation(mix,lifted,h,c,e,j,m,mic.nor.all,qsols);
1009: Concat(sols,sols_last,qsols);
1010: end if;
1011: Clear(sq); Clear(q); Shallow_Clear(qsols);
1012: end Mixed_Solve;
1013:
1014: procedure Mixed_Solve
1015: ( file : in file_type;
1016: p : in Laur_Sys; lifted : in Array_of_Lists;
1017: h : in Eval_Coeff_Laur_Sys;
1018: c : in Standard_Complex_VecVecs.VecVec;
1019: e : in Exponent_Vectors_Array;
1020: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
1021: mix : in Vector; mic : in Mixed_Cell;
1022: sols,sols_last : in out Solution_List ) is
1023:
1024: q : Laur_Sys(p'range) := Select_Subsystem(p,mix,mic);
1025: sq : Laur_Sys(q'range);
1026: pq : Poly_Sys(q'range);
1027: qsols : Solution_List;
1028: len : natural := 0;
1029: fail : boolean;
1030:
1031: begin
1032: Reduce(q'last+1,q); sq := Shift(q);
1033: if mic.sub = null
1034: then Solve(sq,qsols,fail);
1035: else fail := true;
1036: end if;
1037: if not fail
1038: then put_line(file,"It is a fewnomial system.");
1039: else put_line(file,"No fewnomial system.");
1040: if mic.sub = null
1041: then put_line(file,"Calling the black box solver.");
1042: pq := Laurent_to_Polynomial_System(sq);
1043: qsols := Solve_by_Static_Lifting(file,pq);
1044: Clear(pq);
1045: else put_line(file,"Using the refinement of the cell.");
1046: -- Refined_Mixed_Solve(file,q,mix,mic,qsols);
1047: Refined_Mixed_Solve(file,q,mix,mic,h,c,e,j,m,qsols);
1048: end if;
1049: Set_Continuation_Parameter(qsols,Create(0.0));
1050: end if;
1051: len := Length_Of(qsols);
1052: put(file,len,1); put_line(file," solutions found.");
1053: if len > 0
1054: then Mixed_Continuation(file,mix,lifted,h,c,e,j,m,mic.nor.all,qsols);
1055: Concat(sols,sols_last,qsols);
1056: end if;
1057: Clear(sq); Clear(q); Shallow_Clear(qsols);
1058: end Mixed_Solve;
1059:
1060: -- THIRD LAYER :
1061:
1062: procedure Mixed_Solve
1063: ( p : in Laur_Sys;
1064: mix : in Vector; mixsub : in Mixed_Subdivision;
1065: sols : in out Solution_List ) is
1066:
1067: tmp : Mixed_Subdivision := mixsub;
1068: mic : Mixed_Cell;
1069: sols_last : Solution_List;
1070:
1071: begin
1072: while not Is_Null(tmp) loop
1073: mic := Head_Of(tmp);
1074: Mixed_Solve(p,mix,mic,sols,sols_last);
1075: tmp := Tail_Of(tmp);
1076: end loop;
1077: end Mixed_Solve;
1078:
1079: procedure Mixed_Solve
1080: ( file : in file_type; p : in Laur_Sys;
1081: mix : in Vector; mixsub : in Mixed_Subdivision;
1082: sols : in out Solution_List ) is
1083:
1084: tmp : Mixed_Subdivision := mixsub;
1085: mic : Mixed_Cell;
1086: sols_last : Solution_List;
1087: cnt : natural := 0;
1088:
1089: begin
1090: while not Is_Null(tmp) loop
1091: mic := Head_Of(tmp);
1092: cnt := cnt + 1;
1093: new_line(file);
1094: put(file,"*** PROCESSING SUBSYSTEM "); put(file,cnt,1);
1095: put_line(file," ***");
1096: new_line(file);
1097: Mixed_Solve(file,p,mix,mic,sols,sols_last);
1098: tmp := Tail_Of(tmp);
1099: end loop;
1100: end Mixed_Solve;
1101:
1102: procedure Mixed_Solve
1103: ( p : in Laur_Sys; lifted : in Array_of_Lists;
1104: h : in Eval_Coeff_Laur_Sys;
1105: c : in Standard_Complex_VecVecs.VecVec;
1106: e : in Exponent_Vectors_Array;
1107: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
1108: mix : in Vector; mixsub : in Mixed_Subdivision;
1109: sols : in out Solution_List ) is
1110:
1111: tmp : Mixed_Subdivision := mixsub;
1112: mic : Mixed_Cell;
1113: sols_last : Solution_List;
1114:
1115: begin
1116: while not Is_Null(tmp) loop
1117: mic := Head_Of(tmp);
1118: Mixed_Solve(p,lifted,h,c,e,j,m,mix,mic,sols,sols_last);
1119: tmp := Tail_Of(tmp);
1120: end loop;
1121: end Mixed_Solve;
1122:
1123: procedure Mixed_Solve
1124: ( file : in file_type;
1125: p : in Laur_Sys; lifted : in Array_of_Lists;
1126: h : in Eval_Coeff_Laur_Sys;
1127: c : in Standard_Complex_VecVecs.VecVec;
1128: e : in Exponent_Vectors_Array;
1129: j : in Eval_Coeff_Jaco_Mat; m : in Mult_Factors;
1130: mix : in Vector; mixsub : in Mixed_Subdivision;
1131: sols : in out Solution_List ) is
1132:
1133: tmp : Mixed_Subdivision := mixsub;
1134: mic : Mixed_Cell;
1135: sols_last : Solution_List;
1136: cnt : natural := 0;
1137:
1138: begin
1139: while not Is_Null(tmp) loop
1140: mic := Head_Of(tmp);
1141: cnt := cnt + 1;
1142: new_line(file);
1143: put(file,"*** PROCESSING SUBSYSTEM "); put(file,cnt,1);
1144: put_line(file," ***");
1145: new_line(file);
1146: Mixed_Solve(file,p,lifted,h,c,e,j,m,mix,mic,sols,sols_last);
1147: tmp := Tail_Of(tmp);
1148: end loop;
1149: end Mixed_Solve;
1150:
1151: end Integer_Polyhedral_Continuation;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>