X-Git-Url: https://scm.cri.mines-paristech.fr/git/linpy.git/blobdiff_plain/b2931230a184025bdb6006bfe48c9b1dc18dc351..d585b06ccf67b2837519f4b48c6800dcdb924d9d:/linpy/domains.py diff --git a/linpy/domains.py b/linpy/domains.py index 1f7a190..7f4fa65 100644 --- a/linpy/domains.py +++ b/linpy/domains.py @@ -23,14 +23,16 @@ import math from fractions import Fraction from . import islhelper -from .islhelper import mainctx, libisl -from .linexprs import LinExpr, Symbol from .geometry import GeometricObject, Point, Vector +from .islhelper import libisl +from .linexprs import LinExpr, Symbol __all__ = [ + 'And', 'Domain', - 'And', 'Or', 'Not', + 'Not', + 'Or', ] @@ -84,7 +86,7 @@ class Domain(GeometricObject): return argument.aspolyhedron() else: raise TypeError('argument must be a string ' - 'or a GeometricObject instance') + 'or a GeometricObject instance') else: for polyhedron in polyhedra: if not isinstance(polyhedron, Polyhedron): @@ -235,7 +237,7 @@ class Domain(GeometricObject): Return an equivalent domain, whose polyhedra are disjoint. """ islset = self._toislset(self.polyhedra, self.symbols) - islset = libisl.isl_set_make_disjoint(mainctx, islset) + islset = libisl.isl_set_make_disjoint(islset) return self._fromislset(islset, self.symbols) def coalesce(self): @@ -289,11 +291,12 @@ class Domain(GeometricObject): if symbol in symbols: n += 1 elif n > 0: - islset = libisl.isl_set_project_out(islset, - libisl.isl_dim_set, index + 1, n) + islset = libisl.isl_set_project_out( + islset, libisl.isl_dim_set, index + 1, n) n = 0 if n > 0: - islset = libisl.isl_set_project_out(islset, libisl.isl_dim_set, 0, n) + islset = libisl.isl_set_project_out( + islset, libisl.isl_dim_set, 0, n) symbols = [symbol for symbol in self.symbols if symbol not in symbols] return Domain._fromislset(islset, symbols) @@ -309,8 +312,8 @@ class Domain(GeometricObject): raise ValueError('domain must be non-empty') point = {} for index, symbol in enumerate(self.symbols): - coordinate = libisl.isl_point_get_coordinate_val(islpoint, - libisl.isl_dim_set, index) + coordinate = libisl.isl_point_get_coordinate_val( + islpoint, libisl.isl_dim_set, index) coordinate = islhelper.isl_val_to_int(coordinate) point[symbol] = coordinate libisl.isl_point_free(islpoint) @@ -402,36 +405,38 @@ class Domain(GeometricObject): Return the vertices of the domain, as a list of rational instances of Point. """ - from .polyhedra import Polyhedron if not self.isbounded(): raise ValueError('domain must be bounded') islbset = self._toislbasicset(self.equalities, self.inequalities, - self.symbols) - vertices = libisl.isl_basic_set_compute_vertices(islbset); + self.symbols) + vertices = libisl.isl_basic_set_compute_vertices(islbset) vertices = islhelper.isl_vertices_vertices(vertices) points = [] for vertex in vertices: - expr = libisl.isl_vertex_get_expr(vertex) + expression = libisl.isl_vertex_get_expr(vertex) coordinates = [] if self._RE_COORDINATE is None: - constraints = islhelper.isl_basic_set_constraints(expr) + constraints = islhelper.isl_basic_set_constraints(expression) for constraint in constraints: - constant = libisl.isl_constraint_get_constant_val(constraint) + constant = libisl.isl_constraint_get_constant_val( + constraint) constant = islhelper.isl_val_to_int(constant) for index, symbol in enumerate(self.symbols): - coefficient = libisl.isl_constraint_get_coefficient_val(constraint, - libisl.isl_dim_set, index) + coefficient = \ + libisl.isl_constraint_get_coefficient_val( + constraint, libisl.isl_dim_set, index) coefficient = islhelper.isl_val_to_int(coefficient) if coefficient != 0: coordinate = -Fraction(constant, coefficient) coordinates.append((symbol, coordinate)) else: - string = islhelper.isl_multi_aff_to_str(expr) + string = islhelper.isl_multi_aff_to_str(expression) matches = self._RE_COORDINATE.finditer(string) for symbol, match in zip(self.symbols, matches): numerator = int(match.group('num')) denominator = match.group('den') - denominator = 1 if denominator is None else int(denominator) + denominator = \ + 1 if denominator is None else int(denominator) coordinate = Fraction(numerator, denominator) coordinates.append((symbol, coordinate)) points.append(Point(coordinates)) @@ -440,20 +445,19 @@ class Domain(GeometricObject): def points(self): """ Return the integer points of a bounded domain, as a list of integer - instances of Point. If the domain is not bounded, a ValueError exception - is raised. + instances of Point. If the domain is not bounded, a ValueError + exception is raised. """ if not self.isbounded(): raise ValueError('domain must be bounded') - from .polyhedra import Universe, Eq islset = self._toislset(self.polyhedra, self.symbols) islpoints = islhelper.isl_set_points(islset) points = [] for islpoint in islpoints: coordinates = {} for index, symbol in enumerate(self.symbols): - coordinate = libisl.isl_point_get_coordinate_val(islpoint, - libisl.isl_dim_set, index) + coordinate = libisl.isl_point_get_coordinate_val( + islpoint, libisl.isl_dim_set, index) coordinate = islhelper.isl_val_to_int(coordinate) coordinates[symbol] = coordinate points.append(Point(coordinates)) @@ -610,7 +614,7 @@ class Domain(GeometricObject): similar to LinExpr.subs(). """ polyhedra = [polyhedron.subs(symbol, expression) - for polyhedron in self.polyhedra] + for polyhedron in self.polyhedra] return Domain(*polyhedra) @classmethod @@ -638,12 +642,12 @@ class Domain(GeometricObject): @classmethod def _toislset(cls, polyhedra, symbols): polyhedron = polyhedra[0] - islbset = polyhedron._toislbasicset(polyhedron.equalities, - polyhedron.inequalities, symbols) + islbset = polyhedron._toislbasicset( + polyhedron.equalities, polyhedron.inequalities, symbols) islset1 = libisl.isl_set_from_basic_set(islbset) for polyhedron in polyhedra[1:]: - islbset = polyhedron._toislbasicset(polyhedron.equalities, - polyhedron.inequalities, symbols) + islbset = polyhedron._toislbasicset( + polyhedron.equalities, polyhedron.inequalities, symbols) islset2 = libisl.isl_set_from_basic_set(islbset) islset1 = libisl.isl_set_union(islset1, islset2) return islset1 @@ -729,14 +733,8 @@ class Domain(GeometricObject): strings = [repr(polyhedron) for polyhedron in self.polyhedra] return 'Or({})'.format(', '.join(strings)) - def _repr_latex_(self): - strings = [] - for polyhedron in self.polyhedra: - strings.append('({})'.format(polyhedron._repr_latex_().strip('$'))) - return '${}$'.format(' \\vee '.join(strings)) - @classmethod - def fromsympy(cls, expr): + def fromsympy(cls, expression): """ Create a domain from a SymPy expression. """ @@ -748,19 +746,19 @@ class Domain(GeometricObject): sympy.Eq: Eq, sympy.Ne: Ne, sympy.Ge: Ge, sympy.Gt: Gt, } - if expr.func in funcmap: - args = [Domain.fromsympy(arg) for arg in expr.args] - return funcmap[expr.func](*args) - elif isinstance(expr, sympy.Expr): - return LinExpr.fromsympy(expr) - raise ValueError('non-domain expression: {!r}'.format(expr)) + if expression.func in funcmap: + args = [Domain.fromsympy(arg) for arg in expression.args] + return funcmap[expression.func](*args) + elif isinstance(expression, sympy.Expr): + return LinExpr.fromsympy(expression) + raise ValueError('non-domain expression: {!r}'.format(expression)) def tosympy(self): """ Convert the domain to a SymPy expression. """ import sympy - polyhedra = [polyhedron.tosympy() for polyhedron in polyhedra] + polyhedra = [polyhedron.tosympy() for polyhedron in self.polyhedra] return sympy.Or(*polyhedra) @@ -774,6 +772,7 @@ def And(*domains): else: return domains[0].intersection(*domains[1:]) + def Or(*domains): """ Create the union domain of the domains given in arguments. @@ -784,6 +783,7 @@ def Or(*domains): else: return domains[0].union(*domains[1:]) + def Not(domain): """ Create the complementary domain of the domain given in argument.