Parents for Polyhedra

sage.geometry.polyhedron.parent.Polyhedra(ambient_space_or_base_ring, ambient_dim, backend=None, ambient_space=None, base_ring=None)[source]

Construct a suitable parent class for polyhedra.

INPUT:

  • base_ring – a ring; currently there are backends for Z, Q, and R

  • ambient_dim – integer; the ambient space dimension

  • ambient_space – a free module

  • backend – string. The name of the backend for computations. There are several backends implemented:

    • backend="ppl" uses the Parma Polyhedra Library

    • backend="cdd" uses CDD

    • backend="normaliz" uses normaliz

    • backend="polymake" uses polymake

    • backend="field" a generic Sage implementation

OUTPUT:

A parent class for polyhedra over the given base ring if the backend supports it. If not, the parent base ring can be larger (for example, Q instead of Z). If there is no implementation at all, a ValueError is raised.

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: Polyhedra(AA, 3)                                                          # needs sage.rings.number_field
Polyhedra in AA^3
sage: Polyhedra(ZZ, 3)
Polyhedra in ZZ^3
sage: type(_)
<class 'sage.geometry.polyhedron.parent.Polyhedra_ZZ_ppl_with_category'>
sage: Polyhedra(QQ, 3, backend='cdd')
Polyhedra in QQ^3
sage: type(_)
<class 'sage.geometry.polyhedron.parent.Polyhedra_QQ_cdd_with_category'>
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> Polyhedra(AA, Integer(3))                                                          # needs sage.rings.number_field
Polyhedra in AA^3
>>> Polyhedra(ZZ, Integer(3))
Polyhedra in ZZ^3
>>> type(_)
<class 'sage.geometry.polyhedron.parent.Polyhedra_ZZ_ppl_with_category'>
>>> Polyhedra(QQ, Integer(3), backend='cdd')
Polyhedra in QQ^3
>>> type(_)
<class 'sage.geometry.polyhedron.parent.Polyhedra_QQ_cdd_with_category'>
from sage.geometry.polyhedron.parent import Polyhedra
Polyhedra(AA, 3)                                                          # needs sage.rings.number_field
Polyhedra(ZZ, 3)
type(_)
Polyhedra(QQ, 3, backend='cdd')
type(_)

CDD does not support integer polytopes directly:

sage: Polyhedra(ZZ, 3, backend='cdd')
Polyhedra in QQ^3
>>> from sage.all import *
>>> Polyhedra(ZZ, Integer(3), backend='cdd')
Polyhedra in QQ^3
Polyhedra(ZZ, 3, backend='cdd')

Using a more general form of the constructor:

sage: V = VectorSpace(QQ, 3)
sage: Polyhedra(V) is Polyhedra(QQ, 3)
True
sage: Polyhedra(V, backend='field') is Polyhedra(QQ, 3, 'field')
True
sage: Polyhedra(backend='field', ambient_space=V) is Polyhedra(QQ, 3, 'field')
True

sage: M = FreeModule(ZZ, 2)
sage: Polyhedra(M, backend='ppl') is Polyhedra(ZZ, 2, 'ppl')
True
>>> from sage.all import *
>>> V = VectorSpace(QQ, Integer(3))
>>> Polyhedra(V) is Polyhedra(QQ, Integer(3))
True
>>> Polyhedra(V, backend='field') is Polyhedra(QQ, Integer(3), 'field')
True
>>> Polyhedra(backend='field', ambient_space=V) is Polyhedra(QQ, Integer(3), 'field')
True

>>> M = FreeModule(ZZ, Integer(2))
>>> Polyhedra(M, backend='ppl') is Polyhedra(ZZ, Integer(2), 'ppl')
True
V = VectorSpace(QQ, 3)
Polyhedra(V) is Polyhedra(QQ, 3)
Polyhedra(V, backend='field') is Polyhedra(QQ, 3, 'field')
Polyhedra(backend='field', ambient_space=V) is Polyhedra(QQ, 3, 'field')
M = FreeModule(ZZ, 2)
Polyhedra(M, backend='ppl') is Polyhedra(ZZ, 2, 'ppl')
class sage.geometry.polyhedron.parent.Polyhedra_QQ_cdd(base_ring, ambient_dim, backend)[source]

