with text_io;                        use text_io;
with Complex_Polynomial_Systems;     use Complex_Polynomial_Systems;
with Solutions;                      use Solutions;
with Trees_of_Vectors;               use Trees_of_Vectors;

package Set_Structures_and_Volumes is

-- DESCRIPTION :
--   This package contains routines for implementing the
--   hybrid approach of working with set structures and
--   computing mixed volumes.

  procedure Build_RPS ( k,n : in natural; p : in Poly_Sys );

  -- DESCRIPTION :
  --   If the set structure is empty, then a set structure will
  --   be constructed for the first k polynomials of p.
  --   This allows the construction of random product polynomials.

  -- ON ENTRY :
  --   k        number of polynomials for which a random product structure
  --            needs to be constructed, 0 < k <= n;
  --   n        total number of polynomials in the system;
  --   p        polynomial system.

  -- ON RETURN :
  --   The result of this operation can be found in
  --   the data of the package Random_Product_System. 

  function Bezout_BKK ( k,n : natural; p : Poly_Sys ) return natural;

  function Bezout_BKK ( k,n : natural; p : Poly_Sys; tv : Tree_of_Vectors )
		      return natural;

  procedure Bezout_BKK ( k,n : in natural; p : in Poly_Sys;
			 tv : in out Tree_of_Vectors; bb : out natural );

  -- DESCRIPTION :
  --   If the set structure is empty, then a set structure will be
  --   constructed for the first k equations.
  --   This set structure will be used to eliminate k unknowns,
  --   for the last equations of p, the BKK bound will be computed.

  -- ON ENTRY :
  --   k        number of polynomials for which a random product
  --            structure needs to be constructed, 0 <= k <= n;

  -- ON RETURN :
  --   tv       tree of useful directions used to compute mixed volume,
  --            once tv has been constructed, the mixed volume
  --            can be computed more efficiently;
  --   bb       if k = 0, then the BKK bound is returned,
  --            if 0 < k < n, then for the first k polynomials a product
  --            structure has been used to eliminate k unknowns,
  --            if k = n, then the Bezout number based on the set structure
  --            will be returned;
 
  procedure Mixed_Solve 
               ( file : in file_type; k,n : in natural; p : in Poly_Sys;
                 bb : out natural;
                 g : in out Poly_Sys; sols : in out Solution_List );

  procedure Mixed_Solve
               ( file : in file_type; k,n : in natural; p : in Poly_Sys;
                 tv : in Tree_of_Vectors;
                 bb : out natural; g : in out Poly_Sys;
                 sols : in out Solution_List );

  -- DESCRIPTION :
  --   Constructs a random product coefficient start system for p.

  -- ON ENTRY :
  --   file      needed to write intermediate results on;
  --   k         a number between 0 and n;
  --   n         the number of variables and equations;
  --   p         a polynomial system;
  --   tv        the tree of useful directions.

  -- ON RETURN :
  --   g         a random product coefficient start system;
  --             if k = 0, then a random coefficient start system,
  --             if k = n, then a random product start system;
  --   bb        the Bezout BKK bound for the system p;
  --             if k = 0, then bb = BKK bound,
  --             if k = n, then bb = Bezout number based on set structure;
  --   sols      the solutions of g.

end Set_Structures_and_Volumes;
