X-Git-Url: https://scm.cri.ensmp.fr/git/linpy.git/blobdiff_plain/49b7b1b00f4cbbf5110ec77e72df004764f2b4bd..66eaddd271c4beff5451fab2030389cd634e1385:/pypol/domains.py diff --git a/pypol/domains.py b/pypol/domains.py index be87ffb..b4780fc 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 +from .linexprs import Expression, Symbol __all__ = [ @@ -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,21 +152,26 @@ 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 - dims = list(dims) - symbols = list(self.symbols) + 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) - for dim in dims: - if dim in symbols: - first = symbols.index(dim) - islbset = libisl.isl_set_project_out(islset, libisl.isl_dim_set, first, 1) - symbols.__delitem__(first) - else: - islbset = libisl.isl_set_project_out(islset, libisl.isl_dim_set, 0, 0) - return Polyhedron._fromislset(islbset, symbols) - + # the trick is to walk symbols in reverse order, to avoid index updates + 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 + 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) @@ -244,6 +249,7 @@ class Domain: self._dimension = len(self._symbols) return self + @classmethod def _toislset(cls, polyhedra, symbols): polyhedron = polyhedra[0] islbset = polyhedron._toislbasicset(polyhedron.equalities,