Skip to content

Commit bce7f9f

Browse files
committed
Update
1 parent 67480b7 commit bce7f9f

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

src/Utilities/distance_to_set.jl

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,20 @@ function _reshape(x::AbstractVector, set::MOI.PositiveSemidefiniteConeTriangle)
508508
return LinearAlgebra.Symmetric(X)
509509
end
510510

511+
"""
512+
distance_to_set(
513+
::ProjectionUpperBoundDistance,
514+
x::AbstractVector,
515+
set::Union{
516+
MOI.PositiveSemidefiniteConeSquare,
517+
MOI.PositiveSemidefiniteConeTriangle,
518+
},
519+
)
520+
521+
Let ``X`` be `x` reshaped into the appropriate matrix. The returned distance is
522+
``||X - Y||_2^2`` where ``Y`` is the eigen decomposition of ``X`` with negative
523+
eigen values removed.
524+
"""
511525
function distance_to_set(
512526
::ProjectionUpperBoundDistance,
513527
x::AbstractVector{T},
@@ -518,10 +532,11 @@ function distance_to_set(
518532
) where {T<:Real}
519533
_check_dimension(x, set)
520534
λ, U = LinearAlgebra.eigen(_reshape(x, set))
521-
if minimum(λ) >= 0
535+
if minimum(λ) >= zero(T)
522536
return 0.0
523537
end
524538
λ_negative = LinearAlgebra.Diagonal(min.(zero(T), λ))
525539
A = LinearAlgebra.Symmetric(U * λ_negative * U')
526-
return LinearAlgebra.norm(A, 2)
540+
# Σ A^2 is needed to match the definition of Utilities.set_dot
541+
return sum(Base.Fix2(^, 2), A)
527542
end

test/Utilities/distance_to_set.jl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ function _test_set(set, pairs...; mismatch = nothing)
3030
)
3131
end
3232
for (x, d) in pairs
33-
@test MOI.Utilities.distance_to_set(x, set) d
33+
@test (MOI.Utilities.distance_to_set(x, set), d; atol = 1e-12)
3434
end
3535
return
3636
end
@@ -313,7 +313,8 @@ function test_positivesemidefiniteconesquare()
313313
MOI.PositiveSemidefiniteConeSquare(2),
314314
[1.0, 0.0, 0.0, 1.0] => 0.0,
315315
[1.0, -1.0, -1.0, 1.0] => 0.0,
316-
[1.0, -2.0, -2.0, 1.0] => 1.0;
316+
[1.0, -2.0, -2.0, 1.0] => 1.0
317+
[1.0 1.1; 1.1 -2.3] => 2.6330532015051946;
317318
mismatch = [1.0],
318319
)
319320
return
@@ -324,7 +325,8 @@ function test_positivesemidefiniteconetriangle()
324325
MOI.PositiveSemidefiniteConeTriangle(2),
325326
[1.0, 0.0, 1.0] => 0.0,
326327
[1.0, -1.0, 1.0] => 0.0,
327-
[1.0, -2.0, 1.0] => 1.0;
328+
[1.0, -2.0, 1.0] => 1.0
329+
[1.0, 1.1, -2.3] => 2.6330532015051946;
328330
mismatch = [1.0],
329331
)
330332
return

0 commit comments

Comments
 (0)