Bases: Polyhedra_base

Element[source]

alias of Polyhedron_QQ_cdd

class sage.geometry.polyhedron.parent.Polyhedra_QQ_normaliz(base_ring, ambient_dim, backend)[source]

Bases: Polyhedra_base

Element[source]

alias of Polyhedron_QQ_normaliz

class sage.geometry.polyhedron.parent.Polyhedra_QQ_ppl(base_ring, ambient_dim, backend)[source]

Bases: Polyhedra_base

Element[source]

alias of Polyhedron_QQ_ppl

class sage.geometry.polyhedron.parent.Polyhedra_RDF_cdd(base_ring, ambient_dim, backend)[source]

Bases: Polyhedra_base

Element[source]

alias of Polyhedron_RDF_cdd

class sage.geometry.polyhedron.parent.Polyhedra_ZZ_normaliz(base_ring, ambient_dim, backend)[source]

Bases: Polyhedra_base

Element[source]

alias of Polyhedron_ZZ_normaliz

class sage.geometry.polyhedron.parent.Polyhedra_ZZ_ppl(base_ring, ambient_dim, backend)[source]

Bases: Polyhedra_base

Element[source]

alias of Polyhedron_ZZ_ppl

class sage.geometry.polyhedron.parent.Polyhedra_base(base_ring, ambient_dim, backend)[source]

Bases: UniqueRepresentation, Parent

Polyhedra in a fixed ambient space.

INPUT:

  • base_ring – either ZZ, QQ, or RDF; the base ring of the ambient module/vector space

  • ambient_dim – integer; the ambient space dimension

  • backend – string; the name of the backend for computations. There are several backends implemented:

    • backend="ppl" uses the Parma Polyhedra Library

    • backend="cdd" uses CDD

    • backend="normaliz" uses normaliz

    • backend="polymake" uses polymake

    • backend="field" a generic Sage implementation

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: Polyhedra(ZZ, 3)
Polyhedra in ZZ^3
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> Polyhedra(ZZ, Integer(3))
Polyhedra in ZZ^3
from sage.geometry.polyhedron.parent import Polyhedra
Polyhedra(ZZ, 3)
Hrepresentation_space()[source]

Return the linear space containing the H-representation vectors.

OUTPUT: a free module over the base ring of dimension ambient_dim() + 1

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: Polyhedra(ZZ, 2).Hrepresentation_space()
Ambient free module of rank 3 over the principal ideal domain Integer Ring
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> Polyhedra(ZZ, Integer(2)).Hrepresentation_space()
Ambient free module of rank 3 over the principal ideal domain Integer Ring
from sage.geometry.polyhedron.parent import Polyhedra
Polyhedra(ZZ, 2).Hrepresentation_space()
Vrepresentation_space()[source]

Return the ambient vector space.

This is the vector space or module containing the Vrepresentation vectors.

OUTPUT: a free module over the base ring of dimension ambient_dim()

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: Polyhedra(QQ, 4).Vrepresentation_space()
Vector space of dimension 4 over Rational Field
sage: Polyhedra(QQ, 4).ambient_space()
Vector space of dimension 4 over Rational Field
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> Polyhedra(QQ, Integer(4)).Vrepresentation_space()
Vector space of dimension 4 over Rational Field
>>> Polyhedra(QQ, Integer(4)).ambient_space()
Vector space of dimension 4 over Rational Field
from sage.geometry.polyhedron.parent import Polyhedra
Polyhedra(QQ, 4).Vrepresentation_space()
Polyhedra(QQ, 4).ambient_space()
ambient_dim()[source]

Return the dimension of the ambient space.

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: Polyhedra(QQ, 3).ambient_dim()
3
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> Polyhedra(QQ, Integer(3)).ambient_dim()
3
from sage.geometry.polyhedron.parent import Polyhedra
Polyhedra(QQ, 3).ambient_dim()
ambient_space()[source]

