Project out the sequence of symbols given in arguments, and return the
resulting domain.
"""
+ symbols = list(symbols)
+ for symbol in symbols:
+ if not isinstance(symbol, Symbol):
+ raise TypeError('symbols must be Symbol instances')
islset = self._toislset(self.polyhedra, self.symbols)
n = 0
for index, symbol in reversed(list(enumerate(self.symbols))):
Return the intersection of two or more domains as a new domain. As an
alternative, function And() can be used.
"""
- if len(others) == 0:
- return self
- symbols = self._xsymbols((self,) + others)
- islset1 = self._toislset(self.polyhedra, symbols)
+ result = self
for other in others:
- islset2 = other._toislset(other.polyhedra, symbols)
- islset1 = libisl.isl_set_intersect(islset1, islset2)
- return self._fromislset(islset1, symbols)
+ result &= other
+ return result
def __and__(self, other):
- return self.intersection(other)
+ if isinstance(other, Domain):
+ symbols = self._xsymbols([self, other])
+ islset1 = self._toislset(self.polyhedra, symbols)
+ islset2 = other._toislset(other.polyhedra, symbols)
+ islset = libisl.isl_set_intersect(islset1, islset2)
+ return self._fromislset(islset, symbols)
+ return NotImplemented
__and__.__doc__ = intersection.__doc__
def union(self, *others):
Return the union of two or more domains as a new domain. As an
alternative, function Or() can be used.
"""
- if len(others) == 0:
- return self
- symbols = self._xsymbols((self,) + others)
- islset1 = self._toislset(self.polyhedra, symbols)
+ result = self
for other in others:
- islset2 = other._toislset(other.polyhedra, symbols)
- islset1 = libisl.isl_set_union(islset1, islset2)
- return self._fromislset(islset1, symbols)
+ result |= other
+ return result
def __or__(self, other):
- return self.union(other)
+ if isinstance(other, Domain):
+ symbols = self._xsymbols([self, other])
+ islset1 = self._toislset(self.polyhedra, symbols)
+ islset2 = other._toislset(other.polyhedra, symbols)
+ islset = libisl.isl_set_union(islset1, islset2)
+ return self._fromislset(islset, symbols)
+ return NotImplemented
__or__.__doc__ = union.__doc__
def __add__(self, other):
- return self.union(other)
+ return self | other
__add__.__doc__ = union.__doc__
def difference(self, other):
"""
Return the difference of two domains as a new domain.
"""
- symbols = self._xsymbols([self, other])
- islset1 = self._toislset(self.polyhedra, symbols)
- islset2 = other._toislset(other.polyhedra, symbols)
- islset = libisl.isl_set_subtract(islset1, islset2)
- return self._fromislset(islset, symbols)
+ return self - other
def __sub__(self, other):
- return self.difference(other)
+ if isinstance(other, Domain):
+ symbols = self._xsymbols([self, other])
+ islset1 = self._toislset(self.polyhedra, symbols)
+ islset2 = other._toislset(other.polyhedra, symbols)
+ islset = libisl.isl_set_subtract(islset1, islset2)
+ return self._fromislset(islset, symbols)
+ return NotImplemented
__sub__.__doc__ = difference.__doc__
def lexmin(self):
islset = libisl.isl_set_lexmax(islset)
return self._fromislset(islset, self.symbols)
- _RE_COORDINATE = re.compile(r'\((?P<num>\-?\d+)\)(/(?P<den>\d+))?')
+ if islhelper.isl_version >= '0.13':
+ _RE_COORDINATE = re.compile(r'\((?P<num>\-?\d+)\)(/(?P<den>\d+))?')
+ else:
+ _RE_COORDINATE = None
def vertices(self):
"""
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)