X-Git-Url: https://svn.cri.ensmp.fr/git/linpy.git/blobdiff_plain/8fe086b5ae03df5fadf1ec7de1aa41c0ace4a3ae..7f60c3d845f3035ce675bfe4cc0d2d01456013c6:/pypol/domains.py diff --git a/pypol/domains.py b/pypol/domains.py index bbb0946..74351fc 100644 --- a/pypol/domains.py +++ b/pypol/domains.py @@ -50,7 +50,7 @@ class Domain: symbols = set() for item in iterator: symbols.update(item.symbols) - return tuple(sorted(symbols)) + return tuple(sorted(symbols, key=lambda symbol: symbol.name)) @property def polyhedra(self): @@ -139,7 +139,7 @@ class Domain: def simplify(self): #does not change anything in any of the examples - #isl seems to do this naturally + #isl seems to do this naturally islset = self._toislset(self.polyhedra, self.symbols) islset = libisl.isl_set_remove_redundancies(islset) return self._fromislset(islset, self.symbols) @@ -152,29 +152,21 @@ class Domain: islbset = libisl.isl_set_polyhedral_hull(islset) return Polyhedron._fromislbasicset(islbset, self.symbols) - def drop_dims(self, dims): - # use to remove certain variables use isl_set_drop_constraints_involving_dims instead? - from .polyhedra import Polyhedron - n = 1 - dims = list(dims) - symbols = list(self.symbols) + def project_out(self, symbols): + # use to remove certain variables islset = self._toislset(self.polyhedra, self.symbols) - for dim in dims: - dim_index = dims.index(dim) - if dim in symbols: - first = symbols.index(dim) - try: - if symbols[first+1] is dims[dim_index+1]: #check if next value in symbols is same as next value in dims - n += 1 - islbset = libisl.isl_set_project_out(islset, libisl.isl_dim_set, first, n) - symbols.__delitem__(first) - except: - islbset = libisl.isl_set_project_out(islset, libisl.isl_dim_set, first, n) - symbols.__delitem__(first) - else: - islbset = libisl.isl_set_project_out(islset, libisl.isl_dim_set, 0, 0) - return Polyhedron._fromislset(islbset, symbols) - + n = 0 + for index, symbol in reversed(list(enumerate(self.symbols))): + if symbol in symbols: + n += 1 + elif n > 0: + islset = libisl.isl_set_project_out(islset, libisl.isl_dim_set, index + 1, n) + n = 0 + if n > 0: + islset = libisl.isl_set_project_out(islset, libisl.isl_dim_set, 0, n) + symbols = [symbol for symbol in self.symbols if symbol not in symbols] + return Domain._fromislset(islset, symbols) + def sample(self): from .polyhedra import Polyhedron islset = self._toislset(self.polyhedra, self.symbols) @@ -343,10 +335,26 @@ class Domain: @classmethod def fromsympy(cls, expr): - raise NotImplementedError + import sympy + from .polyhedra import Lt, Le, Eq, Ne, Ge, Gt + funcmap = { + sympy.And: And, sympy.Or: Or, sympy.Not: Not, + sympy.Lt: Lt, sympy.Le: Le, + sympy.Eq: Eq, sympy.Ne: Ne, + sympy.Ge: Ge, sympy.Gt: Gt, + } + if expr.func in funcmap: + args = [Domain.fromsympy(arg) for arg in expr.args] + return funcmap[expr.func](*args) + elif isinstance(expr, sympy.Expr): + return Expression.fromsympy(expr) + raise ValueError('non-domain expression: {!r}'.format(expr)) def tosympy(self): - raise NotImplementedError + import sympy + polyhedra = [polyhedron.tosympy() for polyhedron in polyhedra] + return sympy.Or(*polyhedra) + def And(*domains): if len(domains) == 0: