#  Copyright (c) 1997-2006
#  Ewgenij Gawrilow, Michael Joswig (Technische Universitaet Berlin, Germany)
#  http://www.math.tu-berlin.de/polymake,  mailto:polymake@math.tu-berlin.de
#
#  This program is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by the
#  Free Software Foundation; either version 2, or (at your option) any
#  later version: http://www.gnu.org/licenses/gpl.txt.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#-----------------------------------------------------------------------------
#  $Project: polymake $$Id: rational.rules 7576 2007-01-20 11:11:07Z joswig $


# A pointed polyhedron realized in `Q^d`.
object RationalPolytope : Polytope


# Category: Convex hull computation
# Use the <em>double description</em> method as implemented in @see external.cddlib.
# It is the default algorithm for computation of facets from points or dually.
# It operates with arbitrary precision arithmetic (@see external.GMP).
label cdd

# Category: Convex hull computation
# Use the <em>reverse search</em> method, as implemented in @see external.lrslib.
label lrs

# Category: Convex hull computation
# Use the sequential (beneath-beyond) convex hull algorithm. It performs well at lower dimensions
# and produces a triangulation of the polytope as a byproduct. There is no dual (vertex enumeration)
# implementation of this algorithm.
label beneath_beyond


cdd.convex_hull.primal: FACETS, AFFINE_HULL : VERTICES | POINTS
WEIGHT 4.10
   client("cdd_ch_client", $this, "-primal");

cdd.convex_hull.dual: VERTICES, POINTED, FEASIBLE : FACETS | INEQUALITIES
WEIGHT 4.10
   client("cdd_ch_client", $this, "-dual");

cdd.convex_hull.redund: VERTICES, VERTEX_NORMALS : POINTS
WEIGHT 3.20
   client("cdd_redund_client", $this);

cdd.convex_hull.redund: VERTEX_NORMALS : VERTICES
WEIGHT 3.10
   client("cdd_redund_client", $this, "-fromvertices");


lrs.convex_hull.primal: FACETS, AFFINE_HULL : VERTICES | POINTS
WEIGHT 4.10
   client("lrs_ch_client", $this, "-primal");

lrs.convex_hull.dual: VERTICES, POINTED, FEASIBLE : FACETS | INEQUALITIES
WEIGHT 4.10
   client("lrs_ch_client", $this, "-dual");

lrs.valid_point: VALID_POINT, FEASIBLE : FACETS | INEQUALITIES
WEIGHT 3.10
   client("lrs_lp_client", $this, "-valid");

lrs.convex_hull.redund: VERTICES, AFFINE_HULL : POINTS
WEIGHT 3.20
   client("lrs_redund_client", $this);


lrs.convex_hull.count: N_FACETS : VERTICES | POINTS
WEIGHT 4.5
PRECONDITION: BOUNDED
   $this->BOUNDED
BODY:
   client("lrs_ch_client", $this, "-primal", "-count");

lrs.convex_hull.count: N_VERTICES, N_BOUNDED_VERTICES, POINTED, FEASIBLE : FACETS | INEQUALITIES
WEIGHT 4.5
   client("lrs_ch_client", $this, "-dual", "-count");

lrs.convex_hull.count: N_BOUNDED_VERTICES, POINTED, FEASIBLE : FACETS | INEQUALITIES
WEIGHT 4.3
   client("lrs_ch_client", $this, "-dual", "-count", "-only-bounded");


GRAPH : VERTICES
WEIGHT 3.30
PRECONDITION: BOUNDED
   $this->BOUNDED
BODY:
   client("graph_from_vertices", $this);


beneath_beyond.convex_hull.primal, default.triangulation: \
FACETS, VERTICES, AFFINE_HULL, VERTICES_IN_FACETS, DUAL_GRAPH, TRIANGULATION_INT : POINTS
WEIGHT 4.10
   client("beneath_beyond", $this, "POINTS");

beneath_beyond.convex_hull.primal, default.triangulation: \
FACETS, AFFINE_HULL, VERTICES_IN_FACETS, DUAL_GRAPH, TRIANGULATION, ESSENTIALLY_GENERIC : VERTICES
WEIGHT 4.10
   client("beneath_beyond", $this, "VERTICES");


CENTROID, VOLUME : VERTICES, TRIANGULATION
WEIGHT 2.30
PRECONDITION: BOUNDED
   $this->BOUNDED
BODY:
   client("centroid", $this, "VERTICES", "TRIANGULATION");

default.volume: VOLUME : VERTICES, TRIANGULATION
WEIGHT 2.20
PRECONDITION: BOUNDED
   $this->BOUNDED
BODY:
   client("pvolume", $this, "VERTICES", "TRIANGULATION");

default.volume: VOLUME : POINTS, TRIANGULATION_INT
WEIGHT 2.30
PRECONDITION: BOUNDED
   $this->BOUNDED
BODY:
   client("pvolume", $this, "POINTS", "TRIANGULATION_INT");


prefer *.convex_hull cdd, lrs, beneath_beyond


# Special computation of VERTICES for zonotopes:
# In each iteration, add one zone and eliminate the interior points via solving LP
# This way we avoid the explicit creation of 2^#{ZONOTOPE_INPUT_VECTORS} points at once.
VERTICES : ZONOTOPE_INPUT_VECTORS
WEIGHT 3.50
   my $P;
   foreach my $vec (@{$this->ZONOTOPE_INPUT_VECTORS}) {
      my $Z=new Apps::polytope::RationalPolytope(VERTICES => [ $vec, negative_homogeneous($vec) ]);
      if (defined($P)) {
	 my $Pprime=new Apps::polytope::RationalPolytope;
	 client("minkowski_sum", $Pprime, $P, $Z);
	 $P=$Pprime;
	 my $nv=@{$P->VERTICES};	# enforce computation of VERTICES
	 $P->remove("POINTS");		# save memory
      } else {
	 $P=$Z;
      }
   }
   $this->VERTICES=$P->VERTICES;


# intrinsic rules
INCLUDE
   lp_rational.rules

# self-configuring rules interfacing external software
INCLUDE
   porta.rules
   bastat.rules


# Local Variables:
# c-basic-offset:3
# mode: perl
# End:
