def _init_from_Vrepresentation(self, vertices, rays, lines, minimize=True, verbose=False): """ Construct polyhedron from V-representation data. INPUT: - ``vertices`` -- list of point. Each point can be specified as any iterable container of :meth:`~sage.geometry.polyhedron.base.base_ring` elements. - ``rays`` -- list of rays. Each ray can be specified as any iterable container of :meth:`~sage.geometry.polyhedron.base.base_ring` elements. - ``lines`` -- list of lines. Each line can be specified as any iterable container of :meth:`~sage.geometry.polyhedron.base.base_ring` elements. - ``verbose`` -- boolean (default: ``False``). Whether to print verbose output for debugging purposes. EXAMPLES:: sage: p = Polyhedron(backend='ppl') sage: from sage.geometry.polyhedron.backend_ppl import Polyhedron_ppl sage: Polyhedron_ppl._init_from_Vrepresentation(p, [], [], []) """ gs = Generator_System() if vertices is None: vertices = [] for v in vertices: d = LCM_list([denominator(v_i) for v_i in v]) if d.is_one(): gs.insert(point(Linear_Expression(v, 0))) else: dv = [ d*v_i for v_i in v ] gs.insert(point(Linear_Expression(dv, 0), d)) if rays is None: rays = [] for r in rays: d = LCM_list([denominator(r_i) for r_i in r]) if d.is_one(): gs.insert(ray(Linear_Expression(r, 0))) else: dr = [ d*r_i for r_i in r ] gs.insert(ray(Linear_Expression(dr, 0))) if lines is None: lines = [] for l in lines: d = LCM_list([denominator(l_i) for l_i in l]) if d.is_one(): gs.insert(line(Linear_Expression(l, 0))) else: dl = [ d*l_i for l_i in l ] gs.insert(line(Linear_Expression(dl, 0))) if gs.empty(): self._ppl_polyhedron = C_Polyhedron(self.ambient_dim(), 'empty') else: self._ppl_polyhedron = C_Polyhedron(gs) self._init_Vrepresentation_from_ppl(minimize) self._init_Hrepresentation_from_ppl(minimize)
def contains(self, point_coordinates): r""" Test whether point is contained in the polytope. INPUT: - ``point_coordinates`` -- a list/tuple/iterable of rational numbers. The coordinates of the point. OUTPUT: Boolean. EXAMPLES:: sage: from sage.geometry.polyhedron.ppl_lattice_polytope import LatticePolytope_PPL sage: line = LatticePolytope_PPL((1,2,3), (-1,-2,-3)) sage: line.contains([0,0,0]) True sage: line.contains([1,0,0]) False """ p = C_Polyhedron(point(Linear_Expression(list(point_coordinates), 1))) is_included = Poly_Con_Relation.is_included() for c in self.constraints(): if not p.relation_with(c).implies(is_included): return False return True
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 ppl_zero_point(n): r""" Return the origin in R^n EXAMPLES:: sage: from surface_dynamics.misc.ppl_utils import ppl_zero_point # optional - pplpy sage: ppl_zero_point(3) # optional - pplpy point(0/1, 0/1, 0/1) sage: ppl_zero_point(5) # optional - pplpy point(0/1, 0/1, 0/1, 0/1, 0/1) """ z = ppl.point() z.set_space_dimension(n) return z
def hyperplanes(self): """ **Description:** Returns the inward-pointing normals to the hyperplanes that define the cone. **Arguments:** None. **Returns:** *(numpy.ndarray)* The list of inward-pointing normals to the hyperplanes that define the cone. **Example:** We construct two cones and find their hyperplane normals. ```python {3,6} c1 = Cone([[0,1],[1,1]]) c2 = Cone(hyperplanes=[[0,1],[1,1]]) c1.hyperplanes() # array([[ 1, 0], # [-1, 1]]) c2.hyperplanes() # array([[0, 1], # [1, 1]]) ``` """ if self._hyperplanes is not None: return np.array(self._hyperplanes) if self._ambient_dim >= 12 and len(self.rays()) != self._ambient_dim: print("Warning: This operation might take a while for d > ~12 " "and is likely impossible for d > ~18.") gs = ppl.Generator_System() vrs = [ppl.Variable(i) for i in range(self._ambient_dim)] gs.insert(ppl.point(0)) for r in self.extremal_rays(): gs.insert( ppl.ray(sum(r[i] * vrs[i] for i in range(self._ambient_dim)))) cone = ppl.C_Polyhedron(gs) hyperplanes = [] for cstr in cone.minimized_constraints(): hyperplanes.append(tuple(int(c) for c in cstr.coefficients())) if cstr.is_equality(): hyperplanes.append(tuple(-int(c) for c in cstr.coefficients())) self._hyperplanes = np.array(hyperplanes, dtype=int) return np.array(self._hyperplanes)
def ppl_convert(P): r""" Convert a Sage polyhedron to a ppl polyhedron EXAMPLES:: sage: from surface_dynamics.misc.ppl_utils import ppl_convert # optional - pplpy sage: P = ppl_convert(Polyhedron(vertices=[(0,1,0),(1,0,1)], rays=[(0,0,1),[3,2,1]])) # optional - pplpy sage: P.minimized_generators() # optional - pplpy Generator_System {ray(0, 0, 1), point(0/1, 1/1, 0/1), point(1/1, 0/1, 1/1), ray(3, 2, 1)} """ if isinstance(P, ppl.C_Polyhedron): return P gs = ppl.Generator_System() for v in P.vertices_list(): gs.insert(ppl.point(sum(j * ppl.Variable(i) for i, j in enumerate(v)))) for r in P.rays_list(): gs.insert(ppl.ray(sum(j * ppl.Variable(i) for i, j in enumerate(r)))) for l in P.lines_list(): gs.insert(ppl.line(sum(j * ppl.Variable(i) for i, j in enumerate(l)))) return ppl.C_Polyhedron(gs)
def ppl_convert(P): r""" Convert a Sage polyhedron to a ppl polyhedron EXAMPLES:: sage: from surface_dynamics.misc.ppl_utils import ppl_convert # optional - pplpy sage: P = ppl_convert(Polyhedron(vertices=[(0,1,0),(1,0,1)], rays=[(0,0,1),[3,2,1]])) # optional - pplpy sage: P.minimized_generators() # optional - pplpy Generator_System {ray(0, 0, 1), point(0/1, 1/1, 0/1), point(1/1, 0/1, 1/1), ray(3, 2, 1)} """ if isinstance(P, ppl.C_Polyhedron): return P gs = ppl.Generator_System() for v in P.vertices_list(): gs.insert(ppl.point(sum(int(j) * ppl.Variable(i) for i,j in enumerate(v)))) for r in P.rays_list(): gs.insert(ppl.ray(sum(int(j) * ppl.Variable(i) for i,j in enumerate(r)))) for l in P.lines_list(): gs.insert(ppl.line(sum(int(j) * ppl.Variable(i) for i,j in enumerate(l)))) return ppl.C_Polyhedron(gs)
def vertex_from_coordinates(coordinates): x = [Variable(i) for i in range(len(coordinates))] denom = 1e+10 p = point(sum(x[i] * int(coordinates[i] * denom) for i in range(len(coordinates))), denom) return Vertex(p)
def _init_from_Vrepresentation(self, vertices, rays, lines, minimize=True, verbose=False): """ Construct polyhedron from V-representation data. INPUT: - ``vertices`` -- list of point. Each point can be specified as any iterable container of :meth:`~sage.geometry.polyhedron.base.base_ring` elements. - ``rays`` -- list of rays. Each ray can be specified as any iterable container of :meth:`~sage.geometry.polyhedron.base.base_ring` elements. - ``lines`` -- list of lines. Each line can be specified as any iterable container of :meth:`~sage.geometry.polyhedron.base.base_ring` elements. - ``verbose`` -- boolean (default: ``False``). Whether to print verbose output for debugging purposes. EXAMPLES:: sage: p = Polyhedron(backend='ppl') sage: from sage.geometry.polyhedron.backend_ppl import Polyhedron_ppl sage: Polyhedron_ppl._init_from_Vrepresentation(p, [], [], []) """ gs = Generator_System() if vertices is None: vertices = [] for v in vertices: d = LCM_list([denominator(v_i) for v_i in v]) if d.is_one(): gs.insert(point(Linear_Expression(v, 0))) else: dv = [d * v_i for v_i in v] gs.insert(point(Linear_Expression(dv, 0), d)) if rays is None: rays = [] for r in rays: d = LCM_list([denominator(r_i) for r_i in r]) if d.is_one(): gs.insert(ray(Linear_Expression(r, 0))) else: dr = [d * r_i for r_i in r] gs.insert(ray(Linear_Expression(dr, 0))) if lines is None: lines = [] for l in lines: d = LCM_list([denominator(l_i) for l_i in l]) if d.is_one(): gs.insert(line(Linear_Expression(l, 0))) else: dl = [d * l_i for l_i in l] gs.insert(line(Linear_Expression(dl, 0))) if gs.empty(): self._ppl_polyhedron = C_Polyhedron(self.ambient_dim(), 'empty') else: self._ppl_polyhedron = C_Polyhedron(gs) self._init_Vrepresentation_from_ppl(minimize) self._init_Hrepresentation_from_ppl(minimize)
def fibration_generator(self, dim): """ Generate the lattice polytope fibrations. For the purposes of this function, a lattice polytope fiber is a sub-lattice polytope. Projecting the plane spanned by the subpolytope to a point yields another lattice polytope, the base of the fibration. INPUT: - ``dim`` -- integer. The dimension of the lattice polytope fiber. OUTPUT: A generator yielding the distinct lattice polytope fibers of given dimension. 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: list( p.fibration_generator(2) ) [A 2-dimensional lattice polytope in ZZ^4 with 3 vertices] """ assert self.is_full_dimensional() # "points" are the potential vertices of the fiber. They are # in the $codim$-skeleton of the polytope, which is contained # in the points that saturate at least $dim$ equations. points = [ p for p in self._integral_points_saturating() if len(p[1])>=dim ] points = sorted(points, key=lambda x:len(x[1])) # iterate over point combinations subject to all points being on one facet. def point_combinations_iterator(n, i0=0, saturated=None): for i in range(i0, len(points)): p, ieqs = points[i] if saturated is None: saturated_ieqs = ieqs else: saturated_ieqs = saturated.intersection(ieqs) if len(saturated_ieqs)==0: continue if n == 1: yield [i] else: for c in point_combinations_iterator(n-1, i+1, saturated_ieqs): yield [i] + c point_lines = [ line(Linear_Expression(p[0].list(),0)) for p in points ] origin = point() fibers = set() gs = Generator_System() for indices in point_combinations_iterator(dim): gs.clear() gs.insert(origin) for i in indices: gs.insert(point_lines[i]) plane = C_Polyhedron(gs) if plane.affine_dimension() != dim: continue plane.intersection_assign(self) if (not self.is_full_dimensional()) and (plane.affine_dimension() != dim): continue try: fiber = LatticePolytope_PPL(plane) except TypeError: # not a lattice polytope continue fiber_vertices = tuple(sorted(fiber.vertices())) if fiber_vertices not in fibers: yield fiber fibers.update([fiber_vertices])
def LatticePolytope_PPL(*args): """ Construct a new instance of the PPL-based lattice polytope class. EXAMPLES:: sage: from sage.geometry.polyhedron.ppl_lattice_polytope import LatticePolytope_PPL sage: LatticePolytope_PPL((0,0),(1,0),(0,1)) A 2-dimensional lattice polytope in ZZ^2 with 3 vertices sage: from ppl import point, Generator_System, C_Polyhedron, Linear_Expression, Variable sage: p = point(Linear_Expression([2,3],0)); p point(2/1, 3/1) sage: LatticePolytope_PPL(p) A 0-dimensional lattice polytope in ZZ^2 with 1 vertex sage: P = C_Polyhedron(Generator_System(p)); P A 0-dimensional polyhedron in QQ^2 defined as the convex hull of 1 point sage: LatticePolytope_PPL(P) A 0-dimensional lattice polytope in ZZ^2 with 1 vertex A ``TypeError`` is raised if the arguments do not specify a lattice polytope:: sage: from sage.geometry.polyhedron.ppl_lattice_polytope import LatticePolytope_PPL sage: LatticePolytope_PPL((0,0),(1/2,1)) Traceback (most recent call last): ... TypeError: unable to convert rational 1/2 to an integer sage: from ppl import point, Generator_System, C_Polyhedron, Linear_Expression, Variable sage: p = point(Linear_Expression([2,3],0), 5); p point(2/5, 3/5) sage: LatticePolytope_PPL(p) Traceback (most recent call last): ... TypeError: generator is not a lattice polytope generator sage: P = C_Polyhedron(Generator_System(p)); P A 0-dimensional polyhedron in QQ^2 defined as the convex hull of 1 point sage: LatticePolytope_PPL(P) Traceback (most recent call last): ... TypeError: polyhedron has non-integral generators """ polytope_class = LatticePolytope_PPL_class if len(args)==1 and isinstance(args[0], C_Polyhedron): polyhedron = args[0] polytope_class = _class_for_LatticePolytope(polyhedron.space_dimension()) if not all(p.is_point() and p.divisor() == 1 for p in polyhedron.generators()): raise TypeError('polyhedron has non-integral generators') return polytope_class(polyhedron) if len(args)==1 \ and isinstance(args[0], (list, tuple)) \ and isinstance(args[0][0], (list,tuple)): vertices = args[0] else: vertices = args gs = Generator_System() for v in vertices: if isinstance(v, Generator): if (not v.is_point()) or v.divisor() != 1: raise TypeError('generator is not a lattice polytope generator') gs.insert(v) else: gs.insert(point(Linear_Expression(v, 0))) if not gs.empty(): dim = next(iter(gs)).space_dimension() polytope_class = _class_for_LatticePolytope(dim) return polytope_class(gs)
import numpy as np from bellpolytope import BellPolytope from bellscenario import BellScenario from bellpolytopewithonewaycomm import BellPolytopeWithOneWayCommunication from ppl import Variable, Generator_System, C_Polyhedron, point from sequentialbellpolytope import SequentialBellPolytope from sequentialbellscenario import SequentialBellScenario if __name__ == '__main__': outputsAliceSeq = [[2, 2], [2, 2]] outputsBob = [2, 2] scenario = SequentialBellScenario(outputsAliceSeq, outputsBob) variables = [Variable(i) for i in range(len(scenario.getTuplesOfEvents()))] gs = Generator_System() for v in BellPolytopeWithOneWayCommunication( SequentialBellPolytope(scenario)).getGeneratorForVertices(): prob = v.getProbabilityList() gs.insert(point(sum(prob[i] * variables[i] for i in range(len(prob))))) poly = C_Polyhedron(gs) constraints = poly.constraints() for constraint in constraints: inequality = str(constraint.inhomogeneous_term().__float__()) + ' ' for coef in constraint.coefficients(): inequality = inequality + str(-coef.__float__()) + ' ' print(inequality)