H(yperplane) and V(ertex) representation objects for polyhedra¶
-
class
sage.geometry.polyhedron.representation.
Equation
(polyhedron_parent)¶ Bases:
sage.geometry.polyhedron.representation.Hrepresentation
A 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.PolyhedronRepresentation
The 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.Hrepresentation
A 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.Vrepresentation
A 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.SageObject
The 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
i
in the coordinates.INPUT:
i
– Anything.
OUTPUT:
Integer. The number of occurrences of
i
in 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.Vrepresentation
A 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.Vrepresentation
A 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.PolyhedronRepresentation
The 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