Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Dynlift/black_mixed_volume_computations.adb, Revision 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>