[BACK]Return to minkowski_polynomials.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Root_Counts / Dynlift

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, 7 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;