]> gitweb.michael.orlitzky.com - dunshire.git/blobdiff - src/dunshire/cones.py
Clean up a bit of the import mess.
[dunshire.git] / src / dunshire / cones.py
index 870a882423e6180ea0e4256e5f7c05f17aac6d4f..7fc8bf94993e4df86b2f57c2e6b6d6aefa65d8c4 100644 (file)
@@ -4,8 +4,9 @@ Class definitions for all of the symmetric cones (and their superclass,
 """
 
 from cvxopt import matrix
-from matrices import eigenvalues, norm
-import options
+
+from .matrices import eigenvalues, norm
+from . import options
 
 class SymmetricCone:
     """
@@ -384,10 +385,10 @@ class SymmetricPSD(SymmetricCone):
 
             >>> K = SymmetricPSD(5)
             >>> A = matrix([[5,4,3,2,1],
-            ...            [4,5,4,3,2],
-            ...            [3,4,5,4,3],
-            ...            [2,3,4,5,4],
-            ...            [1,2,3,4,5]])
+            ...             [4,5,4,3,2],
+            ...             [3,4,5,4,3],
+            ...             [2,3,4,5,4],
+            ...             [1,2,3,4,5]])
             >>> A in K
             True
 
@@ -409,8 +410,16 @@ class SymmetricPSD(SymmetricCone):
         However, this matrix has a negative eigenvalue:
 
            >>> K = SymmetricPSD(2)
-           >>> A = matrix([[1,-2],
-           ...             [-2,1]])
+           >>> A = matrix([[ 1, -2],
+           ...             [-2,  1]])
+           >>> A in K
+           False
+
+        An asymmetric cone with positive eigenvalues is not in the cone:
+
+           >>> K = SymmetricPSD(2)
+           >>> A = matrix([[10, 2],
+           ...             [4,  8]])
            >>> A in K
            False
 
@@ -435,6 +444,9 @@ class SymmetricPSD(SymmetricCone):
             raise TypeError('the given point has the wrong dimensions')
         if not point.typecode == 'd':
             point = matrix(point, (self.dimension(), self.dimension()), 'd')
+        if not norm(point - point.trans()) < options.ABS_TOL:
+            # It's not symmetric.
+            return False
         return all([e > -options.ABS_TOL for e in eigenvalues(point)])
 
 
@@ -539,7 +551,7 @@ class CartesianProduct(SymmetricCone):
             TypeError: the given point has the wrong dimensions
 
         """
-        return all([p in f for (p,f) in zip(point, self.factors())])
+        return all([p in f for (p, f) in zip(point, self.factors())])