X-Git-Url: https://svn.cri.ensmp.fr/git/linpy.git/blobdiff_plain/2849330c65ff7bbc0bfefddf0f062fce51bde7b9..bfa736f3de5624a931b75cba5e3626f41b9475c6:/pypol/linear.py?ds=sidebyside diff --git a/pypol/linear.py b/pypol/linear.py index 2b064d4..2ef0d2a 100644 --- a/pypol/linear.py +++ b/pypol/linear.py @@ -158,8 +158,9 @@ class Expression: constant = self.constant - other.constant return Expression(coefficients, constant) - __rsub__ = __sub__ - + def __rsub__(self, other): + return -(self - other) + @_polymorphic_method def __mul__(self, other): if other.isconstant(): @@ -296,7 +297,7 @@ class Expression: def constant(numerator=0, denominator=None): if denominator is None and isinstance(numerator, numbers.Rational): - return Expression(constant=numerator) + return Expression(constant=3) else: return Expression(constant=Fraction(numerator, denominator)) @@ -359,11 +360,8 @@ class Polyhedron: raise TypeError('non-integer constraint: ' '{} <= 0'.format(constraint)) self._inequalities.append(constraint) - print('in polyhedron') - #print(self.constraints()) self._bset = self.to_isl() - #print(self._bset) - return self + return self._bset @property @@ -400,7 +398,6 @@ class Polyhedron: s = [] for constraint in self.constraints(): s.append(constraint.symbols) - print(s) return s @property @@ -505,51 +502,41 @@ class Polyhedron: def fromstring(cls, string): raise NotImplementedError - def printer(self): - - ip = libisl.isl_printer_to_str(_CONTEXT) - ip = libisl.isl_printer_print_val(ip, self) - string = libisl.isl_printer_get_str(ip).decode() - print(string) - return string - - def to_isl(self): space = libisl.isl_space_set_alloc(_CONTEXT, 0, len(self.symbol_count())) bset = libisl.isl_basic_set_empty(libisl.isl_space_copy(space)) ls = libisl.isl_local_space_from_space(libisl.isl_space_copy(space)) ceq = libisl.isl_equality_alloc(libisl.isl_local_space_copy(ls)) cin = libisl.isl_inequality_alloc(libisl.isl_local_space_copy(ls)) - dict_ex = Expression().__dict__ + d = Expression().__dict__ #write expression values to dictionary in form {'_constant': value, '_coefficients': value} ''' if there are equalities/inequalities, take each constant and coefficient and add as a constraint to the basic set need to change the symbols method to a lookup table for the integer value for each letter that could be a symbol ''' - if self.equalities: - for _constant in dict_ex: - value = dict_ex.get('_constant') - ceq = libisl.isl_constraint_set_constant_val(ceq, value) - for _coefficients in dict_ex: - value_co = dict_ex.get('_coefficients') - if value_co: - ceq = libisl.isl_constraint_set_coefficient_si(ceq, libisl.isl_set_dim, self.symbols(), value_co) - bset = libisl.isl_set_add_constraint(bset, ceq) - - elif self.inequalities: - for _constant in dict_ex: - value = dict_ex.get('_constant') - cin = libisl.isl_constraint_set_constant_val(cin, value) - for _coefficients in dict_ex: - value_co = dict_ex.get('_coefficients') - if value_co: + if self._equalities: + if '_constant' in d: + value = d.get('_constant') + ceq = libisl.isl_constraint_set_constant_si(ceq, value) + if '_coefficients' in d: + value_co = d.get('_coefficients') + if value_co: #if dictionary not empty add coefficient as to constraint + ceq = libisl.isl_constraint_set_coefficient_si(ceq, libisl.isl_set_dim, self.symbols(), value_co) + bset = libisl.isl_set_add_constraint(bset, ceq) + + if self._inequalities: + if '_constant' in d: + value = d.get('_constant') + cin = libisl.isl_constraint_set_constant_si(cin, value) + if '_coefficients' in d: + value_co = d.get('_coefficients') + if value_co: #if dictionary not empty add coefficient as to constraint cin = libisl.isl_constraint_set_coefficient_si(cin, libisl.isl_set_dim, self.symbols(), value_co) - bset = libisl.isl_set_add_contraint(bset, cin) - string = self.printer() - #string = libisl.isl_printer_print_basic_set(bset) - print('here') + bset = libisl.isl_set_add_constraint(bset, cin) + ip = libisl.isl_printer_to_str(_CONTEXT) #create string printer + ip = libisl.isl_printer_print_set(ip, bset) #print set to printer + string = libisl.isl_printer_get_str(ip) #get string from printer print(string) - print(self) - return string + return bset empty = eq(1, 1)