X-Git-Url: https://scm.cri.ensmp.fr/git/linpy.git/blobdiff_plain/841943174bb4d3b602e8e055592d8b54d1bb086d..3ff02ec4a397d81d1019080a78198c454861c1e2:/pypol/isl.py diff --git a/pypol/isl.py b/pypol/isl.py index 758fb79..bbc8d13 100644 --- a/pypol/isl.py +++ b/pypol/isl.py @@ -1,5 +1,10 @@ +""" +note: for islpy +isl format: basic set: ("{[x, y] : x >= 0 and x < 5 and y >= 0 and y < x+4 }") +""" import ctypes, ctypes.util +import functools import math import numbers import operator @@ -15,6 +20,18 @@ libisl = ctypes.CDLL(ctypes.util.find_library('isl')) libisl.isl_printer_get_str.restype = ctypes.c_char_p +def _polymorphic_method(func): + @functools.wraps(func) + def wrapper(self, other): + if isinstance(other, Value): + return func(self, other) + if isinstance(other, numbers.Rational): + other = Value(self.context, other) + return func(self, other) + raise TypeError('operand should be a Value or a Rational') + return wrapper + + class Context: __slots__ = ('_ic') @@ -26,8 +43,9 @@ class Context: def _as_parameter_(self): return self._ic - def __del__(self): - libisl.isl_ctx_free(self) + #comment out so does not delete itself after being created + #def __del__(self): + # libisl.isl_ctx_free(self) def __eq__(self, other): if not isinstance(other, Context): @@ -130,34 +148,23 @@ class Value: def __bool__(self): return not bool(libisl.isl_val_is_zero(self)) - def _polymorphic(func): - @wraps(func) - def wrapper(self, other): - if isinstance(other, Value): - return func(self, other) - if isinstance(other, numbers.Rational): - other = Value(self.context, other) - return func(self, other) - raise TypeError('operand should be a Value or a Rational') - return wrapper - - @_polymorphic + @_polymorphic_method def __lt__(self, other): return bool(libisl.isl_val_lt(self, other)) - @_polymorphic + @_polymorphic_method def __le__(self, other): return bool(libisl.isl_val_le(self, other)) - @_polymorphic + @_polymorphic_method def __gt__(self, other): return bool(libisl.isl_val_gt(self, other)) - @_polymorphic + @_polymorphic_method def __ge__(self, other): return bool(libisl.isl_val_ge(self, other)) - @_polymorphic + @_polymorphic_method def __eq__(self, other): return bool(libisl.isl_val_eq(self, other)) @@ -192,7 +199,7 @@ class Value: val = libisl.isl_val_trunc(val) return self.__class__(self.context, self._ptr(val)) - @_polymorphic + @_polymorphic_method def __add__(self, other): val1 = libisl.isl_val_copy(self) val2 = libisl.isl_val_copy(other) @@ -201,7 +208,7 @@ class Value: __radd__ = __add__ - @_polymorphic + @_polymorphic_method def __sub__(self, other): val1 = libisl.isl_val_copy(self) val2 = libisl.isl_val_copy(other) @@ -210,7 +217,7 @@ class Value: __rsub__ = __sub__ - @_polymorphic + @_polymorphic_method def __mul__(self, other): val1 = libisl.isl_val_copy(self) val2 = libisl.isl_val_copy(other) @@ -219,7 +226,7 @@ class Value: __rmul__ = __mul__ - @_polymorphic + @_polymorphic_method def __truediv__(self, other): val1 = libisl.isl_val_copy(self) val2 = libisl.isl_val_copy(other)