author Vivien Maisonneuve Fri, 11 Jul 2014 16:29:17 +0000 (18:29 +0200) committer Vivien Maisonneuve Fri, 11 Jul 2014 17:49:28 +0000 (19:49 +0200)
 pypol/coordinates.py patch | blob | history pypol/domains.py patch | blob | history pypol/geometry.py [new file with mode: 0644] patch | blob pypol/polyhedra.py patch | blob | history

index d392e37..ceab418 100644 (file)
@@ -4,6 +4,7 @@ import operator

from collections import OrderedDict, Mapping

from collections import OrderedDict, Mapping

+from .geometry import GeometricObject
from .linexprs import Symbol

from .linexprs import Symbol

@@ -78,7 +79,7 @@ class Coordinates:
yield symbol, func(coordinate1, coordinate2)

yield symbol, func(coordinate1, coordinate2)

-class Point(Coordinates):
+class Point(Coordinates, GeometricObject):
"""
This class represents points in space.
"""
"""
This class represents points in space.
"""
index 255c995..cd118e8 100644 (file)
@@ -6,6 +6,7 @@ from fractions import Fraction

from . import islhelper
from .islhelper import mainctx, libisl, isl_set_basic_sets

from . import islhelper
from .islhelper import mainctx, libisl, isl_set_basic_sets
+from .geometry import GeometricObject
from .coordinates import Point
from .linexprs import Expression, Symbol

from .coordinates import Point
from .linexprs import Expression, Symbol

@@ -17,7 +18,7 @@ __all__ = [

@functools.total_ordering

@functools.total_ordering
-class Domain:
+class Domain(GeometricObject):

__slots__ = (
'_polyhedra',

__slots__ = (
'_polyhedra',
@@ -28,14 +29,14 @@ class Domain:
def __new__(cls, *polyhedra):
from .polyhedra import Polyhedron
if len(polyhedra) == 1:
def __new__(cls, *polyhedra):
from .polyhedra import Polyhedron
if len(polyhedra) == 1:
-            polyhedron = polyhedra[0]
-            if isinstance(polyhedron, str):
-                return cls.fromstring(polyhedron)
-            elif isinstance(polyhedron, Polyhedron):
-                return polyhedron
+            argument = polyhedra[0]
+            if isinstance(argument, str):
+                return cls.fromstring(argument)
+            elif isinstance(argument, GeometricObject):
+                return argument.aspolyhedron()
else:
raise TypeError('argument must be a string '
else:
raise TypeError('argument must be a string '
-                    'or a Polyhedron instance')
+                    'or a GeometricObject instance')
else:
for polyhedron in polyhedra:
if not isinstance(polyhedron, Polyhedron):
else:
for polyhedron in polyhedra:
if not isinstance(polyhedron, Polyhedron):
@@ -154,6 +155,9 @@ class Domain:
islbset = libisl.isl_set_polyhedral_hull(islset)
return Polyhedron._fromislbasicset(islbset, self.symbols)

islbset = libisl.isl_set_polyhedral_hull(islset)
return Polyhedron._fromislbasicset(islbset, self.symbols)

+    def asdomain(self):
+        return self
+
def project(self, dims):
# use to remove certain variables
islset = self._toislset(self.polyhedra, self.symbols)
def project(self, dims):
# use to remove certain variables
islset = self._toislset(self.polyhedra, self.symbols)
diff --git a/pypol/geometry.py b/pypol/geometry.py
new file mode 100644 (file)
index 0000000..d1d6770
--- /dev/null
@@ -0,0 +1,25 @@
+
+from abc import ABC, abstractmethod, abstractproperty
+
+
+__all__ = [
+    'GeometricObject',
+]
+
+
+class GeometricObject(ABC):
+
+    @abstractproperty
+    def symbols(self):
+        pass
+
+    @property
+    def dimension(self):
+        return len(self.symbols)
+
+    @abstractmethod
+    def aspolyhedron(self):
+        pass
+
+    def asdomain(self):
+        return self.aspolyhedron()
index a08213d..2eaa7b5 100644 (file)
@@ -6,6 +6,7 @@ import numbers
from . import islhelper

from .islhelper import mainctx, libisl
from . import islhelper

from .islhelper import mainctx, libisl
+from .geometry import GeometricObject
from .coordinates import Point
from .linexprs import Expression, Symbol, Rational
from .domains import Domain
from .coordinates import Point
from .linexprs import Expression, Symbol, Rational
from .domains import Domain
@@ -33,11 +34,7 @@ class Polyhedron(Domain):
if inequalities is not None:
raise TypeError('too many arguments')
return cls.fromstring(equalities)
if inequalities is not None:
raise TypeError('too many arguments')
return cls.fromstring(equalities)
-        elif isinstance(equalities, Polyhedron):
-            if inequalities is not None:
-                raise TypeError('too many arguments')
-            return equalities
-        elif isinstance(equalities, Domain):
+        elif isinstance(equalities, GeometricObject):
if inequalities is not None:
raise TypeError('too many arguments')
return equalities.aspolyhedron()
if inequalities is not None:
raise TypeError('too many arguments')
return equalities.aspolyhedron()