From 9e7dcc8101357516bad9e4250ed388e96fd1cdb4 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Thu, 29 Jan 2026 16:56:56 +1300 Subject: [PATCH 1/2] [Utilities] fix support for complex values in Indicator distance_to_set --- src/Utilities/distance_to_set.jl | 13 +++++++------ test/Utilities/distance_to_set.jl | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/Utilities/distance_to_set.jl b/src/Utilities/distance_to_set.jl index 7039d818cb..4591f9e0c2 100644 --- a/src/Utilities/distance_to_set.jl +++ b/src/Utilities/distance_to_set.jl @@ -613,13 +613,14 @@ function distance_to_set( distance::ProjectionUpperBoundDistance, x::AbstractVector{T}, set::MOI.Indicator{MOI.ACTIVATE_ON_ONE}, -) where {T<:Real} +) where {T<:Number} _check_dimension(x, set) + return min( # Distance of x[1] from 0 abs(x[1]), # Distance of x[1] from 1 + distance to set - sqrt((1 - x[1])^2 + distance_to_set(distance, x[2], set.set)^2), + sqrt(abs(1 - x[1])^2 + distance_to_set(distance, x[2], set.set)^2), ) end @@ -627,13 +628,13 @@ function distance_to_set( distance::ProjectionUpperBoundDistance, x::AbstractVector{T}, set::MOI.Indicator{MOI.ACTIVATE_ON_ZERO}, -) where {T} +) where {T<:Number} _check_dimension(x, set) return min( # Distance of x[1] from 1 abs(one(T) - x[1]), # Distance of x[1] from 0 + distance to set - sqrt(x[1]^2 + distance_to_set(distance, x[2], set.set)^2), + sqrt(abs(x[1])^2 + distance_to_set(distance, x[2], set.set)^2), ) end @@ -647,7 +648,7 @@ function distance_to_set( ::ProjectionUpperBoundDistance, x::AbstractVector{T}, set::MOI.NormNuclearCone, -) where {T} +) where {T<:Real} _check_dimension(x, set) X = reshape(x[2:end], set.row_dim, set.column_dim) return max(sum(LinearAlgebra.svdvals(X)) - x[1], zero(T)) @@ -663,7 +664,7 @@ function distance_to_set( ::ProjectionUpperBoundDistance, x::AbstractVector{T}, set::MOI.NormSpectralCone, -) where {T} +) where {T<:Real} _check_dimension(x, set) X = reshape(x[2:end], set.row_dim, set.column_dim) return max(maximum(LinearAlgebra.svdvals(X)) - x[1], zero(T)) diff --git a/test/Utilities/distance_to_set.jl b/test/Utilities/distance_to_set.jl index 49739e90b7..c9499b1895 100644 --- a/test/Utilities/distance_to_set.jl +++ b/test/Utilities/distance_to_set.jl @@ -515,6 +515,24 @@ function test_HermitianPositiveSemidefiniteConeTriangle() return end +function test_indicator_complex() + _test_set( + MOI.Indicator{MOI.ACTIVATE_ON_ZERO}(MOI.EqualTo(1.0+2.0im)), + [0.0, 1.0+2.0im] => 0.0, + [0.01, 1.0+1.0im] => 0.99, + [0.0, 1.0+1.0im] => 1.0, + [0.0, 1.0+1.5im] => 0.5, + ) + _test_set( + MOI.Indicator{MOI.ACTIVATE_ON_ONE}(MOI.EqualTo(1.0+2.0im)), + [1.0, 1.0+2.0im] => 0.0, + [0.99, 1.0+1.0im] => 0.99, + [1.0, 1.0+1.0im] => 1.0, + [1.0, 1.0+1.5im] => 0.5, + ) + return +end + end TestFeasibilityChecker.runtests() From e7a7a635ba1021427f69b50861af6544df260aec Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Thu, 29 Jan 2026 16:57:43 +1300 Subject: [PATCH 2/2] Fix format --- src/Utilities/distance_to_set.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Utilities/distance_to_set.jl b/src/Utilities/distance_to_set.jl index 4591f9e0c2..451656fb21 100644 --- a/src/Utilities/distance_to_set.jl +++ b/src/Utilities/distance_to_set.jl @@ -615,7 +615,6 @@ function distance_to_set( set::MOI.Indicator{MOI.ACTIVATE_ON_ONE}, ) where {T<:Number} _check_dimension(x, set) - return min( # Distance of x[1] from 0 abs(x[1]),