From d1f749bdc31dcaef1dce62f303c1889f40ec0fe2 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Thu, 13 Oct 2016 19:14:26 -0400 Subject: [PATCH] Make sure SymmetricPSD doesn't contain asymmetric matrices. --- src/dunshire/cones.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/dunshire/cones.py b/src/dunshire/cones.py index 92a03a9..61feab4 100644 --- a/src/dunshire/cones.py +++ b/src/dunshire/cones.py @@ -384,10 +384,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 +409,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 +443,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)]) -- 2.44.2