X-Git-Url: https://scm.cri.ensmp.fr/git/linpy.git/blobdiff_plain/d6444456ceaeed6fcf1d44386edefb5b1fb8ec66..29ed88d1a15d283ea6f3340a4dd97e8cc7c2d2d4:/pypol/domains.py diff --git a/pypol/domains.py b/pypol/domains.py index 6b47fe8..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 +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,21 +154,16 @@ class Domain: def project_out(self, symbols): # use to remove certain variables - if isinstance(symbols, str): - symbols = symbols.replace(',', ' ').split() - else: - symbols = list(symbols) - for i, symbol in enumerate(symbols): - if isinstance(symbol, Symbol): - symbols[i] = symbol.name - elif not isinstance(symbol, str): - raise TypeError('symbols must be strings or Symbol instances') 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)