]> gitweb.michael.orlitzky.com - dunshire.git/commitdiff
Add rough eigenvalue-based containment testing for SymmetricPSD.
authorMichael Orlitzky <michael@orlitzky.com>
Thu, 6 Oct 2016 18:53:15 +0000 (14:53 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Thu, 6 Oct 2016 18:53:15 +0000 (14:53 -0400)
src/dunshire/cones.py

index 18e6a1b9254f1675f56f1998396e13b0636153fc..4176f573bb68b462c2cff38cf133970e5159a20e 100644 (file)
@@ -4,7 +4,7 @@ SymmetricCone) supported by CVXOPT.
 """
 
 from cvxopt import matrix
-from matrices import norm
+from matrices import eigenvalues, norm
 
 class SymmetricCone:
     """
@@ -37,6 +37,7 @@ class SymmetricCone:
 
         self._dimension = dimension
 
+
     def __contains__(self, point):
         """
         Return whether or not ``point`` belongs to this cone.
@@ -333,6 +334,87 @@ class SymmetricPSD(SymmetricCone):
         return tpl.format(self.dimension())
 
 
+    def __contains__(self, point):
+        """
+        Return whether or not ``point`` belongs to this cone.
+
+        INPUT:
+
+        An instance of the ``cvxopt.base.matrix`` class having
+        dimensions ``(n,n)`` where ``n`` is the dimension of this cone.
+        Its type code must be 'd'.
+
+        EXAMPLES:
+
+            >>> K = SymmetricPSD(2)
+            >>> matrix([[1,0],[0,1]], tc='d') in K
+            True
+
+            >>> K = SymmetricPSD(2)
+            >>> matrix([[0,0],[0,0]], tc='d') in K
+            True
+
+            >>> K = SymmetricPSD(2)
+            >>> [[1,2],[2,3]] in K
+            Traceback (most recent call last):
+            ...
+            TypeError: the given point is not a cvxopt.base.matrix
+
+            >>> K = SymmetricPSD(3)
+            >>> matrix([[1,2],[3,4]], tc='d') in K
+            Traceback (most recent call last):
+            ...
+            TypeError: the given point has the wrong dimensions
+
+        """
+        if not isinstance(point, matrix):
+            raise TypeError('the given point is not a cvxopt.base.matrix')
+        if not point.size == (self.dimension(), self.dimension()):
+            raise TypeError('the given point has the wrong dimensions')
+        return all([e >= 0 for e in eigenvalues(point)])
+
+
+    def contains_strict(self, point):
+        """
+        Return whether or not ``point`` belongs to the interior
+        of this cone.
+
+        INPUT:
+
+        An instance of the ``cvxopt.base.matrix`` class having
+        dimensions ``(n,n)`` where ``n`` is the dimension of this cone.
+        Its type code must be 'd'.
+
+        EXAMPLES:
+
+            >>> K = SymmetricPSD(2)
+            >>> K.contains_strict(matrix([[1,0],[0,1]], tc='d'))
+            True
+
+            >>> K = SymmetricPSD(2)
+            >>> K.contains_strict(matrix([[0,0],[0,0]], tc='d'))
+            False
+
+            >>> K = SymmetricPSD(2)
+            >>> K.contains_strict([[1,2],[2,3]])
+            Traceback (most recent call last):
+            ...
+            TypeError: the given point is not a cvxopt.base.matrix
+
+            >>> K = SymmetricPSD(3)
+            >>> K.contains_strict(matrix([[1,2],[3,4]], tc='d'))
+            Traceback (most recent call last):
+            ...
+            TypeError: the given point has the wrong dimensions
+
+        """
+        if not isinstance(point, matrix):
+            raise TypeError('the given point is not a cvxopt.base.matrix')
+        if not point.size == (self.dimension(), self.dimension()):
+            raise TypeError('the given point has the wrong dimensions')
+        return all([e > 0 for e in eigenvalues(point)])
+
+
 class CartesianProduct(SymmetricCone):
     """
     A cartesian product of symmetric cones, which is itself a symmetric