Base class for polyhedra: Implementation of the ConvexSet_base
API¶
Define methods that exist for convex sets, but not constructions such as dilation or product.
- class sage.geometry.polyhedron.base1.Polyhedron_base1(parent, Vrep, Hrep, Vrep_minimal=None, Hrep_minimal=None, pref_rep=None, mutable=False, **kwds)[source]¶
Bases:
Polyhedron_base0
,ConvexSet_closed
Convex set methods for polyhedra, but not constructions such as dilation or product.
See
sage.geometry.polyhedron.base.Polyhedron_base
.- Hrepresentation_space()[source]¶
Return the linear space containing the H-representation vectors.
OUTPUT: a free module over the base ring of dimension
ambient_dim()
+ 1EXAMPLES:
sage: poly_test = Polyhedron(vertices = [[1,0,0,0],[0,1,0,0]]) sage: poly_test.Hrepresentation_space() Ambient free module of rank 5 over the principal ideal domain Integer Ring
>>> from sage.all import * >>> poly_test = Polyhedron(vertices = [[Integer(1),Integer(0),Integer(0),Integer(0)],[Integer(0),Integer(1),Integer(0),Integer(0)]]) >>> poly_test.Hrepresentation_space() Ambient free module of rank 5 over the principal ideal domain Integer Ring
poly_test = Polyhedron(vertices = [[1,0,0,0],[0,1,0,0]]) poly_test.Hrepresentation_space()
- Vrepresentation_space()[source]¶
Return the ambient free module.
OUTPUT: a free module over the base ring of dimension
ambient_dim()
EXAMPLES:
sage: poly_test = Polyhedron(vertices = [[1,0,0,0],[0,1,0,0]]) sage: poly_test.Vrepresentation_space() Ambient free module of rank 4 over the principal ideal domain Integer Ring sage: poly_test.ambient_space() is poly_test.Vrepresentation_space() True
>>> from sage.all import * >>> poly_test = Polyhedron(vertices = [[Integer(1),Integer(0),Integer(0),Integer(0)],[Integer(0),Integer(1),Integer(0),Integer(0)]]) >>> poly_test.Vrepresentation_space() Ambient free module of rank 4 over the principal ideal domain Integer Ring >>> poly_test.ambient_space() is poly_test.Vrepresentation_space() True
poly_test = Polyhedron(vertices = [[1,0,0,0],[0,1,0,0]]) poly_test.Vrepresentation_space() poly_test.ambient_space() is poly_test.Vrepresentation_space()
- a_maximal_chain()[source]¶
Return a maximal chain of the face lattice in increasing order.
Subclasses must provide an implementation of this method.
EXAMPLES:
sage: from sage.geometry.polyhedron.base1 import Polyhedron_base1 sage: P = polytopes.cube() sage: Polyhedron_base1.a_maximal_chain <abstract method a_maximal_chain at ...>
>>> from sage.all import * >>> from sage.geometry.polyhedron.base1 import Polyhedron_base1 >>> P = polytopes.cube() >>> Polyhedron_base1.a_maximal_chain <abstract method a_maximal_chain at ...>
from sage.geometry.polyhedron.base1 import Polyhedron_base1 P = polytopes.cube() Polyhedron_base1.a_maximal_chain
- ambient(base_field=None)[source]¶
Return the ambient vector space.
It is the ambient free module (
Vrepresentation_space()
) tensored with a field.INPUT:
base_field
– a field (default: the fraction field of the base ring)
EXAMPLES:
sage: poly_test = Polyhedron(vertices = [[1,0,0,0],[0,1,0,0]]) sage: poly_test.ambient_vector_space() Vector space of dimension 4 over Rational Field sage: poly_test.ambient_vector_space() is poly_test.ambient() True sage: poly_test.ambient_vector_space(AA) # needs sage.rings.number_field Vector space of dimension 4 over Algebraic Real Field sage: poly_test.ambient_vector_space(RDF) Vector space of dimension 4 over Real Double Field sage: poly_test.ambient_vector_space(SR) # needs sage.symbolic Vector space of dimension 4 over Symbolic Ring
>>> from sage.all import * >>> poly_test = Polyhedron(vertices = [[Integer(1),Integer(0),Integer(0),Integer(0)],[Integer(0),Integer(1),Integer(0),Integer(0)]]) >>> poly_test.ambient_vector_space() Vector space of dimension 4 over Rational Field >>> poly_test.ambient_vector_space() is poly_test.ambient() True >>> poly_test.ambient_vector_space(AA) # needs sage.rings.number_field Vector space of dimension 4 over Algebraic Real Field >>> poly_test.ambient_vector_space(RDF) Vector space of dimension 4 over Real Double Field >>> poly_test.ambient_vector_space(SR) # needs sage.symbolic Vector space of dimension 4 over Symbolic Ring
poly_test = Polyhedron(vertices = [[1,0,0,0],[0,1,0,0]]) poly_test.ambient_vector_space() poly_test.ambient_vector_space() is poly_test.ambient() poly_test.ambient_vector_space(AA) # needs sage.rings.number_field poly_test.ambient_vector_space(RDF) poly_test.ambient_vector_space(SR) # needs sage.symbolic
- ambient_dim()[source]¶
Return the dimension of the ambient space.
EXAMPLES:
sage: poly_test = Polyhedron(vertices = [[1,0,0,0],[0,1,0,0]]) sage: poly_test.ambient_dim() 4
>>> from sage.all import * >>> poly_test = Polyhedron(vertices = [[Integer(1),Integer(0),Integer(0),Integer(0)],[Integer(0),Integer(1),Integer(0),Integer(0)]]) >>> poly_test.ambient_dim() 4
poly_test = Polyhedron(vertices = [[1,0,0,0],[0,1,0,0]]) poly_test.ambient_dim()
- ambient_space()[source]¶
Return the ambient free module.
OUTPUT: a free module over the base ring of dimension
ambient_dim()
EXAMPLES:
sage: poly_test = Polyhedron(vertices = [[1,0,0,0],[0,1,0,0]]) sage: poly_test.Vrepresentation_space() Ambient free module of rank 4 over the principal ideal domain Integer Ring sage: poly_test.ambient_space() is poly_test.Vrepresentation_space() True
>>> from sage.all import * >>> poly_test = Polyhedron(vertices = [[Integer(1),Integer(0),Integer(0),Integer(0)],[Integer(0),Integer(1),Integer(0),Integer(0)]]) >>> poly_test.Vrepresentation_space() Ambient free module of rank 4 over the principal ideal domain Integer Ring >>> poly_test.ambient_space() is poly_test.Vrepresentation_space() True
poly_test = Polyhedron(vertices = [[1,0,0,0],[0,1,0,0]]) poly_test.Vrepresentation_space() poly_test.ambient_space() is poly_test.Vrepresentation_space()
- ambient_vector_space(base_field=None)[source]¶
Return the ambient vector space.
It is the ambient free module (
Vrepresentation_space()
) tensored with a field.INPUT:
base_field
– a field (default: the fraction field of the base ring)
EXAMPLES:
sage: poly_test = Polyhedron(vertices = [[1,0,0,0],[0,1,0,0]]) sage: poly_test.ambient_vector_space() Vector space of dimension 4 over Rational Field sage: poly_test.ambient_vector_space() is poly_test.ambient() True sage: poly_test.ambient_vector_space(AA) # needs sage.rings.number_field Vector space of dimension 4 over Algebraic Real Field sage: poly_test.ambient_vector_space(RDF) Vector space of dimension 4 over Real Double Field sage: poly_test.ambient_vector_space(SR) # needs sage.symbolic Vector space of dimension 4 over Symbolic Ring
>>> from sage.all import * >>> poly_test = Polyhedron(vertices = [[Integer(1),Integer(0),Integer(0),Integer(0)],[Integer(0),Integer(1),Integer(0),Integer(0)]]) >>> poly_test.ambient_vector_space() Vector space of dimension 4 over Rational Field >>> poly_test.ambient_vector_space() is poly_test.ambient() True >>> poly_test.ambient_vector_space(AA) # needs sage.rings.number_field Vector space of dimension 4 over Algebraic Real Field >>> poly_test.ambient_vector_space(RDF) Vector space of dimension 4 over Real Double Field >>> poly_test.ambient_vector_space(SR) # needs sage.symbolic Vector space of dimension 4 over Symbolic Ring
poly_test = Polyhedron(vertices = [[1,0,0,0],[0,1,0,0]]) poly_test.ambient_vector_space() poly_test.ambient_vector_space() is poly_test.ambient() poly_test.ambient_vector_space(AA) # needs sage.rings.number_field poly_test.ambient_vector_space(RDF) poly_test.ambient_vector_space(SR) # needs sage.symbolic
- an_affine_basis()[source]¶
Return points in
self
that form a basis for the affine span ofself
.This implementation of the method
an_affine_basis()
for polytopes guarantees the following:All points are vertices.
The basis is obtained by considering a maximal chain of faces in the face lattice and picking for each cover relation one vertex that is in the difference. Thus this method is independent of the concrete realization of the polytope.
For unbounded polyhedra, the result may contain arbitrary points of
self
, not just vertices.EXAMPLES:
sage: P = polytopes.cube() sage: P.an_affine_basis() [A vertex at (-1, -1, -1), A vertex at (1, -1, -1), A vertex at (1, -1, 1), A vertex at (1, 1, -1)] sage: P = polytopes.permutahedron(5) sage: P.an_affine_basis() [A vertex at (1, 2, 3, 5, 4), A vertex at (2, 1, 3, 5, 4), A vertex at (1, 3, 2, 5, 4), A vertex at (4, 1, 3, 5, 2), A vertex at (4, 2, 5, 3, 1)]
>>> from sage.all import * >>> P = polytopes.cube() >>> P.an_affine_basis() [A vertex at (-1, -1, -1), A vertex at (1, -1, -1), A vertex at (1, -1, 1), A vertex at (1, 1, -1)] >>> P = polytopes.permutahedron(Integer(5)) >>> P.an_affine_basis() [A vertex at (1, 2, 3, 5, 4), A vertex at (2, 1, 3, 5, 4), A vertex at (1, 3, 2, 5, 4), A vertex at (4, 1, 3, 5, 2), A vertex at (4, 2, 5, 3, 1)]
P = polytopes.cube() P.an_affine_basis() P = polytopes.permutahedron(5) P.an_affine_basis()
Unbounded polyhedra:
sage: p = Polyhedron(vertices=[(0, 0)], rays=[(1,0), (0,1)]) sage: p.an_affine_basis() [A vertex at (0, 0), (1, 0), (0, 1)] sage: p = Polyhedron(vertices=[(2, 1)], rays=[(1,0), (0,1)]) sage: p.an_affine_basis() [A vertex at (2, 1), (3, 1), (2, 2)] sage: p = Polyhedron(vertices=[(2, 1)], rays=[(1,0)], lines=[(0,1)]) sage: p.an_affine_basis() [(2, 1), A vertex at (2, 0), (3, 0)]
>>> from sage.all import * >>> p = Polyhedron(vertices=[(Integer(0), Integer(0))], rays=[(Integer(1),Integer(0)), (Integer(0),Integer(1))]) >>> p.an_affine_basis() [A vertex at (0, 0), (1, 0), (0, 1)] >>> p = Polyhedron(vertices=[(Integer(2), Integer(1))], rays=[(Integer(1),Integer(0)), (Integer(0),Integer(1))]) >>> p.an_affine_basis() [A vertex at (2, 1), (3, 1), (2, 2)] >>> p = Polyhedron(vertices=[(Integer(2), Integer(1))], rays=[(Integer(1),Integer(0))], lines=[(Integer(0),Integer(1))]) >>> p.an_affine_basis() [(2, 1), A vertex at (2, 0), (3, 0)]
p = Polyhedron(vertices=[(0, 0)], rays=[(1,0), (0,1)]) p.an_affine_basis() p = Polyhedron(vertices=[(2, 1)], rays=[(1,0), (0,1)]) p.an_affine_basis() p = Polyhedron(vertices=[(2, 1)], rays=[(1,0)], lines=[(0,1)]) p.an_affine_basis()
- contains(point)[source]¶
Test whether the polyhedron contains the given
point
.See also
INPUT:
point
– coordinates of a point (an iterable)
OUTPUT: boolean
EXAMPLES:
sage: P = Polyhedron(vertices=[[1,1],[1,-1],[0,0]]) sage: P.contains( [1,0] ) True sage: P.contains( P.center() ) # true for any convex set True
>>> from sage.all import * >>> P = Polyhedron(vertices=[[Integer(1),Integer(1)],[Integer(1),-Integer(1)],[Integer(0),Integer(0)]]) >>> P.contains( [Integer(1),Integer(0)] ) True >>> P.contains( P.center() ) # true for any convex set True
P = Polyhedron(vertices=[[1,1],[1,-1],[0,0]]) P.contains( [1,0] ) P.contains( P.center() ) # true for any convex set
As a shorthand, one may use the usual
in
operator:sage: P.center() in P True sage: [-1,-1] in P False
>>> from sage.all import * >>> P.center() in P True >>> [-Integer(1),-Integer(1)] in P False
P.center() in P [-1,-1] in P
The point need not have coordinates in the same field as the polyhedron:
sage: # needs sage.symbolic sage: ray = Polyhedron(vertices=[(0,0)], rays=[(1,0)], base_ring=QQ) sage: ray.contains([sqrt(2)/3,0]) # irrational coordinates are ok True sage: a = var('a') sage: ray.contains([a,0]) # a might be negative! False sage: assume(a>0) sage: ray.contains([a,0]) True sage: ray.contains(['hello', 'kitty']) # no common ring for coordinates False
>>> from sage.all import * >>> # needs sage.symbolic >>> ray = Polyhedron(vertices=[(Integer(0),Integer(0))], rays=[(Integer(1),Integer(0))], base_ring=QQ) >>> ray.contains([sqrt(Integer(2))/Integer(3),Integer(0)]) # irrational coordinates are ok True >>> a = var('a') >>> ray.contains([a,Integer(0)]) # a might be negative! False >>> assume(a>Integer(0)) >>> ray.contains([a,Integer(0)]) True >>> ray.contains(['hello', 'kitty']) # no common ring for coordinates False
# needs sage.symbolic ray = Polyhedron(vertices=[(0,0)], rays=[(1,0)], base_ring=QQ) ray.contains([sqrt(2)/3,0]) # irrational coordinates are ok a = var('a') ray.contains([a,0]) # a might be negative! assume(a>0) ray.contains([a,0]) ray.contains(['hello', 'kitty']) # no common ring for coordinates
The empty polyhedron needs extra care, see Issue #10238:
sage: empty = Polyhedron(); empty The empty polyhedron in ZZ^0 sage: empty.contains([]) False sage: empty.contains([0]) # not a point in QQ^0 False sage: full = Polyhedron(vertices=[()]); full A 0-dimensional polyhedron in ZZ^0 defined as the convex hull of 1 vertex sage: full.contains([]) True sage: full.contains([0]) False
>>> from sage.all import * >>> empty = Polyhedron(); empty The empty polyhedron in ZZ^0 >>> empty.contains([]) False >>> empty.contains([Integer(0)]) # not a point in QQ^0 False >>> full = Polyhedron(vertices=[()]); full A 0-dimensional polyhedron in ZZ^0 defined as the convex hull of 1 vertex >>> full.contains([]) True >>> full.contains([Integer(0)]) False
empty = Polyhedron(); empty empty.contains([]) empty.contains([0]) # not a point in QQ^0 full = Polyhedron(vertices=[()]); full full.contains([]) full.contains([0])
- dim()[source]¶
Return the dimension of the polyhedron.
OUTPUT: -1 if the polyhedron is empty, otherwise a nonnegative integer
EXAMPLES:
sage: simplex = Polyhedron(vertices = [[1,0,0,0],[0,0,0,1],[0,1,0,0],[0,0,1,0]]) sage: simplex.dim() 3 sage: simplex.ambient_dim() 4
>>> from sage.all import * >>> simplex = Polyhedron(vertices = [[Integer(1),Integer(0),Integer(0),Integer(0)],[Integer(0),Integer(0),Integer(0),Integer(1)],[Integer(0),Integer(1),Integer(0),Integer(0)],[Integer(0),Integer(0),Integer(1),Integer(0)]]) >>> simplex.dim() 3 >>> simplex.ambient_dim() 4
simplex = Polyhedron(vertices = [[1,0,0,0],[0,0,0,1],[0,1,0,0],[0,0,1,0]]) simplex.dim() simplex.ambient_dim()
The empty set is a special case (Issue #12193):
sage: P1=Polyhedron(vertices=[[1,0,0],[0,1,0],[0,0,1]]) sage: P2=Polyhedron(vertices=[[2,0,0],[0,2,0],[0,0,2]]) sage: P12 = P1.intersection(P2) sage: P12 The empty polyhedron in ZZ^3 sage: P12.dim() -1
>>> from sage.all import * >>> P1=Polyhedron(vertices=[[Integer(1),Integer(0),Integer(0)],[Integer(0),Integer(1),Integer(0)],[Integer(0),Integer(0),Integer(1)]]) >>> P2=Polyhedron(vertices=[[Integer(2),Integer(0),Integer(0)],[Integer(0),Integer(2),Integer(0)],[Integer(0),Integer(0),Integer(2)]]) >>> P12 = P1.intersection(P2) >>> P12 The empty polyhedron in ZZ^3 >>> P12.dim() -1
P1=Polyhedron(vertices=[[1,0,0],[0,1,0],[0,0,1]]) P2=Polyhedron(vertices=[[2,0,0],[0,2,0],[0,0,2]]) P12 = P1.intersection(P2) P12 P12.dim()
- dimension()[source]¶
Return the dimension of the polyhedron.
OUTPUT: -1 if the polyhedron is empty, otherwise a nonnegative integer
EXAMPLES:
sage: simplex = Polyhedron(vertices = [[1,0,0,0],[0,0,0,1],[0,1,0,0],[0,0,1,0]]) sage: simplex.dim() 3 sage: simplex.ambient_dim() 4
>>> from sage.all import * >>> simplex = Polyhedron(vertices = [[Integer(1),Integer(0),Integer(0),Integer(0)],[Integer(0),Integer(0),Integer(0),Integer(1)],[Integer(0),Integer(1),Integer(0),Integer(0)],[Integer(0),Integer(0),Integer(1),Integer(0)]]) >>> simplex.dim() 3 >>> simplex.ambient_dim() 4
simplex = Polyhedron(vertices = [[1,0,0,0],[0,0,0,1],[0,1,0,0],[0,0,1,0]]) simplex.dim() simplex.ambient_dim()
The empty set is a special case (Issue #12193):
sage: P1=Polyhedron(vertices=[[1,0,0],[0,1,0],[0,0,1]]) sage: P2=Polyhedron(vertices=[[2,0,0],[0,2,0],[0,0,2]]) sage: P12 = P1.intersection(P2) sage: P12 The empty polyhedron in ZZ^3 sage: P12.dim() -1
>>> from sage.all import * >>> P1=Polyhedron(vertices=[[Integer(1),Integer(0),Integer(0)],[Integer(0),Integer(1),Integer(0)],[Integer(0),Integer(0),Integer(1)]]) >>> P2=Polyhedron(vertices=[[Integer(2),Integer(0),Integer(0)],[Integer(0),Integer(2),Integer(0)],[Integer(0),Integer(0),Integer(2)]]) >>> P12 = P1.intersection(P2) >>> P12 The empty polyhedron in ZZ^3 >>> P12.dim() -1
P1=Polyhedron(vertices=[[1,0,0],[0,1,0],[0,0,1]]) P2=Polyhedron(vertices=[[2,0,0],[0,2,0],[0,0,2]]) P12 = P1.intersection(P2) P12 P12.dim()
- interior()[source]¶
The interior of
self
.OUTPUT:
either an empty polyhedron or an instance of
RelativeInterior
EXAMPLES:
If the polyhedron is full-dimensional, the result is the same as that of
relative_interior()
:sage: P_full = Polyhedron(vertices=[[0,0],[1,1],[1,-1]]) sage: P_full.interior() Relative interior of a 2-dimensional polyhedron in ZZ^2 defined as the convex hull of 3 vertices
>>> from sage.all import * >>> P_full = Polyhedron(vertices=[[Integer(0),Integer(0)],[Integer(1),Integer(1)],[Integer(1),-Integer(1)]]) >>> P_full.interior() Relative interior of a 2-dimensional polyhedron in ZZ^2 defined as the convex hull of 3 vertices
P_full = Polyhedron(vertices=[[0,0],[1,1],[1,-1]]) P_full.interior()
If the polyhedron is of strictly smaller dimension than the ambient space, its interior is empty:
sage: P_lower = Polyhedron(vertices=[[0,1], [0,-1]]) sage: P_lower.interior() The empty polyhedron in ZZ^2
>>> from sage.all import * >>> P_lower = Polyhedron(vertices=[[Integer(0),Integer(1)], [Integer(0),-Integer(1)]]) >>> P_lower.interior() The empty polyhedron in ZZ^2
P_lower = Polyhedron(vertices=[[0,1], [0,-1]]) P_lower.interior()
- interior_contains(point)[source]¶
Test whether the interior of the polyhedron contains the given
point
.See also
INPUT:
point
– coordinates of a point
OUTPUT: boolean
EXAMPLES:
sage: P = Polyhedron(vertices=[[0,0],[1,1],[1,-1]]) sage: P.contains( [1,0] ) True sage: P.interior_contains( [1,0] ) False
>>> from sage.all import * >>> P = Polyhedron(vertices=[[Integer(0),Integer(0)],[Integer(1),Integer(1)],[Integer(1),-Integer(1)]]) >>> P.contains( [Integer(1),Integer(0)] ) True >>> P.interior_contains( [Integer(1),Integer(0)] ) False
P = Polyhedron(vertices=[[0,0],[1,1],[1,-1]]) P.contains( [1,0] ) P.interior_contains( [1,0] )
If the polyhedron is of strictly smaller dimension than the ambient space, its interior is empty:
sage: P = Polyhedron(vertices=[[0,1],[0,-1]]) sage: P.contains( [0,0] ) True sage: P.interior_contains( [0,0] ) False
>>> from sage.all import * >>> P = Polyhedron(vertices=[[Integer(0),Integer(1)],[Integer(0),-Integer(1)]]) >>> P.contains( [Integer(0),Integer(0)] ) True >>> P.interior_contains( [Integer(0),Integer(0)] ) False
P = Polyhedron(vertices=[[0,1],[0,-1]]) P.contains( [0,0] ) P.interior_contains( [0,0] )
The empty polyhedron needs extra care, see Issue #10238:
sage: empty = Polyhedron(); empty The empty polyhedron in ZZ^0 sage: empty.interior_contains([]) False
>>> from sage.all import * >>> empty = Polyhedron(); empty The empty polyhedron in ZZ^0 >>> empty.interior_contains([]) False
empty = Polyhedron(); empty empty.interior_contains([])
- is_empty()[source]¶
Test whether the polyhedron is the empty polyhedron.
OUTPUT: boolean
EXAMPLES:
sage: P = Polyhedron(vertices=[[1,0,0],[0,1,0],[0,0,1]]); P A 2-dimensional polyhedron in ZZ^3 defined as the convex hull of 3 vertices sage: P.is_empty(), P.is_universe() (False, False) sage: Q = Polyhedron(vertices=()); Q The empty polyhedron in ZZ^0 sage: Q.is_empty(), Q.is_universe() (True, False) sage: R = Polyhedron(lines=[(1,0),(0,1)]); R A 2-dimensional polyhedron in ZZ^2 defined as the convex hull of 1 vertex and 2 lines sage: R.is_empty(), R.is_universe() (False, True)
>>> from sage.all import * >>> P = Polyhedron(vertices=[[Integer(1),Integer(0),Integer(0)],[Integer(0),Integer(1),Integer(0)],[Integer(0),Integer(0),Integer(1)]]); P A 2-dimensional polyhedron in ZZ^3 defined as the convex hull of 3 vertices >>> P.is_empty(), P.is_universe() (False, False) >>> Q = Polyhedron(vertices=()); Q The empty polyhedron in ZZ^0 >>> Q.is_empty(), Q.is_universe() (True, False) >>> R = Polyhedron(lines=[(Integer(1),Integer(0)),(Integer(0),Integer(1))]); R A 2-dimensional polyhedron in ZZ^2 defined as the convex hull of 1 vertex and 2 lines >>> R.is_empty(), R.is_universe() (False, True)
P = Polyhedron(vertices=[[1,0,0],[0,1,0],[0,0,1]]); P P.is_empty(), P.is_universe() Q = Polyhedron(vertices=()); Q Q.is_empty(), Q.is_universe() R = Polyhedron(lines=[(1,0),(0,1)]); R R.is_empty(), R.is_universe()
- is_relatively_open()[source]¶
Return whether
self
is relatively open.OUTPUT: boolean
EXAMPLES:
sage: P = Polyhedron(vertices=[(1,0), (-1,0)]); P A 1-dimensional polyhedron in ZZ^2 defined as the convex hull of 2 vertices sage: P.is_relatively_open() False sage: P0 = Polyhedron(vertices=[[1, 2]]); P0 A 0-dimensional polyhedron in ZZ^2 defined as the convex hull of 1 vertex sage: P0.is_relatively_open() True sage: Empty = Polyhedron(ambient_dim=2); Empty The empty polyhedron in ZZ^2 sage: Empty.is_relatively_open() True sage: Line = Polyhedron(vertices=[(1, 1)], lines=[(1, 0)]); Line A 1-dimensional polyhedron in QQ^2 defined as the convex hull of 1 vertex and 1 line sage: Line.is_relatively_open() True
>>> from sage.all import * >>> P = Polyhedron(vertices=[(Integer(1),Integer(0)), (-Integer(1),Integer(0))]); P A 1-dimensional polyhedron in ZZ^2 defined as the convex hull of 2 vertices >>> P.is_relatively_open() False >>> P0 = Polyhedron(vertices=[[Integer(1), Integer(2)]]); P0 A 0-dimensional polyhedron in ZZ^2 defined as the convex hull of 1 vertex >>> P0.is_relatively_open() True >>> Empty = Polyhedron(ambient_dim=Integer(2)); Empty The empty polyhedron in ZZ^2 >>> Empty.is_relatively_open() True >>> Line = Polyhedron(vertices=[(Integer(1), Integer(1))], lines=[(Integer(1), Integer(0))]); Line A 1-dimensional polyhedron in QQ^2 defined as the convex hull of 1 vertex and 1 line >>> Line.is_relatively_open() True
P = Polyhedron(vertices=[(1,0), (-1,0)]); P P.is_relatively_open() P0 = Polyhedron(vertices=[[1, 2]]); P0 P0.is_relatively_open() Empty = Polyhedron(ambient_dim=2); Empty Empty.is_relatively_open() Line = Polyhedron(vertices=[(1, 1)], lines=[(1, 0)]); Line Line.is_relatively_open()
- is_universe()[source]¶
Test whether the polyhedron is the whole ambient space.
OUTPUT: boolean
EXAMPLES:
sage: P = Polyhedron(vertices=[[1,0,0],[0,1,0],[0,0,1]]); P A 2-dimensional polyhedron in ZZ^3 defined as the convex hull of 3 vertices sage: P.is_empty(), P.is_universe() (False, False) sage: Q = Polyhedron(vertices=()); Q The empty polyhedron in ZZ^0 sage: Q.is_empty(), Q.is_universe() (True, False) sage: R = Polyhedron(lines=[(1,0),(0,1)]); R A 2-dimensional polyhedron in ZZ^2 defined as the convex hull of 1 vertex and 2 lines sage: R.is_empty(), R.is_universe() (False, True)
>>> from sage.all import * >>> P = Polyhedron(vertices=[[Integer(1),Integer(0),Integer(0)],[Integer(0),Integer(1),Integer(0)],[Integer(0),Integer(0),Integer(1)]]); P A 2-dimensional polyhedron in ZZ^3 defined as the convex hull of 3 vertices >>> P.is_empty(), P.is_universe() (False, False) >>> Q = Polyhedron(vertices=()); Q The empty polyhedron in ZZ^0 >>> Q.is_empty(), Q.is_universe() (True, False) >>> R = Polyhedron(lines=[(Integer(1),Integer(0)),(Integer(0),Integer(1))]); R A 2-dimensional polyhedron in ZZ^2 defined as the convex hull of 1 vertex and 2 lines >>> R.is_empty(), R.is_universe() (False, True)
P = Polyhedron(vertices=[[1,0,0],[0,1,0],[0,0,1]]); P P.is_empty(), P.is_universe() Q = Polyhedron(vertices=()); Q Q.is_empty(), Q.is_universe() R = Polyhedron(lines=[(1,0),(0,1)]); R R.is_empty(), R.is_universe()
- relative_interior()[source]¶
Return the relative interior of
self
.EXAMPLES:
sage: P = Polyhedron(vertices=[(1,0), (-1,0)]) sage: ri_P = P.relative_interior(); ri_P Relative interior of a 1-dimensional polyhedron in ZZ^2 defined as the convex hull of 2 vertices sage: (0, 0) in ri_P True sage: (1, 0) in ri_P False sage: P0 = Polyhedron(vertices=[[1, 2]]) sage: P0.relative_interior() is P0 True sage: Empty = Polyhedron(ambient_dim=2) sage: Empty.relative_interior() is Empty True sage: Line = Polyhedron(vertices=[(1, 1)], lines=[(1, 0)]) sage: Line.relative_interior() is Line True
>>> from sage.all import * >>> P = Polyhedron(vertices=[(Integer(1),Integer(0)), (-Integer(1),Integer(0))]) >>> ri_P = P.relative_interior(); ri_P Relative interior of a 1-dimensional polyhedron in ZZ^2 defined as the convex hull of 2 vertices >>> (Integer(0), Integer(0)) in ri_P True >>> (Integer(1), Integer(0)) in ri_P False >>> P0 = Polyhedron(vertices=[[Integer(1), Integer(2)]]) >>> P0.relative_interior() is P0 True >>> Empty = Polyhedron(ambient_dim=Integer(2)) >>> Empty.relative_interior() is Empty True >>> Line = Polyhedron(vertices=[(Integer(1), Integer(1))], lines=[(Integer(1), Integer(0))]) >>> Line.relative_interior() is Line True
P = Polyhedron(vertices=[(1,0), (-1,0)]) ri_P = P.relative_interior(); ri_P (0, 0) in ri_P (1, 0) in ri_P P0 = Polyhedron(vertices=[[1, 2]]) P0.relative_interior() is P0 Empty = Polyhedron(ambient_dim=2) Empty.relative_interior() is Empty Line = Polyhedron(vertices=[(1, 1)], lines=[(1, 0)]) Line.relative_interior() is Line
- relative_interior_contains(point)[source]¶
Test whether the relative interior of the polyhedron contains the given
point
.See also
INPUT:
point
– coordinates of a point
OUTPUT: boolean
EXAMPLES:
sage: P = Polyhedron(vertices=[(1,0), (-1,0)]) sage: P.contains( (0,0) ) True sage: P.interior_contains( (0,0) ) False sage: P.relative_interior_contains( (0,0) ) True sage: P.relative_interior_contains( (1,0) ) False
>>> from sage.all import * >>> P = Polyhedron(vertices=[(Integer(1),Integer(0)), (-Integer(1),Integer(0))]) >>> P.contains( (Integer(0),Integer(0)) ) True >>> P.interior_contains( (Integer(0),Integer(0)) ) False >>> P.relative_interior_contains( (Integer(0),Integer(0)) ) True >>> P.relative_interior_contains( (Integer(1),Integer(0)) ) False
P = Polyhedron(vertices=[(1,0), (-1,0)]) P.contains( (0,0) ) P.interior_contains( (0,0) ) P.relative_interior_contains( (0,0) ) P.relative_interior_contains( (1,0) )
The empty polyhedron needs extra care, see Issue #10238:
sage: empty = Polyhedron(); empty The empty polyhedron in ZZ^0 sage: empty.relative_interior_contains([]) False
>>> from sage.all import * >>> empty = Polyhedron(); empty The empty polyhedron in ZZ^0 >>> empty.relative_interior_contains([]) False
empty = Polyhedron(); empty empty.relative_interior_contains([])
- representative_point()[source]¶
Return a “generic” point.
OUTPUT:
A point as a coordinate vector. The point is chosen to be interior if possible. If the polyhedron is not full-dimensional, the point is in the relative interior. If the polyhedron is zero-dimensional, its single point is returned.
EXAMPLES:
sage: p = Polyhedron(vertices=[(3,2)], rays=[(1,-1)]) sage: p.representative_point() (4, 1) sage: p.center() (3, 2) sage: Polyhedron(vertices=[(3,2)]).representative_point() (3, 2)
>>> from sage.all import * >>> p = Polyhedron(vertices=[(Integer(3),Integer(2))], rays=[(Integer(1),-Integer(1))]) >>> p.representative_point() (4, 1) >>> p.center() (3, 2) >>> Polyhedron(vertices=[(Integer(3),Integer(2))]).representative_point() (3, 2)
p = Polyhedron(vertices=[(3,2)], rays=[(1,-1)]) p.representative_point() p.center() Polyhedron(vertices=[(3,2)]).representative_point()