Polyhedron and polytope manipulation in Python

## Project description

This library implements common operations over convex polyhedra such as polytope projection, double description (conversion between halfspace and vertex representations), computing the Chebyshev center, etc.

See the complete API documentation for details.

## Examples

### Vertex enumeration

We can compute the list of vertices of a polytope described in halfspace representation by A * x <= b:

import numpy
import pypoman

A = numpy.array([
[-1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
[0, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
[0,  0, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0],
[0,  0,  0, -1,  0,  0,  0,  0,  0,  0,  0,  0],
[0,  0,  0,  0, -1,  0,  0,  0,  0,  0,  0,  0],
[0,  0,  0,  0,  0, -1,  0,  0,  0,  0,  0,  0],
[0,  0,  0,  0,  0,  0, -1,  0,  0,  0,  0,  0],
[0,  0,  0,  0,  0,  0,  0, -1,  0,  0,  0,  0],
[0,  0,  0,  0,  0,  0,  0,  0, -1,  0,  0,  0],
[0,  0,  0,  0,  0,  0,  0,  0,  0, -1,  0,  0],
[0,  0,  0,  0,  0,  0,  0,  0,  0,  0, -1,  0],
[0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, -1],
[1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0],
[0,  0,  0,  1,  1,  1,  0,  0,  0,  0,  0,  0],
[0,  0,  0,  0,  0,  0,  1,  1,  1,  0,  0,  0],
[0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1],
[1,  0,  0,  1,  0,  0,  1,  0,  0,  1,  0,  0],
[0,  1,  0,  0,  1,  0,  0,  1,  0,  0,  1,  0],
[0,  0,  1,  0,  0,  1,  0,  0,  1,  0,  0,  1]])
b = numpy.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 2, 1, 2, 3])
vertices = pypoman.compute_polytope_vertices(A, b)

### Polytope projection

Let us project an n-dimensional polytope over x = [x_1 ... x_n] onto its first two coordinates proj(x) = [x_1 x_2]:

import pypoman
from numpy import array, eye, ones, vstack, zeros

n = 10  # dimension of the original polytope
p = 2   # dimension of the projected polytope

# Original polytope:
# - inequality constraints: \forall i, |x_i| <= 1
# - equality constraint: sum_i x_i = 0
A = vstack([+eye(n), -eye(n)])
b = ones(2 * n)
C = ones(n).reshape((1, n))
d = array([0])
ineq = (A, b)  # A * x <= b
eq = (C, d)    # C * x == d

# Projection is proj(x) = [x_0 x_1]
E = zeros((p, n))
E[0, 0] = 1.
E[1, 1] = 1.
f = zeros(p)
proj = (E, f)  # proj(x) = E * x + f

vertices = pypoman.project_polytope(proj, ineq, eq, method='bretl')

if __name__ == "__main__":   # plot projected polytope
import pylab
pylab.ion()
pylab.figure()
pypoman.plot_polygon(vertices)

## Project details

Uploaded source