X-Git-Url: https://svn.cri.ensmp.fr/git/linpy.git/blobdiff_plain/eb2eadbbeeaf00d7e2af18e6c8ee47602f96e528..d06ab92943ec2e10a2bd798ca7c1b5cea395bf34:/pypol/domains.py?ds=sidebyside diff --git a/pypol/domains.py b/pypol/domains.py index 12cf471..abc2d91 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,30 +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 = 0 - dims = sorted(dims) - symbols = sorted(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: - for dim in dims: - 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.remove(dim) - except: - islbset = libisl.isl_set_project_out(islset, libisl.isl_dim_set, first, 1) - symbols.remove(dim) - 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) @@ -349,6 +340,7 @@ class Domain: def tosympy(self): raise NotImplementedError + def And(*domains): if len(domains) == 0: from .polyhedra import Universe