H(yperplane) and V(ertex) representation objects for polyhedra¶
-
class
sage.geometry.polyhedron.representation.Equation(polyhedron_parent)¶ Bases:
sage.geometry.polyhedron.representation.HrepresentationA linear equation of the polyhedron. That is, the polyhedron is strictly smaller-dimensional than the ambient space, and contained in this hyperplane. Inherits from
Hrepresentation.-
contains(Vobj)¶ Tests whether the hyperplane defined by the equation contains the given vertex/ray/line.
EXAMPLES:
sage: p = Polyhedron(vertices = [[0,0,0],[1,1,0],[1,2,0]]) sage: v = next(p.vertex_generator()) sage: v A vertex at (0, 0, 0) sage: a = next(p.equation_generator()) sage: a An equation (0, 0, 1) x + 0 == 0 sage: a.contains(v) True
-
interior_contains(Vobj)¶ Tests whether the interior of the halfspace (excluding its boundary) defined by the inequality contains the given vertex/ray/line.
NOTE:
Returns False for any equation.
EXAMPLES:
sage: p = Polyhedron(vertices = [[0,0,0],[1,1,0],[1,2,0]]) sage: v = next(p.vertex_generator()) sage: v A vertex at (0, 0, 0) sage: a = next(p.equation_generator()) sage: a An equation (0, 0, 1) x + 0 == 0 sage: a.interior_contains(v) False
-
is_equation()¶ Tests if this object is an equation. By construction, it must be.
-
type()¶ Returns the type (equation/inequality/vertex/ray/line) as an integer.
OUTPUT:
Integer. One of
PolyhedronRepresentation.INEQUALITY,.EQUATION,.VERTEX,.RAY, or.LINE.EXAMPLES:
sage: p = Polyhedron(vertices = [[0,0,0],[1,1,0],[1,2,0]]) sage: repr_obj = next(p.equation_generator()) sage: repr_obj.type() 1 sage: repr_obj.type() == repr_obj.INEQUALITY False sage: repr_obj.type() == repr_obj.EQUATION True sage: repr_obj.type() == repr_obj.VERTEX False sage: repr_obj.type() == repr_obj.RAY False sage: repr_obj.type() == repr_obj.LINE False
-
-
class
sage.geometry.polyhedron.representation.Hrepresentation(polyhedron_parent)¶ Bases:
sage.geometry.polyhedron.representation.PolyhedronRepresentationThe internal base class for H-representation objects of a polyhedron. Inherits from
PolyhedronRepresentation.-
A()¶ Returns the coefficient vector \(A\) in \(A\vec{x}+b\).
EXAMPLES:
sage: p = Polyhedron(ieqs = [[0,1,0],[0,0,1],[1,-1,0,],[1,0,-1]]) sage: pH = p.Hrepresentation(2) sage: pH.A() (1, 0)
-
adjacent()¶ Alias for neighbors().
-
b()¶ Returns the constant \(b\) in \(A\vec{x}+b\).
EXAMPLES:
sage: p = Polyhedron(ieqs = [[0,1,0],[0,0,1],[1,-1,0,],[1,0,-1]]) sage: pH = p.Hrepresentation(2) sage: pH.b() 0
-
eval(Vobj)¶ Evaluates the left hand side \(A\vec{x}+b\) on the given vertex/ray/line.
NOTES:
- Evaluating on a vertex returns \(A\vec{x}+b\)
- Evaluating on a ray returns \(A\vec{r}\). Only the sign or whether it is zero is meaningful.
- Evaluating on a line returns \(A\vec{l}\). Only whether it is zero or not is meaningful.
EXAMPLES:
sage: triangle = Polyhedron(vertices=[[1,0],[0,1],[-1,-1]]) sage: ineq = next(triangle.inequality_generator()) sage: ineq An inequality (2, -1) x + 1 >= 0 sage: [ ineq.eval(v) for v in triangle.vertex_generator() ] [0, 0, 3] sage: [ ineq * v for v in triangle.vertex_generator() ] [0, 0, 3]
If you pass a vector, it is assumed to be the coordinate vector of a point:
sage: ineq.eval( vector(ZZ, [3,2]) ) 5
-
incident()¶ Returns a generator for the incident H-representation objects, that is, the vertices/rays/lines satisfying the (in)equality.
EXAMPLES:
sage: triangle = Polyhedron(vertices=[[1,0],[0,1],[-1,-1]]) sage: ineq = next(triangle.inequality_generator()) sage: ineq An inequality (2, -1) x + 1 >= 0 sage: [ v for v in ineq.incident()] [A vertex at (-1, -1), A vertex at (0, 1)] sage: p = Polyhedron(vertices=[[0,0,0],[0,1,0],[0,0,1]], rays=[[1,-1,-1]]) sage: ineq = p.Hrepresentation(2) sage: ineq An inequality (1, 0, 1) x + 0 >= 0 sage: [ x for x in ineq.incident() ] [A vertex at (0, 0, 0), A vertex at (0, 1, 0), A ray in the direction (1, -1, -1)]
-
is_H()¶ Returns True if the object is part of a H-representation (inequality or equation).
EXAMPLES:
sage: p = Polyhedron(ieqs = [[0,1,0],[0,0,1],[1,-1,0,],[1,0,-1]]) sage: pH = p.Hrepresentation(0) sage: pH.is_H() True
-
is_equation()¶ Returns True if the object is an equation of the H-representation.
EXAMPLES:
sage: p = Polyhedron(ieqs = [[0,1,0],[0,0,1],[1,-1,0,],[1,0,-1]], eqns = [[1,1,-1]]) sage: pH = p.Hrepresentation(0) sage: pH.is_equation() True
-
is_incident(Vobj)¶ Returns whether the incidence matrix element (Vobj,self) == 1
EXAMPLES:
sage: p = Polyhedron(ieqs = [[0,0,0,1],[0,0,1,0,],[0,1,0,0], ....: [1,-1,0,0],[1,0,-1,0,],[1,0,0,-1]]) sage: pH = p.Hrepresentation(0) sage: pH.is_incident(p.Vrepresentation(1)) True sage: pH.is_incident(p.Vrepresentation(5)) False
-
is_inequality()¶ Returns True if the object is an inequality of the H-representation.
EXAMPLES:
sage: p = Polyhedron(ieqs = [[0,1,0],[0,0,1],[1,-1,0,],[1,0,-1]]) sage: pH = p.Hrepresentation(0) sage: pH.is_inequality() True
-
neighbors()¶ Iterate over the adjacent facets (i.e. inequalities/equations)
EXAMPLES:
sage: p = Polyhedron(ieqs = [[0,0,0,1],[0,0,1,0,],[0,1,0,0], ....: [1,-1,0,0],[1,0,-1,0,],[1,0,0,-1]]) sage: pH = p.Hrepresentation(0) sage: a = list(pH.neighbors()) sage: a[0] An inequality (0, -1, 0) x + 1 >= 0 sage: list(a[0]) [1, 0, -1, 0]
-
repr_pretty(**kwds)¶ Return a pretty representation of this equality/inequality.
INPUT:
prefix– a stringindices– a tuple or other iterablelatex– a boolean
OUTPUT:
A string
EXAMPLES:
sage: P = Polyhedron(ieqs=[(0, 1, 0, 0), (1, 2, 1, 0)], ....: eqns=[(1, -1, -1, 1)]) sage: for h in P.Hrepresentation(): ....: print(h.repr_pretty()) x0 + x1 - x2 == 1 x0 >= 0 2*x0 + x1 >= -1
-
-
class
sage.geometry.polyhedron.representation.Inequality(polyhedron_parent)¶ Bases:
sage.geometry.polyhedron.representation.HrepresentationA linear inequality (supporting hyperplane) of the polyhedron. Inherits from
Hrepresentation.-
contains(Vobj)¶ Tests whether the halfspace (including its boundary) defined by the inequality contains the given vertex/ray/line.
EXAMPLES:
sage: p = polytopes.cross_polytope(3) sage: i1 = next(p.inequality_generator()) sage: [i1.contains(q) for q in p.vertex_generator()] [True, True, True, True, True, True] sage: p2 = 3*polytopes.hypercube(3) sage: [i1.contains(q) for q in p2.vertex_generator()] [True, False, False, False, True, True, True, False]
-
interior_contains(Vobj)¶ Tests whether the interior of the halfspace (excluding its boundary) defined by the inequality contains the given vertex/ray/line.
EXAMPLES:
sage: p = polytopes.cross_polytope(3) sage: i1 = next(p.inequality_generator()) sage: [i1.interior_contains(q) for q in p.vertex_generator()] [False, True, True, False, False, True] sage: p2 = 3*polytopes.hypercube(3) sage: [i1.interior_contains(q) for q in p2.vertex_generator()] [True, False, False, False, True, True, True, False]
If you pass a vector, it is assumed to be the coordinate vector of a point:
sage: P = Polyhedron(vertices=[[1,1],[1,-1],[-1,1],[-1,-1]]) sage: p = vector(ZZ, [1,0] ) sage: [ ieq.interior_contains(p) for ieq in P.inequality_generator() ] [True, True, False, True]
-
is_inequality()¶ Returns True since this is, by construction, an inequality.
EXAMPLES:
sage: p = Polyhedron(vertices = [[0,0,0],[1,1,0],[1,2,0]]) sage: a = next(p.inequality_generator()) sage: a.is_inequality() True
-
outer_normal()¶ Return the outer normal vector of
self.OUTPUT:
The normal vector directed away from the interior of the polyhedron.
EXAMPLES:
sage: p = Polyhedron(vertices = [[0,0,0],[1,1,0],[1,2,0]]) sage: a = next(p.inequality_generator()) sage: a.outer_normal() (1, -1, 0)
-
type()¶ Returns the type (equation/inequality/vertex/ray/line) as an integer.
OUTPUT:
Integer. One of
PolyhedronRepresentation.INEQUALITY,.EQUATION,.VERTEX,.RAY, or.LINE.EXAMPLES:
sage: p = Polyhedron(vertices = [[0,0,0],[1,1,0],[1,2,0]]) sage: repr_obj = next(p.inequality_generator()) sage: repr_obj.type() 0 sage: repr_obj.type() == repr_obj.INEQUALITY True sage: repr_obj.type() == repr_obj.EQUATION False sage: repr_obj.type() == repr_obj.VERTEX False sage: repr_obj.type() == repr_obj.RAY False sage: repr_obj.type() == repr_obj.LINE False
-
-
class
sage.geometry.polyhedron.representation.Line(polyhedron_parent)¶ Bases:
sage.geometry.polyhedron.representation.VrepresentationA line (Minkowski summand \(\simeq\RR\)) of the polyhedron. Inherits from
Vrepresentation.-
evaluated_on(Hobj)¶ Returns \(A\vec{\ell}\)
EXAMPLES:
sage: p = Polyhedron(ieqs = [[1, 0, 0, 1],[1,1,0,0]]) sage: a = next(p.line_generator()) sage: h = next(p.inequality_generator()) sage: a.evaluated_on(h) 0
-
homogeneous_vector(base_ring=None)¶ Return homogeneous coordinates for this line.
Since a line is given by a direction, this is the vector with a 0 appended.
INPUT:
base_ring– the base ring of the vector.
EXAMPLES:
sage: P = Polyhedron(vertices=[(2,0)], rays=[(1,0)], lines=[(3,2)]) sage: P.lines()[0].homogeneous_vector() (3, 2, 0) sage: P.lines()[0].homogeneous_vector(RDF) (3.0, 2.0, 0.0)
-
is_line()¶ Tests if the object is a line. By construction it must be.
-
type()¶ Returns the type (equation/inequality/vertex/ray/line) as an integer.
OUTPUT:
Integer. One of
PolyhedronRepresentation.INEQUALITY,.EQUATION,.VERTEX,.RAY, or.LINE.EXAMPLES:
sage: p = Polyhedron(ieqs = [[1, 0, 0, 1],[1,1,0,0]]) sage: repr_obj = next(p.line_generator()) sage: repr_obj.type() 4 sage: repr_obj.type() == repr_obj.INEQUALITY False sage: repr_obj.type() == repr_obj.EQUATION False sage: repr_obj.type() == repr_obj.VERTEX False sage: repr_obj.type() == repr_obj.RAY False sage: repr_obj.type() == repr_obj.LINE True
-
-
class
sage.geometry.polyhedron.representation.PolyhedronRepresentation¶ Bases:
sage.structure.sage_object.SageObjectThe internal base class for all representation objects of
Polyhedron(vertices/rays/lines and inequalites/equations)Note
You should not (and cannot) instantiate it yourself. You can only obtain them from a Polyhedron() class.
-
count(i)¶ Count the number of occurrences of
iin the coordinates.INPUT:
i– Anything.
OUTPUT:
Integer. The number of occurrences of
iin the coordinates.EXAMPLES:
sage: p = Polyhedron(vertices=[(0,1,1,2,1)]) sage: v = p.Vrepresentation(0); v A vertex at (0, 1, 1, 2, 1) sage: v.count(1) 3
-
index()¶ Return an arbitrary but fixed number according to the internal storage order.
NOTES:
H-representation and V-representation objects are enumerated independently. That is, amongst all vertices/rays/lines there will be one with
index()==0, and amongst all inequalities/equations there will be one withindex()==0, unless the polyhedron is empty or spans the whole space.EXAMPLES:
sage: s = Polyhedron(vertices=[[1],[-1]]) sage: first_vertex = next(s.vertex_generator()) sage: first_vertex.index() 0 sage: first_vertex == s.Vrepresentation(0) True
-
polyhedron()¶ Returns the underlying polyhedron.
-
vector(base_ring=None)¶ Returns the vector representation of the H/V-representation object.
INPUT:
base_ring– the base ring of the vector.
OUTPUT:
For a V-representation object, a vector of length
ambient_dim(). For a H-representation object, a vector of lengthambient_dim()+ 1.EXAMPLES:
sage: s = polytopes.cuboctahedron() sage: v = next(s.vertex_generator()) sage: v A vertex at (-1, -1, 0) sage: v.vector() (-1, -1, 0) sage: v() (-1, -1, 0) sage: type(v()) <type 'sage.modules.vector_integer_dense.Vector_integer_dense'>
Conversion to a different base ring can be forced with the optional argument:
sage: v.vector(RDF) (-1.0, -1.0, 0.0) sage: vector(RDF, v) (-1.0, -1.0, 0.0)
-
-
class
sage.geometry.polyhedron.representation.Ray(polyhedron_parent)¶ Bases:
sage.geometry.polyhedron.representation.VrepresentationA ray of the polyhedron. Inherits from
Vrepresentation.-
evaluated_on(Hobj)¶ Returns \(A\vec{r}\)
EXAMPLES:
sage: p = Polyhedron(ieqs = [[0,0,1],[0,1,0],[1,-1,0]]) sage: a = next(p.ray_generator()) sage: h = next(p.inequality_generator()) sage: a.evaluated_on(h) 0
-
homogeneous_vector(base_ring=None)¶ Return homogeneous coordinates for this ray.
Since a ray is given by a direction, this is the vector with a 0 appended.
INPUT:
base_ring– the base ring of the vector.
EXAMPLES:
sage: P = Polyhedron(vertices=[(2,0)], rays=[(1,0)], lines=[(3,2)]) sage: P.rays()[0].homogeneous_vector() (1, 0, 0) sage: P.rays()[0].homogeneous_vector(RDF) (1.0, 0.0, 0.0)
-
is_ray()¶ Tests if this object is a ray. Always True by construction.
EXAMPLES:
sage: p = Polyhedron(ieqs = [[0,0,1],[0,1,0],[1,-1,0]]) sage: a = next(p.ray_generator()) sage: a.is_ray() True
-
type()¶ Returns the type (equation/inequality/vertex/ray/line) as an integer.
OUTPUT:
Integer. One of
PolyhedronRepresentation.INEQUALITY,.EQUATION,.VERTEX,.RAY, or.LINE.EXAMPLES:
sage: p = Polyhedron(ieqs = [[0,0,1],[0,1,0],[1,-1,0]]) sage: repr_obj = next(p.ray_generator()) sage: repr_obj.type() 3 sage: repr_obj.type() == repr_obj.INEQUALITY False sage: repr_obj.type() == repr_obj.EQUATION False sage: repr_obj.type() == repr_obj.VERTEX False sage: repr_obj.type() == repr_obj.RAY True sage: repr_obj.type() == repr_obj.LINE False
-
-
class
sage.geometry.polyhedron.representation.Vertex(polyhedron_parent)¶ Bases:
sage.geometry.polyhedron.representation.VrepresentationA vertex of the polyhedron. Inherits from
Vrepresentation.-
evaluated_on(Hobj)¶ Returns \(A\vec{x}+b\)
EXAMPLES:
sage: p = polytopes.hypercube(3) sage: v = next(p.vertex_generator()) sage: h = next(p.inequality_generator()) sage: v A vertex at (-1, -1, -1) sage: h An inequality (0, 0, -1) x + 1 >= 0 sage: v.evaluated_on(h) 2
-
homogeneous_vector(base_ring=None)¶ Return homogeneous coordinates for this vertex.
Since a vertex is given by an affine point, this is the vector with a 1 appended.
INPUT:
base_ring– the base ring of the vector.
EXAMPLES:
sage: P = Polyhedron(vertices=[(2,0)], rays=[(1,0)], lines=[(3,2)]) sage: P.vertices()[0].homogeneous_vector() (2, 0, 1) sage: P.vertices()[0].homogeneous_vector(RDF) (2.0, 0.0, 1.0)
-
is_integral()¶ Return whether the coordinates of the vertex are all integral.
OUTPUT:
Boolean.
EXAMPLES:
sage: p = Polyhedron([(1/2,3,5), (0,0,0), (2,3,7)]) sage: [ v.is_integral() for v in p.vertex_generator() ] [True, False, True]
-
is_vertex()¶ Tests if this object is a vertex. By construction it always is.
EXAMPLES:
sage: p = Polyhedron(ieqs = [[0,0,1],[0,1,0],[1,-1,0]]) sage: a = next(p.vertex_generator()) sage: a.is_vertex() True
-
type()¶ Returns the type (equation/inequality/vertex/ray/line) as an integer.
OUTPUT:
Integer. One of
PolyhedronRepresentation.INEQUALITY,.EQUATION,.VERTEX,.RAY, or.LINE.EXAMPLES:
sage: p = Polyhedron(vertices = [[0,0,0],[1,1,0],[1,2,0]]) sage: repr_obj = next(p.vertex_generator()) sage: repr_obj.type() 2 sage: repr_obj.type() == repr_obj.INEQUALITY False sage: repr_obj.type() == repr_obj.EQUATION False sage: repr_obj.type() == repr_obj.VERTEX True sage: repr_obj.type() == repr_obj.RAY False sage: repr_obj.type() == repr_obj.LINE False
-
-
class
sage.geometry.polyhedron.representation.Vrepresentation(polyhedron_parent)¶ Bases:
sage.geometry.polyhedron.representation.PolyhedronRepresentationThe base class for V-representation objects of a polyhedron. Inherits from
PolyhedronRepresentation.-
adjacent()¶ Alias for neighbors().
-
incident()¶ Returns a generator for the equations/inequalities that are satisfied on the given vertex/ray/line.
EXAMPLES:
sage: triangle = Polyhedron(vertices=[[1,0],[0,1],[-1,-1]]) sage: ineq = next(triangle.inequality_generator()) sage: ineq An inequality (2, -1) x + 1 >= 0 sage: [ v for v in ineq.incident()] [A vertex at (-1, -1), A vertex at (0, 1)] sage: p = Polyhedron(vertices=[[0,0,0],[0,1,0],[0,0,1]], rays=[[1,-1,-1]]) sage: ineq = p.Hrepresentation(2) sage: ineq An inequality (1, 0, 1) x + 0 >= 0 sage: [ x for x in ineq.incident() ] [A vertex at (0, 0, 0), A vertex at (0, 1, 0), A ray in the direction (1, -1, -1)]
-
is_V()¶ Returns True if the object is part of a V-representation (a vertex, ray, or line).
EXAMPLES:
sage: p = Polyhedron(vertices = [[0,0],[1,0],[0,3],[1,3]]) sage: v = next(p.vertex_generator()) sage: v.is_V() True
-
is_incident(Hobj)¶ Returns whether the incidence matrix element (self,Hobj) == 1
EXAMPLES:
sage: p = polytopes.hypercube(3) sage: h1 = next(p.inequality_generator()) sage: h1 An inequality (0, 0, -1) x + 1 >= 0 sage: v1 = next(p.vertex_generator()) sage: v1 A vertex at (-1, -1, -1) sage: v1.is_incident(h1) False
-
is_line()¶ Returns True if the object is a line of the V-representation. This method is over-ridden by the corresponding method in the derived class Line.
EXAMPLES:
sage: p = Polyhedron(ieqs = [[1, 0, 0, 0, 1], [1, 1, 0, 0, 0], [1, 0, 1, 0, 0]]) sage: line1 = next(p.line_generator()) sage: line1.is_line() True sage: v1 = next(p.vertex_generator()) sage: v1.is_line() False
-
is_ray()¶ Returns True if the object is a ray of the V-representation. This method is over-ridden by the corresponding method in the derived class Ray.
EXAMPLES:
sage: p = Polyhedron(ieqs = [[1, 0, 0, 0, 1], [1, 1, 0, 0, 0], [1, 0, 1, 0, 0]]) sage: r1 = next(p.ray_generator()) sage: r1.is_ray() True sage: v1 = next(p.vertex_generator()) sage: v1 A vertex at (-1, -1, 0, -1) sage: v1.is_ray() False
-
is_vertex()¶ Returns True if the object is a vertex of the V-representation. This method is over-ridden by the corresponding method in the derived class Vertex.
EXAMPLES:
sage: p = Polyhedron(vertices = [[0,0],[1,0],[0,3],[1,3]]) sage: v = next(p.vertex_generator()) sage: v.is_vertex() True sage: p = Polyhedron(ieqs = [[1, 0, 0, 0, 1], [1, 1, 0, 0, 0], [1, 0, 1, 0, 0]]) sage: r1 = next(p.ray_generator()) sage: r1.is_vertex() False
-
neighbors()¶ Returns a generator for the adjacent vertices/rays/lines.
EXAMPLES:
sage: p = Polyhedron(vertices = [[0,0],[1,0],[0,3],[1,4]]) sage: v = next(p.vertex_generator()) sage: next(v.neighbors()) A vertex at (0, 3)
-
-
sage.geometry.polyhedron.representation.repr_pretty(coefficients, type, prefix='x', indices=None, latex=False, style='>=', split=False)¶ Return a pretty representation of equation/inequality represented by the coefficients.
INPUT:
coefficients– a tuple or other iterabletype– either0(PolyhedronRepresentation.INEQUALITY) or1(PolyhedronRepresentation.EQUATION)prefix– a stringindices– a tuple or other iterablelatex– a booleansplit– a boolean; (Default:False). If set toTrue,- the output is split into a 3-tuple containing the left-hand side, the relation, and the right-hand side of the object.
style– either"positive"(making all coefficients positive), or"<="or">=".
OUTPUT:
A string or 3-tuple of strings (depending on
split).EXAMPLES:
sage: from sage.geometry.polyhedron.representation import repr_pretty sage: from sage.geometry.polyhedron.representation import PolyhedronRepresentation sage: print(repr_pretty((0, 1, 0, 0), PolyhedronRepresentation.INEQUALITY)) x0 >= 0 sage: print(repr_pretty((1, 2, 1, 0), PolyhedronRepresentation.INEQUALITY)) 2*x0 + x1 >= -1 sage: print(repr_pretty((1, -1, -1, 1), PolyhedronRepresentation.EQUATION)) -x0 - x1 + x2 == -1