Skip to content
24 changes: 12 additions & 12 deletions src/Utilities/results.jl
Original file line number Diff line number Diff line change
Expand Up @@ -428,12 +428,12 @@ end
# `dot_coefficients`.

"""
set_dot(x::Vector, y::Vector, set::AbstractVectorSet)
set_dot(x::AbstractVector, y::AbstractVector, set::AbstractVectorSet)

Return the scalar product between a vector `x` of the set `set` and a vector
`y` of the dual of the set `s`.
"""
set_dot(x::Vector, y::Vector, set::MOI.AbstractVectorSet) = dot(x, y)
set_dot(x::AbstractVector, y::AbstractVector, set::MOI.AbstractVectorSet) = dot(x, y)

"""
set_dot(x, y, set::AbstractScalarSet)
Expand All @@ -443,7 +443,7 @@ Return the scalar product between a number `x` of the set `set` and a number
"""
set_dot(x, y, set::MOI.AbstractScalarSet) = dot(x, y)

function triangle_dot(x::Vector{S}, y::Vector{T}, dim::Int, offset::Int) where {S, T}
function triangle_dot(x::AbstractVector{S}, y::AbstractVector{T}, dim::Int, offset::Int) where {S, T}
U = typeof(zero(S) * zero(T) + 2 * zero(S) * zero(T))
result = zero(U)
k = offset
Expand All @@ -460,30 +460,30 @@ function triangle_dot(x::Vector{S}, y::Vector{T}, dim::Int, offset::Int) where {
return result
end

function set_dot(x::Vector, y::Vector,
function set_dot(x::AbstractVector, y::AbstractVector,
set::MOI.AbstractSymmetricMatrixSetTriangle)
return triangle_dot(x, y, MOI.side_dimension(set), 0)
end

function set_dot(x::Vector, y::Vector, set::MOI.RootDetConeTriangle)
function set_dot(x::AbstractVector, y::AbstractVector, set::MOI.RootDetConeTriangle)
return x[1] * y[1] + triangle_dot(x, y, set.side_dimension, 1)
end

function set_dot(x::Vector, y::Vector, set::MOI.LogDetConeTriangle)
function set_dot(x::AbstractVector, y::AbstractVector, set::MOI.LogDetConeTriangle)
return x[1] * y[1] + x[2] * y[2] + triangle_dot(x, y, set.side_dimension, 2)
end

"""
dot_coefficients(a::Vector, set::AbstractVectorSet)
dot_coefficients(a::AbstractVector, set::AbstractVectorSet)

Return the vector `b` such that for all vector `x` of the set `set`,
`set_dot(b, x, set)` is equal to `dot(a, x)`.
"""
function dot_coefficients(a::Vector, set::MOI.AbstractVectorSet)
function dot_coefficients(a::AbstractVector, set::MOI.AbstractVectorSet)
return a
end

function triangle_coefficients!(b::Vector{T}, dim::Int, offset::Int) where T
function triangle_coefficients!(b::AbstractVector{T}, dim::Int, offset::Int) where T
k = offset
for i in 1:dim
for j in 1:i
Expand All @@ -495,19 +495,19 @@ function triangle_coefficients!(b::Vector{T}, dim::Int, offset::Int) where T
end
end

function dot_coefficients(a::Vector, set::MOI.AbstractSymmetricMatrixSetTriangle)
function dot_coefficients(a::AbstractVector, set::MOI.AbstractSymmetricMatrixSetTriangle)
b = copy(a)
triangle_coefficients!(b, MOI.side_dimension(set), 0)
return b
end

function dot_coefficients(a::Vector, set::MOI.RootDetConeTriangle)
function dot_coefficients(a::AbstractVector, set::MOI.RootDetConeTriangle)
b = copy(a)
triangle_coefficients!(b, set.side_dimension, 1)
return b
end

function dot_coefficients(a::Vector, set::MOI.LogDetConeTriangle)
function dot_coefficients(a::AbstractVector, set::MOI.LogDetConeTriangle)
b = copy(a)
triangle_coefficients!(b, set.side_dimension, 2)
return b
Expand Down
92 changes: 92 additions & 0 deletions test/Utilities/sets.jl
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using SparseArrays

@testset "Constant" begin
@test MOI.constant(MOI.EqualTo(3)) == 3
@test MOI.constant(MOI.GreaterThan(6)) == 6
Expand All @@ -23,3 +25,93 @@ end
@test MOI.dimension(MOI.LogDetConeSquare(4)) === 18
@test MOI.dimension(MOI.SOS2(collect(1:6))) === 6
end

@testset "Set dot" begin
vec = zeros(6)
@test MOIU.set_dot(vec, vec, MOI.SecondOrderCone(6)) == 0
@test MOIU.set_dot(vec, vec, MOI.PositiveSemidefiniteConeTriangle(3)) == 0
@test MOIU.set_dot(vec, vec, MOI.PositiveSemidefiniteConeSquare(3)) == 0
vec[5] = 1
@test MOIU.set_dot(vec, vec, MOI.SecondOrderCone(6)) == 1
@test MOIU.set_dot(vec, vec, MOI.PositiveSemidefiniteConeTriangle(3)) == 2
@test MOIU.set_dot(vec, vec, MOI.PositiveSemidefiniteConeSquare(3)) == 1
vec[5] = 0
vec[3] = 1
@test MOIU.set_dot(vec, vec, MOI.SecondOrderCone(6)) == 1
@test MOIU.set_dot(vec, vec, MOI.PositiveSemidefiniteConeTriangle(3)) == 1
@test MOIU.set_dot(vec, vec, MOI.PositiveSemidefiniteConeSquare(3)) == 1

vec = zeros(7)
@test MOIU.set_dot(vec, vec, MOI.RootDetConeTriangle(3)) == 0
vec[5] = 1
@test MOIU.set_dot(vec, vec, MOI.RootDetConeTriangle(3)) == 2
vec = zeros(8)
@test MOIU. set_dot(vec, vec, MOI.LogDetConeTriangle(3)) == 0
vec[5] = 1
@test MOIU.set_dot(vec, vec, MOI.LogDetConeTriangle(3)) == 1

sp_vec = spzeros(6)
@test MOIU.set_dot(sp_vec, sp_vec, MOI.SecondOrderCone(6)) == 0
@test MOIU.set_dot(sp_vec, sp_vec, MOI.PositiveSemidefiniteConeTriangle(3)) == 0
@test MOIU.set_dot(sp_vec, sp_vec, MOI.PositiveSemidefiniteConeSquare(3)) == 0
sp_vec[5] = 1
@test MOIU.set_dot(sp_vec, sp_vec, MOI.SecondOrderCone(6)) == 1
@test MOIU.set_dot(sp_vec, sp_vec, MOI.PositiveSemidefiniteConeTriangle(3)) == 2
@test MOIU.set_dot(sp_vec, sp_vec, MOI.PositiveSemidefiniteConeSquare(3)) == 1
sp_vec[5] = 0
sp_vec[3] = 1
@test MOIU.set_dot(sp_vec, sp_vec, MOI.SecondOrderCone(6)) == 1
@test MOIU.set_dot(sp_vec, sp_vec, MOI.PositiveSemidefiniteConeTriangle(3)) == 1
@test MOIU.set_dot(sp_vec, sp_vec, MOI.PositiveSemidefiniteConeSquare(3)) == 1

sp_vec = spzeros(7)
@test MOIU.set_dot(sp_vec, sp_vec, MOI.RootDetConeTriangle(3)) == 0
sp_vec[5] = 1
@test MOIU.set_dot(sp_vec, sp_vec, MOI.RootDetConeTriangle(3)) == 2
sp_vec = spzeros(8)
@test MOIU. set_dot(sp_vec, sp_vec, MOI.LogDetConeTriangle(3)) == 0
sp_vec[5] = 1
@test MOIU.set_dot(sp_vec, sp_vec, MOI.LogDetConeTriangle(3)) == 1
end

@testset "dot coefficients" begin
vec = zeros(6)
@test MOIU.dot_coefficients(vec, MOI.SecondOrderCone(6)) == vec
@test MOIU.dot_coefficients(vec, MOI.PositiveSemidefiniteConeTriangle(3)) == vec
vec[5] = 1
@test MOIU.dot_coefficients(vec, MOI.SecondOrderCone(6)) == vec
@test MOIU.dot_coefficients(vec, MOI.PositiveSemidefiniteConeTriangle(3)) == vec./2
vec[5] = 0
vec[3] = 1
@test MOIU.dot_coefficients(vec, MOI.SecondOrderCone(6)) == vec
@test MOIU.dot_coefficients(vec, MOI.PositiveSemidefiniteConeTriangle(3)) == vec

vec = zeros(7)
@test MOIU.dot_coefficients(vec, MOI.RootDetConeTriangle(3)) == vec
vec[5] = 1
@test MOIU.dot_coefficients(vec, MOI.RootDetConeTriangle(3)) == vec./2
vec = zeros(8)
@test MOIU. dot_coefficients(vec, MOI.LogDetConeTriangle(3)) == vec
vec[5] = 1
@test MOIU.dot_coefficients(vec, MOI.LogDetConeTriangle(3)) == vec

sp_vec = spzeros(6)
@test MOIU.dot_coefficients(sp_vec, MOI.SecondOrderCone(6)) == sp_vec
@test MOIU.dot_coefficients(sp_vec, MOI.PositiveSemidefiniteConeTriangle(3)) == sp_vec
sp_vec[5] = 1
@test MOIU.dot_coefficients(sp_vec, MOI.SecondOrderCone(6)) == sp_vec
@test MOIU.dot_coefficients(sp_vec, MOI.PositiveSemidefiniteConeTriangle(3)) == sp_vec./2
sp_vec[5] = 0
sp_vec[3] = 1
@test MOIU.dot_coefficients(sp_vec, MOI.SecondOrderCone(6)) == sp_vec
@test MOIU.dot_coefficients(sp_vec, MOI.PositiveSemidefiniteConeTriangle(3)) == sp_vec

sp_vec = spzeros(7)
@test MOIU.dot_coefficients(sp_vec, MOI.RootDetConeTriangle(3)) == sp_vec
sp_vec[5] = 1
@test MOIU.dot_coefficients(sp_vec, MOI.RootDetConeTriangle(3)) == sp_vec./2
sp_vec = spzeros(8)
@test MOIU. dot_coefficients(sp_vec, MOI.LogDetConeTriangle(3)) == sp_vec
sp_vec[5] = 1
@test MOIU.dot_coefficients(sp_vec, MOI.LogDetConeTriangle(3)) == sp_vec
end