with Integer_Vectors,Float_Vectors;     use Integer_Vectors;
with Lists_of_Integer_Vectors;          use Lists_of_Integer_Vectors;
with Arrays_of_Integer_Vector_Lists;    use Arrays_of_Integer_Vector_Lists;
with Integer_Faces_of_Polytope;         use Integer_Faces_of_Polytope;
with Integer_Mixed_Subdivisions;        use Integer_Mixed_Subdivisions;

package Integer_Pruning_Methods is

-- DESCRIPTION :
--   This package contains the creators of a regular mixed subdivision,
--   based on the static lifting algorithm, for computing only those cells
--   of a certain type, in particular the mixed cells.
--   There are facilities for computing only the generating cells and for
--   computing only the stable mixed cells.

  generic

    with procedure Process ( mic : in Mixed_Cell; continue : out boolean );

    -- DESCRIPTION :
    --   This procedure will be invoked after each computation of a new cell.
    --   If the parameter continue is set on false, then the computation will
    --   be stopped, otherwise the creation continues.

  procedure Gen1_Create_CS 
               ( n : in natural; mix : in Vector; fa : in Array_of_Faces;
                 lifted : in Array_of_Lists;
                 nbsucc,nbfail : in out Float_Vectors.Vector;
                 mixsub : out Mixed_Subdivision );

  procedure Create_CS 
               ( n : in natural; mix : in Vector; fa : in Array_of_Faces;
                 lifted : in Array_of_Lists;
                 nbsucc,nbfail : in out Float_Vectors.Vector;
                 mixsub : out Mixed_Subdivision );

  -- DESCRIPTION :
  --   Creates a mixed subdivision with a criterium to check which
  --   face-face combinations can lead to a cell which contributes to
  --   the mixed volume.

  -- ON ENTRY :
  --   n         dimension before lifting;
  --   mix       type of mixture: indicates how many times each polytope
  --             occurs in the supports;
  --   fa        faces of the lower hull of the lifted point sets:
  --              fa(i) contains the mix(i)-faces of conv(lifted(i));
  --   lifted    the lifted points;

  -- ON RETURN :
  --   nbsucc    number of times a face-face combination has passed the test,
  --             at each level;
  --   nbfail    number of times a face-face combinations has failed to pass
  --             the test, at each level;
  --   mixsub    collection of cells which contribute to the mixed volume.

  procedure New_Create_CS
               ( n : in natural; mix : in Vector; fa : in Array_of_Faces;
                 lifted : in Array_of_Lists;
                 nbsucc,nbfail : in out Float_Vectors.Vector;
                 mixsub : out Mixed_Subdivision );

  -- DESCRIPTION :
  --   Does the same at the Create_CS, only with a new pruning method.

  procedure Create_CCS
               ( n : in natural; mix : in Vector; fa : in Array_of_Faces;
                 lifted : in Array_of_Lists;
                 nbsucc,nbfail : in out Float_Vectors.Vector;
                 normals,suppvals : in out List;
                 mixsub : out Mixed_Subdivision );

  -- DESCRIPTION :
  --   Construction of the mixed subdivision by constraint complementary
  --   slackness: faces supported by the list of normals pass freely.
  --   This list of normals is updated each time new mixed cells are found.
  --   Following are the descriptions of the new parameters.

  -- ON ENTRY :
  --   normals   list of inner normals on the lower hull of the lifted points;
  --   suppvals  corresponding vectors which contain the supporting values
  --             for each component.

  -- ON RETURN :
  --   normals   contains the inner normals of the mixed cells;
  --   suppvals  corresponding vectors of support values.

end Integer_Pruning_Methods;
