Polyhedron and polymake's Polytope

Many polyhedral computations are done through polymake. polymake (Ewgenij Gawrilow, Michael Joswig (2000), polymake.org) is open source software for research in polyhedral geometry and is attached to Julia via Polymake.jl (Marek Kaluba, Benjamin Lorenz, Sascha Timme (2020), Polymake.jl). This is visible in the structure Polyhedron via a pointer pm_polytope to the corresponding polymake object. Using Polymake.jl one can apply all functionality of polymake to the polymake object hidden behind this pointer.

Sometimes it can be necessary to directly invoke some polymake functions on an OSCAR Polyhedron object (e.g. because some functionality has not yet been made available via OSCAR's interface). In that case, the following two functions allow extracting the underlying Polymake.jl object from a Polyhedron, respectively wrapping a Polymake.jl object representing a polyhedron into a high-level Polyhedron object.

Polyhedron{T}(P::Polymake.BigObject) where T<:scalar_types

Construct a Polyhedron corresponding to a Polymake.BigObject of type Polytope. The type parameter T is optional but recommended for type stability.


The following shows all the data currently known for a Polyhedron.

julia> C = cube(3)
Polyhedron in ambient dimension 3

julia> C.pm_polytope
type: Polytope<Rational>
description: cube of dimension 3





  1   1   0   0
  1  -1   0   0
  1   0   1   0
  1   0  -1   0
  1   0   0   1
  1   0   0  -1

	{0 2 4 6}
	{1 3 5 7}
	{0 1 4 5}
	{2 3 6 7}
	{0 1 2 3}
	{4 5 6 7}

polymake allows for an interactive visualization of 3-dimensional polytopes in the browser: Polymake.visual(C.pm_polytope).


There are several design differences between polymake and OSCAR. Polyhedra in polymake and Polymake.jl use homogeneous coordinates. The polyhedra in OSCAR use affine coordinates. Indices in polymake are zero-based, whereas in OSCAR they are one-based.

The next example shows a purely combinatorial construction of a polytope (here: a square). In spite of being given no coordinates, polymake can check for us that this is a simple polytope; i.e., each vertex is contained in dimension many facets.

julia> Q = Polymake.polytope.Polytope(VERTICES_IN_FACETS=[[0,2],[1,3],[0,1],[2,3]]);

julia> Q.SIMPLE

However, without coordinates, some operations such as computing the volume cannot work:

julia> Q.VOLUME
polymake:  WARNING: available properties insufficient to compute 'VOLUME'