def vertices(self): r""" Return the vertices as a tuple of `\ZZ`-vectors. OUTPUT: A tuple of `\ZZ`-vectors. Each entry is the coordinate vector of an integral points of the lattice polytope. EXAMPLES:: sage: from sage.geometry.polyhedron.ppl_lattice_polytope import LatticePolytope_PPL sage: p = LatticePolytope_PPL((-9,-6,-1,-1),(0,0,0,1),(0,0,1,0),(0,1,0,0),(1,0,0,0)) sage: p.vertices() ((-9, -6, -1, -1), (0, 0, 0, 1), (0, 0, 1, 0), (0, 1, 0, 0), (1, 0, 0, 0)) sage: p.minimized_generators() Generator_System {point(-9/1, -6/1, -1/1, -1/1), point(0/1, 0/1, 0/1, 1/1), point(0/1, 0/1, 1/1, 0/1), point(0/1, 1/1, 0/1, 0/1), point(1/1, 0/1, 0/1, 0/1)} """ d = self.space_dimension() v = vector(ZZ, d) points = [] for g in self.minimized_generators(): for i in range(0,d): v[i] = g.coefficient(Variable(i)) v_copy = copy.copy(v) v_copy.set_immutable() points.append(v_copy) return tuple(points)
def has_IP_property(self): """ Whether the lattice polytope has the IP property. That is, the polytope is full-dimensional and the origin is a interior point not on the boundary. OUTPUT: Boolean. EXAMPLES:: sage: from sage.geometry.polyhedron.ppl_lattice_polytope import LatticePolytope_PPL sage: LatticePolytope_PPL((-1,-1),(0,1),(1,0)).has_IP_property() True sage: LatticePolytope_PPL((-1,-1),(1,1)).has_IP_property() False """ origin = C_Polyhedron(point(0*Variable(self.space_dimension()))) is_included = Poly_Con_Relation.is_included() saturates = Poly_Con_Relation.saturates() for c in self.constraints(): rel = origin.relation_with(c) if (not rel.implies(is_included)) or rel.implies(saturates): return False return True
def bounding_box(self): r""" Return the coordinates of a rectangular box containing the non-empty polytope. OUTPUT: A pair of tuples ``(box_min, box_max)`` where ``box_min`` are the coordinates of a point bounding the coordinates of the polytope from below and ``box_max`` bounds the coordinates from above. EXAMPLES:: sage: from sage.geometry.polyhedron.ppl_lattice_polytope import LatticePolytope_PPL sage: LatticePolytope_PPL((0,0),(1,0),(0,1)).bounding_box() ((0, 0), (1, 1)) """ box_min = [] box_max = [] if self.is_empty(): raise ValueError('empty polytope is not allowed') for i in range(0, self.space_dimension()): x = Variable(i) coords = [ v.coefficient(x) for v in self.generators() ] max_coord = max(coords) min_coord = min(coords) box_max.append(max_coord) box_min.append(min_coord) return (tuple(box_min), tuple(box_max))