X-Git-Url: https://scm.cri.ensmp.fr/git/linpy.git/blobdiff_plain/c774b95a5e3c664d7adaeac83aace2b045d38a9f..556abe7f3b2c7e3985560f3e3cfb6f66bacc4122:/pypol/domains.py diff --git a/pypol/domains.py b/pypol/domains.py index 4a1f9aa..6060dc9 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, symbolnames __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,18 +152,18 @@ 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 + symbols = symbolnames(symbols) islset = self._toislset(self.polyhedra, self.symbols) - for dim in dims: - if dim in symbols: - num = symbols.index(dim) - islbset = libisl.isl_set_drop_constraints_involving_dims(islset, libisl.isl_dim_set, num, 1) - return Polyhedron._fromislset(islbset, self.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) @@ -241,6 +241,7 @@ class Domain: self._dimension = len(self._symbols) return self + @classmethod def _toislset(cls, polyhedra, symbols): polyhedron = polyhedra[0] islbset = polyhedron._toislbasicset(polyhedron.equalities, @@ -337,6 +338,7 @@ class Domain: def tosympy(self): raise NotImplementedError + def And(*domains): if len(domains) == 0: from .polyhedra import Universe