X-Git-Url: https://svn.cri.ensmp.fr/git/linpy.git/blobdiff_plain/23787dd83c4990ca14e52ce3ddff256e26397cdc..491b8f0501c7b3d8b7c33d85a430845d245da5c9:/pypol/linear.py diff --git a/pypol/linear.py b/pypol/linear.py index d1aa882..c169049 100644 --- a/pypol/linear.py +++ b/pypol/linear.py @@ -1,7 +1,3 @@ -''' -VERY MESSY, made notes on where I will change things -''' - import functools import numbers import ctypes, ctypes.util @@ -162,7 +158,8 @@ 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): @@ -363,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 @@ -508,33 +502,53 @@ 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) #self should be value + 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_universe(libisl.isl_space_copy(space)) - copy = libisl.isl_basic_set_copy(bset) + 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)) - for value in self.equalities: - for value in self.equalities: - #need method to get expression value - if self._equalities: - value = self._equalities.method_get_value_from_expression() - ceq = libisl.isl_constraint_set_constant_val(ceq, value ) - #ceq = libisl.isl_constraint_set_coefficient_si(ceq, libisl.isl_set_dim, self.symbols(), value) - ''' cin = libisl.isl_inequality_alloc(libisl.isl_local_space_copy(ls)) - for item in self.inequalities: - for item in self.inequalities: - if isinstance(item, int): - cin = libisl.isl_constraint_set_constant_si(cin, item) - else: - cin = libisl.isl_constraint_set_coefficient_si(cin, libisl.isl_set_dim, self.symbols(), item) - ''' - bsetfinal = libisl.isl_basic_set_add_contraint(copy, ceq) - #bsetfinal = libisl.isl_basic_set_add_contraint(copy, cin) - string = libisl.isl_printer_print_basic_set(bsetfinal) - print(string) - return self + dict_ex = Expression().__dict__ + print(dict_ex) + ''' + 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) + bset = libisl.isl_basic_set_project_out(bset, libisl.isl_set_dim, 1, 1); + 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: + 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 = libisl.isl_printer_print_basic_set(bset) + print('here') + print(bset) + print(self) + #print(string) + return bset empty = eq(1, 1)