Add abstract class GeometricObject
authorVivien Maisonneuve <v.maisonneuve@gmail.com>
Fri, 11 Jul 2014 16:29:17 +0000 (18:29 +0200)
committerVivien Maisonneuve <v.maisonneuve@gmail.com>
Fri, 11 Jul 2014 17:49:28 +0000 (19:49 +0200)
pypol/coordinates.py
pypol/domains.py
pypol/geometry.py [new file with mode: 0644]
pypol/polyhedra.py

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()