From 263bac8820cb20e1c7a2f169553373d27302daba Mon Sep 17 00:00:00 2001 From: Oskar Laverny Date: Fri, 2 Jul 2021 19:56:08 +0200 Subject: [PATCH 1/5] small change to make it work --- src/atoms/second_order_cone/quadform.jl | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/atoms/second_order_cone/quadform.jl b/src/atoms/second_order_cone/quadform.jl index 1dd325d10..7cd5d8269 100644 --- a/src/atoms/second_order_cone/quadform.jl +++ b/src/atoms/second_order_cone/quadform.jl @@ -9,17 +9,15 @@ function quadform(x::AbstractExpr, A::Value) if !issymmetric(A) error("Quadratic form only defined for symmetric matrices") end - V = eigvals(Symmetric(Matrix(A))) - - if all(V .>= 0) + if isposdef(A) factor = 1 - elseif all(V .<= 0) + elseif isposdef(.-A) factor = -1 else error("Quadratic forms supported only for semidefinite matrices") end - P = real(sqrt(Matrix(factor * A))) + P = real(sqrt(Hermitian(factor * A))) return factor * square(norm2(P * x)) end From 30bbcf633e4057261ab5eb25b4d8164144c597ce Mon Sep 17 00:00:00 2001 From: Oskar Laverny Date: Sat, 3 Jul 2021 00:30:33 +0200 Subject: [PATCH 2/5] Update src/atoms/second_order_cone/quadform.jl Co-authored-by: Eric Hanson <5846501+ericphanson@users.noreply.github.com> --- src/atoms/second_order_cone/quadform.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/atoms/second_order_cone/quadform.jl b/src/atoms/second_order_cone/quadform.jl index 7cd5d8269..bd9e9cafb 100644 --- a/src/atoms/second_order_cone/quadform.jl +++ b/src/atoms/second_order_cone/quadform.jl @@ -6,8 +6,8 @@ function quadform(x::AbstractExpr, A::Value) if length(size(A)) != 2 || size(A, 1) != size(A, 2) error("Quadratic form only takes square matrices") end - if !issymmetric(A) - error("Quadratic form only defined for symmetric matrices") + if !ishermitian(A) + error("Quadratic form only defined for Hermitian matrices") end if isposdef(A) factor = 1 From 93ce51b8238ca364a772a633e12ab8db78a315ae Mon Sep 17 00:00:00 2001 From: Oskar Laverny Date: Sat, 3 Jul 2021 00:30:58 +0200 Subject: [PATCH 3/5] Update src/atoms/second_order_cone/quadform.jl Co-authored-by: Eric Hanson <5846501+ericphanson@users.noreply.github.com> --- src/atoms/second_order_cone/quadform.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/atoms/second_order_cone/quadform.jl b/src/atoms/second_order_cone/quadform.jl index bd9e9cafb..9922dcbb3 100644 --- a/src/atoms/second_order_cone/quadform.jl +++ b/src/atoms/second_order_cone/quadform.jl @@ -17,7 +17,7 @@ function quadform(x::AbstractExpr, A::Value) error("Quadratic forms supported only for semidefinite matrices") end - P = real(sqrt(Hermitian(factor * A))) + P = sqrt(Hermitian(factor * A)) return factor * square(norm2(P * x)) end From 48796c54526b3c741fbf0f3aad121e63eb6b3e46 Mon Sep 17 00:00:00 2001 From: Oskar Laverny Date: Mon, 5 Jul 2021 10:14:08 +0200 Subject: [PATCH 4/5] Adding a test --- src/problem_depot/problems/socp.jl | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/problem_depot/problems/socp.jl b/src/problem_depot/problems/socp.jl index 8539fafa5..1989eb2d7 100644 --- a/src/problem_depot/problems/socp.jl +++ b/src/problem_depot/problems/socp.jl @@ -267,6 +267,18 @@ end @test evaluate(H) ≈ Hval atol=atol rtol=rtol end + # https://github.com/jump-dev/Convex.jl/pull/444 + x = Variable(3) + a,b,c,d,e,f = rand(6) + M = [2 a-b*im c-d*im; + a+b*im 2 e-f*im + c+d*im e+f*im 2] + y = rand(3) + p = minimize(quadform(x-y,M); numeric_type = T) + if test + @test evaluate(x) ≈ y + end + end @add_problem socp function socp_huber_atom(handle_problem!, ::Val{test}, atol, rtol, ::Type{T}) where {T, test} From cb3c2fd452fd3cc671a603a38ca8d653991c18d3 Mon Sep 17 00:00:00 2001 From: Oskar Laverny Date: Mon, 5 Jul 2021 18:53:58 +0200 Subject: [PATCH 5/5] Update src/problem_depot/problems/socp.jl Co-authored-by: Eric Hanson <5846501+ericphanson@users.noreply.github.com> --- src/problem_depot/problems/socp.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/problem_depot/problems/socp.jl b/src/problem_depot/problems/socp.jl index 1989eb2d7..29d2aeaf8 100644 --- a/src/problem_depot/problems/socp.jl +++ b/src/problem_depot/problems/socp.jl @@ -275,8 +275,9 @@ end c+d*im e+f*im 2] y = rand(3) p = minimize(quadform(x-y,M); numeric_type = T) + handle_problem!(p) if test - @test evaluate(x) ≈ y + @test evaluate(x) ≈ y atol=atol rtol=rtol end end