Return the ambient vector space.

This is the vector space or module containing the Vrepresentation vectors.

OUTPUT: a free module over the base ring of dimension ambient_dim()

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: Polyhedra(QQ, 4).Vrepresentation_space()
Vector space of dimension 4 over Rational Field
sage: Polyhedra(QQ, 4).ambient_space()
Vector space of dimension 4 over Rational Field
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> Polyhedra(QQ, Integer(4)).Vrepresentation_space()
Vector space of dimension 4 over Rational Field
>>> Polyhedra(QQ, Integer(4)).ambient_space()
Vector space of dimension 4 over Rational Field
from sage.geometry.polyhedron.parent import Polyhedra
Polyhedra(QQ, 4).Vrepresentation_space()
Polyhedra(QQ, 4).ambient_space()
an_element()[source]

Return a Polyhedron.

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: Polyhedra(QQ, 4).an_element()
A 4-dimensional polyhedron in QQ^4 defined as the convex hull of 5 vertices
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> Polyhedra(QQ, Integer(4)).an_element()
A 4-dimensional polyhedron in QQ^4 defined as the convex hull of 5 vertices
from sage.geometry.polyhedron.parent import Polyhedra
Polyhedra(QQ, 4).an_element()
backend()[source]

Return the backend.

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: Polyhedra(QQ, 3).backend()
'ppl'
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> Polyhedra(QQ, Integer(3)).backend()
'ppl'
from sage.geometry.polyhedron.parent import Polyhedra
Polyhedra(QQ, 3).backend()
base_extend(base_ring, backend=None, ambient_dim=None)[source]

Return the base extended parent.

INPUT:

  • base_ring, backend – see Polyhedron()

  • ambient_dim – if not None change ambient dimension accordingly

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: Polyhedra(ZZ, 3).base_extend(QQ)
Polyhedra in QQ^3
sage: Polyhedra(ZZ, 3).an_element().base_extend(QQ)
A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 4 vertices
sage: Polyhedra(QQ, 2).base_extend(ZZ)
Polyhedra in QQ^2
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> Polyhedra(ZZ, Integer(3)).base_extend(QQ)
Polyhedra in QQ^3
>>> Polyhedra(ZZ, Integer(3)).an_element().base_extend(QQ)
A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 4 vertices
>>> Polyhedra(QQ, Integer(2)).base_extend(ZZ)
Polyhedra in QQ^2
from sage.geometry.polyhedron.parent import Polyhedra
Polyhedra(ZZ, 3).base_extend(QQ)
Polyhedra(ZZ, 3).an_element().base_extend(QQ)
Polyhedra(QQ, 2).base_extend(ZZ)
change_ring(base_ring, backend=None, ambient_dim=None)[source]

Return the parent with the new base ring.

INPUT:

  • base_ring, backend – see Polyhedron()

  • ambient_dim – if not None change ambient dimension accordingly

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: Polyhedra(ZZ, 3).change_ring(QQ)
Polyhedra in QQ^3
sage: Polyhedra(ZZ, 3).an_element().change_ring(QQ)
A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 4 vertices

sage: Polyhedra(RDF, 3).change_ring(QQ).backend()
'cdd'
sage: Polyhedra(QQ, 3).change_ring(ZZ, ambient_dim=4)
Polyhedra in ZZ^4
sage: Polyhedra(QQ, 3, backend='cdd').change_ring(QQ, ambient_dim=4).backend()
'cdd'
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> Polyhedra(ZZ, Integer(3)).change_ring(QQ)
Polyhedra in QQ^3
>>> Polyhedra(ZZ, Integer(3)).an_element().change_ring(QQ)
A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 4 vertices

