X-Git-Url: https://scm.cri.ensmp.fr/git/linpy.git/blobdiff_plain/556abe7f3b2c7e3985560f3e3cfb6f66bacc4122..29ed88d1a15d283ea6f3340a4dd97e8cc7c2d2d4:/pypol/domains.py diff --git a/pypol/domains.py b/pypol/domains.py index 6060dc9..9187081 100644 --- a/pypol/domains.py +++ b/pypol/domains.py @@ -5,7 +5,7 @@ import re from . import islhelper from .islhelper import mainctx, libisl, isl_set_basic_sets -from .linexprs import Expression, Symbol, symbolnames +from .linexprs import Expression __all__ = [ @@ -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): @@ -154,13 +154,16 @@ class Domain: def project_out(self, symbols): # use to remove certain variables - symbols = symbolnames(symbols) islset = self._toislset(self.polyhedra, self.symbols) - # the trick is to walk symbols in reverse order, to avoid index updates + n = 0 for index, symbol in reversed(list(enumerate(self.symbols))): if symbol in symbols: - islset = libisl.isl_set_project_out(islset, libisl.isl_dim_set, index, 1) - # remaining 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) @@ -241,7 +244,6 @@ class Domain: self._dimension = len(self._symbols) return self - @classmethod def _toislset(cls, polyhedra, symbols): polyhedron = polyhedra[0] islbset = polyhedron._toislbasicset(polyhedron.equalities, @@ -338,7 +340,6 @@ class Domain: def tosympy(self): raise NotImplementedError - def And(*domains): if len(domains) == 0: from .polyhedra import Universe