Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Dynlift/black_mixed_volume_computations.adb, Revision 1.1.1.1
1.1 maekawa 1: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
2: with Standard_Complex_Vectors;
3: with Standard_Complex_VecVecs;
4: with Standard_Complex_Poly_Randomizers; use Standard_Complex_Poly_Randomizers;
5: with Standard_Complex_Laur_Polys; use Standard_Complex_Laur_Polys;
6: with Standard_Complex_Laur_Functions; use Standard_Complex_Laur_Functions;
7: with Standard_Complex_Laur_Systems; use Standard_Complex_Laur_Systems;
8: with Standard_Complex_Laur_SysFun; use Standard_Complex_Laur_SysFun;
9: with Standard_Complex_Laur_Jacomats; use Standard_Complex_Laur_Jacomats;
10: with Standard_Poly_Laur_Convertors; use Standard_Poly_Laur_Convertors;
11: with Standard_Laur_Poly_Convertors; use Standard_Laur_Poly_Convertors;
12: with Lists_of_Integer_Vectors; use Lists_of_Integer_Vectors;
13: with Power_Lists,Vertices; use Power_Lists,Vertices;
14: with Integer_Lifting_Utilities; use Integer_Lifting_Utilities;
15: with Cayley_Trick; use Cayley_Trick;
16: with Triangulations; use Triangulations;
17: with Dynamic_Triangulations; use Dynamic_Triangulations;
18: with Triangulations_and_Subdivisions; use Triangulations_and_Subdivisions;
19: with Flatten_Mixed_Subdivisions; use Flatten_Mixed_Subdivisions;
20: with Mixed_Volume_Computation; use Mixed_Volume_Computation;
21: with Exponent_Vectors; use Exponent_Vectors;
22: with Continuation_Parameters;
23: with Integer_Polyhedral_Continuation; use Integer_Polyhedral_Continuation;
24:
25: package body Black_Mixed_Volume_Computations is
26:
27: procedure Black_Box_Mixed_Volume_Computation
28: ( p : in out Poly_Sys; mix : out Link_to_Vector;
29: lifsup : out Link_to_Array_of_Lists;
30: mixsub : out Mixed_Subdivision; mv : out natural ) is
31:
32: n : constant natural := p'length;
33: supports : Array_of_Lists(p'range) := Create(p);
34: verpts : Array_of_Lists(p'range);
35: tmix,perms : Standard_Integer_Vectors.Link_to_Vector;
36: tmixsub : Mixed_Subdivision;
37:
38: procedure Collect_Flattening ( t : in Triangulation; l : List ) is
39:
40: -- DESCRIPTION :
41: -- Updates the subdivision tmixsub with the flattened cells.
42: -- The triangulation on entry contains the whole triangulation,
43: -- not just the new cells.
44:
45: cells : Mixed_Subdivision;
46:
47: begin
48: if Is_Null(tmixsub)
49: then cells := Deep_Create(n,t);
50: else cells := Non_Flat_Deep_Create(n,t);
51: Construct(Head_Of(tmixsub),cells);
52: end if;
53: Flatten(cells);
54: tmixsub := cells;
55: end Collect_Flattening;
56: procedure C_Dynamic_Lifting is
57: new Dynamic_Triangulations.Dynamic_Lifting_with_Flat(Collect_Flattening);
58:
59: begin
60: for i in supports'range loop
61: verpts(i) := Vertex_Points(supports(i));
62: end loop;
63: Compute_Mixture(verpts,tmix,perms);
64: p := Permute(p,perms);
65: declare
66: pts,lifted : Array_of_Lists(tmix'range);
67: last : List;
68: t : Triangulation;
69: nt : natural;
70: lastcells : Mixed_Subdivision;
71: begin
72: if tmix'length = 1
73: then C_Dynamic_Lifting(verpts(1),false,false,0,lifted(1),last,t);
74: if Is_Null(tmixsub)
75: then tmixsub := Deep_Create(n,t);
76: else lastcells := Non_Flat_Deep_Create(n,t);
77: Construct(Head_Of(tmixsub),lastcells);
78: tmixsub := lastcells;
79: end if;
80: Clear(t);
81: Mixed_Volume(n,tmix.all,tmixsub,mv);
82: elsif tmix'length <= n/2
83: then
84: pts := Typed_Lists(tmix.all,verpts);
85: Dynamic_Cayley(n,tmix.all,pts,false,false,0,lifted,tmixsub,nt);
86: Mixed_Volume(n,tmix.all,tmixsub,mv);
87: else
88: Mixed_Volume(n,tmix.all,verpts,lifted,tmixsub,mv);
89: end if;
90: lifsup := new Array_of_Lists'(lifted);
91: end;
92: mix := tmix; mixsub := tmixsub;
93: end Black_Box_Mixed_Volume_Computation;
94:
95: procedure Black_Box_Polyhedral_Continuation
96: ( p : in Poly_Sys; mix : in Vector;
97: lifsup : in Array_of_Lists; mixsub : in Mixed_Subdivision;
98: q : in out Poly_Sys; qsols : in out Solution_List ) is
99:
100: n : constant natural := p'length;
101: lq,llq : Laur_Sys(p'range);
102: h : Eval_Coeff_Laur_Sys(q'range);
103: c : Standard_Complex_VecVecs.VecVec(h'range);
104: e : Exponent_Vectors_Array(h'range);
105: j : Eval_Coeff_Jaco_Mat(h'range,h'first..h'last+1);
106: m : Mult_Factors(j'range(1),j'range(2));
107:
108: begin
109: q := Complex_Randomize1(p);
110: lq := Polynomial_to_Laurent_System(q);
111: llq := Perform_Lifting(n,mix,lifsup,lq);
112: Clear(lq); Clear(q);
113: lq := Eval(llq,Create(1.0),n+1);
114: q := Laurent_to_Polynomial_System(lq);
115: Continuation_Parameters.Tune(0);
116: -- Mixed_Solve(llq,mix,mixsub,qsols); too expensive !!!!
117: h := Create(lq);
118: for i in c'range loop
119: declare
120: coeff_lq : constant Standard_Complex_Vectors.Vector := Coeff(lq(i));
121: begin
122: c(i) := new Standard_Complex_Vectors.Vector(coeff_lq'range);
123: for k in coeff_lq'range loop
124: c(i)(k) := coeff_lq(k);
125: end loop;
126: end;
127: end loop;
128: e := Create(lq);
129: Create(lq,j,m);
130: Mixed_Solve(llq,lifsup,h,c,e,j,m,mix,mixsub,qsols);
131: Set_Continuation_Parameter(qsols,Create(0.0));
132: Clear(lq); Clear(llq);
133: Clear(h); Clear(j); Clear(m);
134: Standard_Complex_VecVecs.Clear(c);
135: end Black_Box_Polyhedral_Continuation;
136:
137: end Black_Mixed_Volume_Computations;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>