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
Return 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()¶
Return 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()¶
Return 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()¶
Return 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)¶
Evaluate the left hand side \(A\vec{x}+b\) 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: [ 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()¶
Return 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()¶
Return 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()¶
Return 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)¶
Return 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()¶
Return 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).
Only defined for inequalities.
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, True, False, True, False, True, False, 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, True, False, True, False, True, False, 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_facet_defining_inequality(other)¶
Check if
self
defines a facet ofother
.INPUT:
other
– a polyhedron
See also
EXAMPLES:
sage: P = Polyhedron(vertices=[[0,0,0],[0,1,0]], rays=[[1,0,0]]) sage: P.inequalities() (An inequality (1, 0, 0) x + 0 >= 0, An inequality (0, 1, 0) x + 0 >= 0, An inequality (0, -1, 0) x + 1 >= 0) sage: Q = Polyhedron(ieqs=[[0,1,0,0]]) sage: Q.inequalities()[0].is_facet_defining_inequality(P) True sage: Q = Polyhedron(ieqs=[[0,2,0,3]]) sage: Q.inequalities()[0].is_facet_defining_inequality(P) True sage: Q = Polyhedron(ieqs=[[0,AA(2).sqrt(),0,3]]) sage: Q.inequalities()[0].is_facet_defining_inequality(P) True sage: Q = Polyhedron(ieqs=[[1,1,0,0]]) sage: Q.inequalities()[0].is_facet_defining_inequality(P) False
sage: P = Polyhedron(vertices=[[0,0,0],[0,1,0]], lines=[[1,0,0]]) sage: P.inequalities() (An inequality (0, 1, 0) x + 0 >= 0, An inequality (0, -1, 0) x + 1 >= 0) sage: Q = Polyhedron(ieqs=[[0,1,0,0]]) sage: Q.inequalities()[0].is_facet_defining_inequality(P) False sage: Q = Polyhedron(ieqs=[[0,-1,0,0]]) sage: Q.inequalities()[0].is_facet_defining_inequality(P) False sage: Q = Polyhedron(ieqs=[[0,0,1,3]]) sage: Q.inequalities()[0].is_facet_defining_inequality(P) True
- is_inequality()¶
Return 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()¶
Return 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)¶
Return \(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()¶
Return 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 inequalities/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.
Note
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()¶
Return the underlying polyhedron.
- vector(base_ring=None)¶
Return 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)¶
Return \(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()¶
Return 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)¶
Return \(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 (-1, 0, 0) x + 1 >= 0 sage: v.evaluated_on(h) 0
- 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()¶
Return 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()¶
Return 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()¶
Return 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)¶
Return whether the incidence matrix element (self,Hobj) == 1
EXAMPLES:
sage: p = polytopes.hypercube(3) sage: h1 = next(p.inequality_generator()) sage: h1 An inequality (-1, 0, 0) x + 1 >= 0 sage: v1 = next(p.vertex_generator()) sage: v1 A vertex at (1, -1, -1) sage: v1.is_incident(h1) True
- is_line()¶
Return 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()¶
Return 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()¶
Return 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()¶
Return 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