From: Vivien Maisonneuve Date: Tue, 1 Jul 2014 16:47:54 +0000 (+0200) Subject: Alternative implementation of projection X-Git-Tag: 1.0~177 X-Git-Url: https://svn.cri.ensmp.fr/git/linpy.git/commitdiff_plain/4ae512f39c14835badbfab6fc1ce877f601d104e?ds=inline;hp=b47140c554b345a934698a04a2a8c0e64685ed17 Alternative implementation of projection --- diff --git a/pypol/domains.py b/pypol/domains.py index be87ffb..c844e55 100644 --- a/pypol/domains.py +++ b/pypol/domains.py @@ -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,17 @@ 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 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) diff --git a/pypol/tests/test_domains.py b/pypol/tests/test_domains.py index 692627c..55853fd 100644 --- a/pypol/tests/test_domains.py +++ b/pypol/tests/test_domains.py @@ -77,11 +77,11 @@ class TestDomain(unittest.TestCase): def test_polyhedral_hull(self): self.assertEqual(self.square1.polyhedral_hull(), self.hull) - def test_drop_dims(self): - self.assertEqual(self.square1.drop_dims('x'), self.dropped) - self.assertEqual(self.square1.drop_dims('x y'), self.universe) - self.assertEqual(self.universe.drop_dims(' '), self.universe) - self.assertEqual(self.empty.drop_dims(' '), Empty) + def test_project_out(self): + self.assertEqual(self.square1.project_out('x'), self.dropped) + self.assertEqual(self.square1.project_out('x y'), self.universe) + self.assertEqual(self.universe.project_out(' '), self.universe) + self.assertEqual(self.empty.project_out(' '), Empty) def test_simplify(self): self.assertEqual(self.universe.simplify(), self.universe)