X-Git-Url: https://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2Fdunshire%2Fcones.py;h=b1e07e9d6c607c823334aecb74ea774cb073bf35;hb=6ade9facc2e181f7aab20508007709f3bde7ca4b;hp=18e6a1b9254f1675f56f1998396e13b0636153fc;hpb=6460b7fcac2c8c28e5cd038a66451076e75ea5e8;p=dunshire.git diff --git a/src/dunshire/cones.py b/src/dunshire/cones.py index 18e6a1b..b1e07e9 100644 --- a/src/dunshire/cones.py +++ b/src/dunshire/cones.py @@ -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,134 @@ 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. + + EXAMPLES: + + >>> K = SymmetricPSD(2) + >>> matrix([[1,0],[0,1]]) in K + True + + >>> K = SymmetricPSD(2) + >>> matrix([[0,0],[0,0]]) in K + True + + >>> K = SymmetricPSD(3) + >>> matrix([[2,-1,0],[-1,2,-1],[0,-1,2]]) in K + True + + >>> 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]]) + >>> A in K + True + + >>> K = SymmetricPSD(5) + >>> A = matrix([[1,0,0,0,0], + ... [0,1,0,0,0], + ... [0,0,0,0,0], + ... [0,0,0,1,0], + ... [0,0,0,0,1]]) + >>> A 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]]) 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') + if not point.typecode == 'd': + point = matrix(point, (self.dimension(), self.dimension()), 'd') + 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]])) + True + + >>> K = SymmetricPSD(2) + >>> K.contains_strict(matrix([[0,0],[0,0]])) + False + + >>> K = SymmetricPSD(3) + >>> matrix([[2,-1,0],[-1,2,-1],[0,-1,2]]) in K + True + + >>> 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]]) + >>> A in K + True + + >>> K = SymmetricPSD(5) + >>> A = matrix([[1,0,0,0,0], + ... [0,1,0,0,0], + ... [0,0,0,0,0], + ... [0,0,0,1,0], + ... [0,0,0,0,1]]) + >>> K.contains_strict(A) + 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]])) + 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') + if not point.typecode == 'd': + point = matrix(point, (self.dimension(), self.dimension()), 'd') + return all([e > 0 for e in eigenvalues(point)]) + + class CartesianProduct(SymmetricCone): """ A cartesian product of symmetric cones, which is itself a symmetric