]> CRI, Mines Paris - PSL - linpy.git/commitdiff
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 d392e37a177118f80b8d7d2cb3ce768da093c017..ceab418e33a90699aab78236f614781c27cf89b0 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 255c995b76654b92ea23ffcfe7b86c350d5e757f..cd118e8c8dd57b7c93a97dfaa376f5c2f99c138f 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 a08213dcde53eb14de5573363a98eefd3cfaa6eb..2eaa7b583803f1b1746a4abb169d0560ed9d4eba 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()