Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions src/Utilities/sets.jl
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ function shift_constant(
) where {T}
return typeof(set)(MOI.constant(set) + offset)
end

supports_shift_constant(::Type{<:MOI.LessThan}) = true
supports_shift_constant(::Type{<:MOI.GreaterThan}) = true
supports_shift_constant(::Type{<:MOI.EqualTo}) = true
Expand All @@ -50,14 +51,52 @@ function shift_constant(set::MOI.Interval, offset)
end
supports_shift_constant(::Type{<:MOI.Interval}) = true

"""
ScalarLinearSet{T}

The union of scalar-valued linear sets with element type `T`.

This is used in the vectorize and scalarize bridges.

See also: [`VectorLinearSet`](@ref).
"""
const ScalarLinearSet{T} =
Union{MOI.EqualTo{T},MOI.LessThan{T},MOI.GreaterThan{T}}

"""
VectorLinearSet

The union of vector-valued linear cones.

This is used in the vectorize and scalarize bridges.

See also: [`ScalarLinearSet`](@ref).
"""
const VectorLinearSet = Union{MOI.Zeros,MOI.Nonnegatives,MOI.Nonpositives}

"""
vector_set_type(::Type{S}) where {S}

A utility function to map scalar sets `S` to their vector equivalents.

This is used in the vectorize and scalarize bridges.

See also: [`scalar_set_type`](@ref).
"""
vector_set_type(::Type{<:MOI.EqualTo}) = MOI.Zeros
vector_set_type(::Type{<:MOI.LessThan}) = MOI.Nonpositives
vector_set_type(::Type{<:MOI.GreaterThan}) = MOI.Nonnegatives

"""
scalar_set_type(::Type{S}, ::Type{T}) where {S,T}

A utility function to map vector sets `S` to their scalar equivalents with
element type `T`.

This is used in the vectorize and scalarize bridges.

See also: [`vector_set_type`](@ref).
"""
scalar_set_type(::Type{<:MOI.Zeros}, T::Type) = MOI.EqualTo{T}
scalar_set_type(::Type{<:MOI.Nonpositives}, T::Type) = MOI.LessThan{T}
scalar_set_type(::Type{<:MOI.Nonnegatives}, T::Type) = MOI.GreaterThan{T}
Expand Down
58 changes: 28 additions & 30 deletions test/Utilities/sets.jl
Original file line number Diff line number Diff line change
@@ -1,9 +1,24 @@
using SparseArrays, Test
module TestSets

using SparseArrays
using Test
using MathOptInterface

const MOI = MathOptInterface
const MOIU = MOI.Utilities

@testset "Diagonal element" begin
function runtests()
for name in names(@__MODULE__; all = true)
if startswith("$(name)", "test_")
@testset "$(name)" begin
getfield(@__MODULE__, name)()
end
end
end
return
end

function test_diagonal_element()
k = 0
for j in 1:10
for i in 1:j
Expand All @@ -16,23 +31,19 @@ const MOIU = MOI.Utilities
vec_dim = MOI.dimension(set)
@test MOIU.side_dimension_for_vectorized_dimension(vec_dim) == side_dim
end
return
end

@testset "Side dimension" begin
function test_side_dimension()
for side_dim in 1:10
set = MOI.PositiveSemidefiniteConeTriangle(side_dim)
vec_dim = MOI.dimension(set)
@test MOIU.side_dimension_for_vectorized_dimension(vec_dim) == side_dim
end
return
end

@testset "Constant" begin
@test MOI.constant(MOI.EqualTo(3)) == 3
@test MOI.constant(MOI.GreaterThan(6)) == 6
@test MOI.constant(MOI.LessThan(2)) == 2
end

@testset "Shifts" begin
function test_shifts()
@test MOIU.supports_shift_constant(MOI.EqualTo{Int})
@test MOIU.shift_constant(MOI.EqualTo(3), 1) == MOI.EqualTo(4)
@test MOIU.supports_shift_constant(MOI.GreaterThan{Int})
Expand All @@ -43,27 +54,10 @@ end
@test MOIU.shift_constant(MOI.Interval(-2, 3), 1) == MOI.Interval(-1, 4)
@test MOIU.supports_shift_constant(MOI.ZeroOne) == false
@test_throws MethodError MOIU.shift_constant(MOI.ZeroOne(), 1.0)
return
end

@testset "Dimension" begin
@test MOI.dimension(MOI.EqualTo(3.0)) === 1
@test MOI.dimension(MOI.Reals(8)) === 8
@test MOI.dimension(MOI.NormInfinityCone(5)) === 5
@test MOI.dimension(MOI.NormOneCone(5)) === 5
@test MOI.dimension(MOI.DualExponentialCone()) === 3
@test MOI.dimension(MOI.RelativeEntropyCone(5)) === 5
@test MOI.dimension(MOI.NormSpectralCone(2, 3)) === 7
@test MOI.dimension(MOI.NormNuclearCone(2, 3)) === 7
@test MOI.dimension(MOI.PositiveSemidefiniteConeTriangle(4)) === 10
@test MOI.dimension(MOI.PositiveSemidefiniteConeSquare(5)) === 25
@test MOI.dimension(MOI.RootDetConeTriangle(6)) === 22
@test MOI.dimension(MOI.LogDetConeTriangle(6)) === 23
@test MOI.dimension(MOI.RootDetConeSquare(4)) === 17
@test MOI.dimension(MOI.LogDetConeSquare(4)) === 18
@test MOI.dimension(MOI.SOS2(collect(1:6))) === 6
end

@testset "Set dot" begin
function test_set_dot()
vec = zeros(6)
@test MOIU.set_dot(vec, vec, MOI.SecondOrderCone(6)) == 0
@test MOIU.set_dot(vec, vec, MOI.PositiveSemidefiniteConeTriangle(3)) == 0
Expand Down Expand Up @@ -126,7 +120,7 @@ end
@test MOIU.set_dot(sp_vec, sp_vec, MOI.LogDetConeTriangle(3)) == 1
end

@testset "dot coefficients" begin
function test_dot_coefficients()
vec = zeros(6)
@test MOIU.dot_coefficients(vec, MOI.SecondOrderCone(6)) == vec
@test MOIU.dot_coefficients(vec, MOI.PositiveSemidefiniteConeTriangle(3)) ==
Expand Down Expand Up @@ -180,3 +174,7 @@ end
sp_vec[5] = 1
@test MOIU.dot_coefficients(sp_vec, MOI.LogDetConeTriangle(3)) == sp_vec
end

end # module

TestSets.runtests()