X-Git-Url: https://scm.cri.ensmp.fr/git/linpy.git/blobdiff_plain/b0a30ee84ef3c6e9505a8f872a260db373fdb641..66eaddd271c4beff5451fab2030389cd634e1385:/pypol/domains.py diff --git a/pypol/domains.py b/pypol/domains.py index 9bb403e..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__ = [ @@ -138,10 +138,11 @@ class Domain: return self.complement() def simplify(self): - # see isl_set_coalesce, isl_set_detect_equalities, - # isl_set_remove_redundancies - # which ones? in which order? - raise NotImplementedError + #does not change anything in any of the examples + #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) def polyhedral_hull(self): # several types of hull are available @@ -151,10 +152,25 @@ class Domain: islbset = libisl.isl_set_polyhedral_hull(islset) return Polyhedron._fromislbasicset(islbset, self.symbols) - def project(self, symbols): - # not sure what isl_set_project_out actually does… - # use isl_set_drop_constraints_involving_dims instead? - raise NotImplementedError + 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 + 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 @@ -233,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, @@ -329,7 +346,6 @@ class Domain: def tosympy(self): raise NotImplementedError - def And(*domains): if len(domains) == 0: from .polyhedra import Universe