File: [local] / OpenXM_contrib / PHC / Ada / Root_Counts / Dynlift / minkowski_polynomials.adb (download)
Revision 1.1.1.1 (vendor branch), Sun Oct 29 17:45:28 2000 UTC (23 years, 8 months ago) by maekawa
Branch: PHC, MAIN
CVS Tags: v2, maekawa-ipv6, RELEASE_1_2_3, RELEASE_1_2_2_KNOPPIX_b, RELEASE_1_2_2_KNOPPIX, RELEASE_1_2_2, RELEASE_1_2_1, HEAD Changes since 1.1: +0 -0
lines
Import the second public release of PHCpack.
OKed by Jan Verschelde.
|
with Standard_Floating_Numbers; use Standard_Floating_Numbers;
with Standard_Complex_Numbers; use Standard_Complex_Numbers;
with Standard_Natural_Vectors;
with Cayley_Embedding; use Cayley_Embedding;
with Mixed_Volume_Computation; use Mixed_Volume_Computation;
package body Minkowski_Polynomials is
function Minkowski_Polynomial ( n,r : natural ) return Poly is
res : Poly := Null_Poly;
acc : Degrees := new Standard_Natural_Vectors.Vector'(1..r => 0);
procedure Generate_Monomials
( k,sum : in natural; deg : in out Degrees ) is
-- DESCRIPTION :
-- Generates all exponent vectors whose sum equals n.
t : Term;
begin
if k = r
then t.cf := Create(1.0);
deg(r) := n-sum;
t.dg := deg;
Add(res,t);
else for i in 0..(n-sum) loop
deg(k) := i;
Generate_Monomials(k+1,sum+i,deg);
end loop;
end if;
end Generate_Monomials;
begin
Generate_Monomials(1,0,acc);
Standard_Natural_Vectors.Clear
(Standard_Natural_Vectors.Link_to_Vector(acc));
return res;
end Minkowski_Polynomial;
function Convert ( dg : Degrees ) return Standard_Integer_Vectors.Vector is
-- DESCRIPTION :
-- Converts the degrees vector to a vector with integer numbers.
res : Standard_Integer_Vectors.Vector(dg'range);
begin
for i in res'range loop
res(i) := dg(i);
end loop;
return res;
end Convert;
procedure Minkowski_Polynomial
( p : in out Poly; t : in Triangulation; n : in natural;
mix : in Vector; mixsub : out Mixed_Subdivision ) is
procedure Coefficient_Volume
( submix : in Vector; sub : in Mixed_Subdivision;
vol : out natural ) is
begin
vol := Mixed_Volume(n,submix,sub);
end Coefficient_Volume;
procedure Coefficient_Volumes is
new Minkowski_Polynomial_Subdivisions(Coefficient_Volume);
begin
Coefficient_Volumes(p,t,n,mix,mixsub);
end Minkowski_Polynomial;
procedure Minkowski_Polynomial_Subdivisions
( p : in out Poly; t : in Triangulation; n : in natural;
mix : in Vector; mixsub : out Mixed_Subdivision ) is
procedure Coefficient_Volume ( tt : in out Term; cont : out boolean ) is
wrkmix : Vector(mix'range) := Convert(tt.dg);
wrksub : Mixed_Subdivision := Extract_Mixed_Cells(n,wrkmix,t);
vol : natural;
begin
Deflate(n,wrksub);
Process(wrkmix,wrksub,vol);
tt.cf := Create(double_float(vol));
if wrkmix = mix
then mixsub := wrksub;
else Deep_Clear(wrksub);
end if;
cont := true;
end Coefficient_Volume;
procedure Coefficient_Volumes is new Changing_Iterator(Coefficient_Volume);
begin
Coefficient_Volumes(p);
end Minkowski_Polynomial_Subdivisions;
end Minkowski_Polynomials;