X-Git-Url: https://svn.cri.ensmp.fr/git/linpy.git/blobdiff_plain/62fbaa7984d8035cccc97555f1de3188e280e475..ddefc755b0637b08a0a2788be3a0678b52942f5b:/linpy/domains.py?ds=inline diff --git a/linpy/domains.py b/linpy/domains.py index 9fdc7d5..581a065 100644 --- a/linpy/domains.py +++ b/linpy/domains.py @@ -24,7 +24,7 @@ from fractions import Fraction from . import islhelper from .islhelper import mainctx, libisl -from .linexprs import LinExpr, Symbol, Rational +from .linexprs import LinExpr, Symbol from .geometry import GeometricObject, Point, Vector @@ -38,7 +38,7 @@ __all__ = [ class Domain(GeometricObject): """ A domain is a union of polyhedra. Unlike polyhedra, domains allow exact - computation of union and complementary operations. + computation of union, subtraction and complementary operations. A domain with a unique polyhedron is automatically subclassed as a Polyhedron instance. @@ -391,7 +391,10 @@ class Domain(GeometricObject): islset = libisl.isl_set_lexmax(islset) return self._fromislset(islset, self.symbols) - _RE_COORDINATE = re.compile(r'\((?P\-?\d+)\)(/(?P\d+))?') + if islhelper.isl_version >= '0.13': + _RE_COORDINATE = re.compile(r'\((?P\-?\d+)\)(/(?P\d+))?') + else: + _RE_COORDINATE = None def vertices(self): """ @@ -409,7 +412,7 @@ class Domain(GeometricObject): for vertex in vertices: expr = libisl.isl_vertex_get_expr(vertex) coordinates = [] - if islhelper.isl_version < '0.13': + if self._RE_COORDINATE is None: constraints = islhelper.isl_basic_set_constraints(expr) for constraint in constraints: constant = libisl.isl_constraint_get_constant_val(constraint) @@ -596,7 +599,7 @@ class Domain(GeometricObject): elif self.dimension == 3: return self._plot_3d(plot=plot, **kwargs) else: - raise ValueError('polyhedron must be 2 or 3-dimensional') + raise ValueError('domain must be 2 or 3-dimensional') def subs(self, symbol, expression=None): """ @@ -700,17 +703,17 @@ class Domain(GeometricObject): Create a domain from a string. Raise SyntaxError if the string is not properly formatted. """ - # remove curly brackets + # Remove curly brackets. string = cls._RE_BRACES.sub(r'', string) - # replace '=' by '==' + # Replace '=' by '=='. string = cls._RE_EQ.sub(r'\1==\2', string) - # replace 'and', 'or', 'not' + # Replace 'and', 'or', 'not'. string = cls._RE_AND.sub(r' & ', string) string = cls._RE_OR.sub(r' | ', string) string = cls._RE_NOT.sub(r' ~', string) - # add implicit multiplication operators, e.g. '5x' -> '5*x' + # Add implicit multiplication operators, e.g. '5x' -> '5*x'. string = cls._RE_NUM_VAR.sub(r'\1*\2', string) - # add parentheses to force precedence + # Add parentheses to force precedence. tokens = cls._RE_OPERATORS.split(string) for i, token in enumerate(tokens): if i % 2 == 0: @@ -734,7 +737,7 @@ class Domain(GeometricObject): @classmethod def fromsympy(cls, expr): """ - Create a domain from a sympy expression. + Create a domain from a SymPy expression. """ import sympy from .polyhedra import Lt, Le, Eq, Ne, Ge, Gt @@ -753,7 +756,7 @@ class Domain(GeometricObject): def tosympy(self): """ - Convert the domain to a sympy expression. + Convert the domain to a SymPy expression. """ import sympy polyhedra = [polyhedron.tosympy() for polyhedron in polyhedra] @@ -769,7 +772,6 @@ def And(*domains): return Universe else: return domains[0].intersection(*domains[1:]) -And.__doc__ = Domain.intersection.__doc__ def Or(*domains): """ @@ -780,11 +782,9 @@ def Or(*domains): return Empty else: return domains[0].union(*domains[1:]) -Or.__doc__ = Domain.union.__doc__ def Not(domain): """ Create the complementary domain of the domain given in argument. """ return ~domain -Not.__doc__ = Domain.complement.__doc__