>>> Polyhedra(RDF, Integer(3)).change_ring(QQ).backend()
'cdd'
>>> Polyhedra(QQ, Integer(3)).change_ring(ZZ, ambient_dim=Integer(4))
Polyhedra in ZZ^4
>>> Polyhedra(QQ, Integer(3), backend='cdd').change_ring(QQ, ambient_dim=Integer(4)).backend()
'cdd'
from sage.geometry.polyhedron.parent import Polyhedra
Polyhedra(ZZ, 3).change_ring(QQ)
Polyhedra(ZZ, 3).an_element().change_ring(QQ)
Polyhedra(RDF, 3).change_ring(QQ).backend()
Polyhedra(QQ, 3).change_ring(ZZ, ambient_dim=4)
Polyhedra(QQ, 3, backend='cdd').change_ring(QQ, ambient_dim=4).backend()
empty()[source]

Return the empty polyhedron.

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: P = Polyhedra(QQ, 4)
sage: P.empty()
The empty polyhedron in QQ^4
sage: P.empty().is_empty()
True
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> P = Polyhedra(QQ, Integer(4))
>>> P.empty()
The empty polyhedron in QQ^4
>>> P.empty().is_empty()
True
from sage.geometry.polyhedron.parent import Polyhedra
P = Polyhedra(QQ, 4)
P.empty()
P.empty().is_empty()
list()[source]

Return the two polyhedra in ambient dimension 0, raise an error otherwise.

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: P = Polyhedra(QQ, 3)
sage: P.cardinality()
+Infinity

sage: # needs sage.rings.number_field
sage: P = Polyhedra(AA, 0)
sage: P.category()
Category of finite enumerated polyhedral sets over Algebraic Real Field
sage: P.list()
[The empty polyhedron in AA^0,
 A 0-dimensional polyhedron in AA^0 defined as the convex hull of 1 vertex]
sage: P.cardinality()
2
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> P = Polyhedra(QQ, Integer(3))
>>> P.cardinality()
+Infinity

>>> # needs sage.rings.number_field
>>> P = Polyhedra(AA, Integer(0))
>>> P.category()
Category of finite enumerated polyhedral sets over Algebraic Real Field
>>> P.list()
[The empty polyhedron in AA^0,
 A 0-dimensional polyhedron in AA^0 defined as the convex hull of 1 vertex]
>>> P.cardinality()
2
from sage.geometry.polyhedron.parent import Polyhedra
P = Polyhedra(QQ, 3)
P.cardinality()
# needs sage.rings.number_field
P = Polyhedra(AA, 0)
P.category()
P.list()
P.cardinality()
recycle(polyhedron)[source]

Recycle the H/V-representation objects of a polyhedron.

This speeds up creation of new polyhedra by reusing objects. After recycling a polyhedron object, it is not in a consistent state any more and neither the polyhedron nor its H/V-representation objects may be used any more.

INPUT:

  • polyhedron – a polyhedron whose parent is self

EXAMPLES:

sage: p = Polyhedron([(0,0),(1,0),(0,1)])
sage: p.parent().recycle(p)
>>> from sage.all import *
>>> p = Polyhedron([(Integer(0),Integer(0)),(Integer(1),Integer(0)),(Integer(0),Integer(1))])
>>> p.parent().recycle(p)
p = Polyhedron([(0,0),(1,0),(0,1)])
p.parent().recycle(p)
some_elements()[source]

Return a list of some elements of the semigroup.

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: Polyhedra(QQ, 4).some_elements()
[A 3-dimensional polyhedron in QQ^4
  defined as the convex hull of 4 vertices,
 A 4-dimensional polyhedron in QQ^4
  defined as the convex hull of 1 vertex and 4 rays,
 A 2-dimensional polyhedron in QQ^4
  defined as the convex hull of 2 vertices and 1 ray,
 The empty polyhedron in QQ^4]
sage: Polyhedra(ZZ, 0).some_elements()
[The empty polyhedron in ZZ^0,
 A 0-dimensional polyhedron in ZZ^0 defined as the convex hull of 1 vertex]
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> Polyhedra(QQ, Integer(4)).some_elements()
[A 3-dimensional polyhedron in QQ^4
  defined as the convex hull of 4 vertices,
 A 4-dimensional polyhedron in QQ^4
  defined as the convex hull of 1 vertex and 4 rays,
 A 2-dimensional polyhedron in QQ^4
  defined as the convex hull of 2 vertices and 1 ray,
 The empty polyhedron in QQ^4]
