From 3ff02ec4a397d81d1019080a78198c454861c1e2 Mon Sep 17 00:00:00 2001 From: Vivien Maisonneuve Date: Wed, 18 Jun 2014 17:57:37 +0200 Subject: [PATCH] Code cleanup --- pypol/isl.py | 23 ++++------- pypol/linear.py | 107 +++++++++++++----------------------------------- 2 files changed, 38 insertions(+), 92 deletions(-) diff --git a/pypol/isl.py b/pypol/isl.py index f1e63dc..bbc8d13 100644 --- a/pypol/isl.py +++ b/pypol/isl.py @@ -4,21 +4,22 @@ 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 import re -import functools - from decimal import Decimal from fractions import Fraction from functools import wraps + 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): @@ -30,6 +31,7 @@ def _polymorphic_method(func): raise TypeError('operand should be a Value or a Rational') return wrapper + class Context: __slots__ = ('_ic') @@ -40,8 +42,8 @@ class Context: @property def _as_parameter_(self): return self._ic - - #comment out so does not delete itself after being created + + #comment out so does not delete itself after being created #def __del__(self): # libisl.isl_ctx_free(self) @@ -120,19 +122,12 @@ class Value: numerator = libisl.isl_val_read_from_str(context, numerator) denominator = str(frac.denominator).encode() denominator = libisl.isl_val_read_from_str(context, denominator) - self._iv = libisl.isl_val_div(numerator, denominator) + self._iv = libisl.isl_val_div(numerator, denominator) return self - @property def _as_parameter_(self): return self._iv - - def symbols(self): - s = set() - for constraint in self.constraints(): - s.update(constraint.symbols) - yield from sorted(s) def __del__(self): libisl.isl_val_free(self) @@ -147,7 +142,7 @@ class Value: @property def denominator(self): if self._denominator is None: - raise ValueError('not a rational number') + raise ValueError('not a rational number') return self._denominator def __bool__(self): @@ -258,7 +253,7 @@ class Value: return bool(libisl.isl_val_is_infty(self) or libisl.isl_val_is_neginfty(self)) - def is_nan(self): + def is_nan(self): return bool(libisl.isl_val_is_nan(self)) def __str__(self): diff --git a/pypol/linear.py b/pypol/linear.py index 9584609..331d3af 100644 --- a/pypol/linear.py +++ b/pypol/linear.py @@ -1,15 +1,12 @@ +import ctypes, ctypes.util import functools import numbers -import json -import ctypes, ctypes.util -from pypol import isl -from . import isl, islhelper from fractions import Fraction, gcd -libisl = ctypes.CDLL(ctypes.util.find_library('isl')) +from . import isl, islhelper +from .isl import libisl, Context -libisl.isl_printer_get_str.restype = ctypes.c_char_p __all__ = [ 'Expression', @@ -19,16 +16,6 @@ __all__ = [ 'empty', 'universe' ] -ids = {} - -def get_ids(co): - if co in ids: - return ids.get(co) - else: - idd = len(ids) - ids[co] = idd - #print(ids) - return idd def _polymorphic_method(func): @functools.wraps(func) @@ -54,28 +41,6 @@ def _polymorphic_operator(func): raise TypeError('arguments must be linear expressions') return wrapper -class Context: - - __slots__ = ('_ic') - - def __init__(self): - self._ic = libisl.isl_ctx_alloc() - - @property - def _as_parameter_(self): - return self._ic - - #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): - return False - return self._ic == other._ic - - - class Expression: """ @@ -148,7 +113,6 @@ class Expression: return self.coefficient(symbol) return int(self.constant) - def symbol(self): if not self.issymbol(): raise ValueError('not a symbol: {}'.format(self)) @@ -193,7 +157,7 @@ class Expression: def __rsub__(self, other): return -(self - other) - + @_polymorphic_method def __mul__(self, other): if other.isconstant(): @@ -392,16 +356,15 @@ class Polyhedron: if value.denominator != 1: raise TypeError('non-integer constraint: ' '{} <= 0'.format(constraint)) - self._inequalities.append(constraint) - self._bset = self.to_isl() + self._inequalities.append(constraint) + self._bset = self._to_isl() #print(self._bset) #put this here just to test from isl method #from_isl = self.from_isl(self._bset) #print(from_isl) #rint(self) - return self - - + return self + @property def equalities(self): yield from self._equalities @@ -409,15 +372,14 @@ class Polyhedron: @property def inequalities(self): yield from self._inequalities - + @property def constant(self): return self._constant def isconstant(self): return len(self._coefficients) == 0 - - + def isempty(self): return bool(libisl.isl_basic_set_is_empty(self._bset)) @@ -425,13 +387,12 @@ class Polyhedron: yield from self.equalities yield from self.inequalities - def symbols(self): s = set() for constraint in self.constraints(): s.update(constraint.symbols()) return sorted(s) - + @property def dimension(self): return len(self.symbols()) @@ -442,7 +403,6 @@ class Polyhedron: return False else: return True - def __contains__(self, value): # is the value in the polyhedron? @@ -474,9 +434,9 @@ class Polyhedron: # test whether every element in other is in the polyhedron for value in other: if value == self.constraints(): - return True + return True else: - return False + return False raise NotImplementedError def __ge__(self, other): @@ -533,25 +493,20 @@ class Polyhedron: @classmethod def fromstring(cls, string): raise NotImplementedError - - def _symbolunion(self, *others): - print(self) + + def _symbolunion(self, *others): symbols = set(self.symbols()) for other in others: symbols.update(other.symbols()) return sorted(symbols) - - def to_isl(self, symbols=None): + + def _to_isl(self, symbols=None): if symbols is None: symbols = self.symbols() - print(symbols) - print('>>>', self) - print('eq:', list(self.equalities)) - print('ineq:', list(self.inequalities)) num_coefficients = len(symbols) ctx = Context() space = libisl.isl_space_set_alloc(ctx, 0, num_coefficients) - bset = libisl.isl_basic_set_universe(libisl.isl_space_copy(space)) + bset = libisl.isl_basic_set_universe(libisl.isl_space_copy(space)) ls = libisl.isl_local_space_from_space(space) ceq = libisl.isl_equality_alloc(libisl.isl_local_space_copy(ls)) cin = libisl.isl_inequality_alloc(libisl.isl_local_space_copy(ls)) @@ -565,9 +520,8 @@ class Polyhedron: for eq in coeff_eq: num = coeff_eq.get(eq) iden = symbols.index(eq) - print('id of var {} is {}, coeff is {}'.format(eq, iden, num)) - ceq = libisl.isl_constraint_set_coefficient_si(ceq, islhelper.isl_dim_set, iden, num) #use 3 for type isl_dim_set - bset = libisl.isl_basic_set_add_constraint(bset, ceq) + ceq = libisl.isl_constraint_set_coefficient_si(ceq, islhelper.isl_dim_set, iden, num) #use 3 for type isl_dim_set + bset = libisl.isl_basic_set_add_constraint(bset, ceq) if list(self.inequalities): #check if any inequalities exist for ineq in self.inequalities: coeff_in = dict(ineq.coefficients) @@ -577,17 +531,15 @@ class Polyhedron: for ineq in coeff_in: num = coeff_in.get(ineq) iden = symbols.index(ineq) - print('id of var {} is {}, coeff is {}'.format(ineq, iden, num)) - cin = libisl.isl_constraint_set_coefficient_si(cin, islhelper.isl_dim_set, iden, num) #use 3 for type isl_dim_set - bset = libisl.isl_basic_set_add_constraint(bset, cin) + cin = libisl.isl_constraint_set_coefficient_si(cin, islhelper.isl_dim_set, iden, num) #use 3 for type isl_dim_set + bset = libisl.isl_basic_set_add_constraint(bset, cin) ip = libisl.isl_printer_to_str(ctx) #create string printer - ip = libisl.isl_printer_print_basic_set(ip, bset) #print basic set to printer + ip = libisl.isl_printer_print_basic_set(ip, bset) #print basic set to printer string = libisl.isl_printer_get_str(ip) #get string from printer - string = str(string.decode()) + string = str(string.decode()) print(string) return bset - - + def from_isl(self, bset): '''takes basic set in isl form and puts back into python version of polyhedron isl example code gives isl form as: @@ -596,15 +548,14 @@ class Polyhedron: b'{ [i0] : 1 = 0 }' ''' #bset = self if self._equalities: - constraints = libisl.isl_basic_set_equalities_matrix(bset, 3) + constraints = libisl.isl_basic_set_equalities_matrix(bset, 3) elif self._inequalities: - constraints = libisl.isl_basic_set_inequalities_matrix(bset, 3) + constraints = libisl.isl_basic_set_inequalities_matrix(bset, 3) print(constraints) return constraints -#empty = eq(0,1) -empty = None -universe = None +empty = None #eq(0,1) +universe = None #Polyhedron() if __name__ == '__main__': ex1 = Expression(coefficients={'a': 1, 'x': 2}, constant=2) -- 2.20.1