>>> Polyhedra(ZZ, Integer(0)).some_elements()
[The empty polyhedron in ZZ^0,
 A 0-dimensional polyhedron in ZZ^0 defined as the convex hull of 1 vertex]
from sage.geometry.polyhedron.parent import Polyhedra
Polyhedra(QQ, 4).some_elements()
Polyhedra(ZZ, 0).some_elements()
universe()[source]

Return the entire ambient space as polyhedron.

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: P = Polyhedra(QQ, 4)
sage: P.universe()
A 4-dimensional polyhedron in QQ^4 defined as
 the convex hull of 1 vertex and 4 lines
sage: P.universe().is_universe()
True
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> P = Polyhedra(QQ, Integer(4))
>>> P.universe()
A 4-dimensional polyhedron in QQ^4 defined as
 the convex hull of 1 vertex and 4 lines
>>> P.universe().is_universe()
True
from sage.geometry.polyhedron.parent import Polyhedra
P = Polyhedra(QQ, 4)
P.universe()
P.universe().is_universe()
zero()[source]

Return the polyhedron consisting of the origin, which is the neutral element for Minkowski addition.

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import Polyhedra
sage: p = Polyhedra(QQ, 4).zero();  p
A 0-dimensional polyhedron in QQ^4 defined as the convex hull of 1 vertex
sage: p + p == p
True
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import Polyhedra
>>> p = Polyhedra(QQ, Integer(4)).zero();  p
A 0-dimensional polyhedron in QQ^4 defined as the convex hull of 1 vertex
>>> p + p == p
True
from sage.geometry.polyhedron.parent import Polyhedra
p = Polyhedra(QQ, 4).zero();  p
p + p == p
class sage.geometry.polyhedron.parent.Polyhedra_field(base_ring, ambient_dim, backend)[source]

Bases: Polyhedra_base

Element[source]

alias of Polyhedron_field

class sage.geometry.polyhedron.parent.Polyhedra_normaliz(base_ring, ambient_dim, backend)[source]

Bases: Polyhedra_base

Element[source]

alias of Polyhedron_normaliz

class sage.geometry.polyhedron.parent.Polyhedra_number_field(base_ring, ambient_dim, backend)[source]

Bases: Polyhedra_base

Element[source]

alias of Polyhedron_number_field

class sage.geometry.polyhedron.parent.Polyhedra_polymake(base_ring, ambient_dim, backend)[source]

Bases: Polyhedra_base

Element[source]

alias of Polyhedron_polymake

sage.geometry.polyhedron.parent.does_backend_handle_base_ring(backend)[source]

Return true, if backend can handle base_ring.

EXAMPLES:

sage: from sage.geometry.polyhedron.parent import does_backend_handle_base_ring
sage: does_backend_handle_base_ring(QQ, 'ppl')
True
sage: does_backend_handle_base_ring(QQ[sqrt(5)], 'ppl')                         # needs sage.rings.number_field sage.symbolic
False
sage: does_backend_handle_base_ring(QQ[sqrt(5)], 'field')                       # needs sage.rings.number_field sage.symbolic
True
>>> from sage.all import *
>>> from sage.geometry.polyhedron.parent import does_backend_handle_base_ring
>>> does_backend_handle_base_ring(QQ, 'ppl')
True
>>> does_backend_handle_base_ring(QQ[sqrt(Integer(5))], 'ppl')                         # needs sage.rings.number_field sage.symbolic
False
>>> does_backend_handle_base_ring(QQ[sqrt(Integer(5))], 'field')                       # needs sage.rings.number_field sage.symbolic
True
from sage.geometry.polyhedron.parent import does_backend_handle_base_ring
does_backend_handle_base_ring(QQ, 'ppl')
does_backend_handle_base_ring(QQ[sqrt(5)], 'ppl')                         # needs sage.rings.number_field sage.symbolic
does_backend_handle_base_ring(QQ[sqrt(5)], 'field')                       # needs sage.rings.number_field sage.symbolic