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
12 changes: 5 additions & 7 deletions src/Utilities/sets.jl
Original file line number Diff line number Diff line change
Expand Up @@ -128,19 +128,17 @@ function is_diagonal_vectorized_index(index::Base.Integer)
return isqrt(perfect_square)^2 == perfect_square
end

# We have `d*(d+1)/2 = n` so `2n = d^2 + d` hence
# `d^2 ≤ 2n < d^2 + 2d + 1 = (d + 1)^2`
# this means that `d` is the largest natural number `d`
# such that `d^2 ≤ 2n` hence `d = isqrt(2n)`.
"""
side_dimension_for_vectorized_dimension(n::Integer)

Return the dimension `d` such that
`MOI.dimension(MOI.PositiveSemidefiniteConeTriangle(d))` is `n`.
"""
function side_dimension_for_vectorized_dimension(n::Base.Integer)
# We have `d*(d+1)/2 = n` so
# `d² + d - 2n = 0` hence `d = (-1 ± √(1 + 8n)) / 2`
# The integer `√(1 + 8n)` is odd and `√(1 + 8n) - 1` is even.
# We can drop the `- 1` as `div` already discards it.
return div(isqrt(1 + 8n), 2)
end
side_dimension_for_vectorized_dimension(n::Base.Integer) = isqrt(2n)

"""
trimap(row::Integer, column::Integer)
Expand Down
10 changes: 10 additions & 0 deletions test/Utilities/sets.jl
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@ function test_diagonal_element()
vec_dim = MOI.dimension(set)
@test MOIU.side_dimension_for_vectorized_dimension(vec_dim) == side_dim
end
# There is an alternative way to compute it so let's check that
# they match.
# We have `d*(d+1)/2 = n` so
# `d² + d - 2n = 0` hence `d = (-1 ± √(1 + 8n)) / 2`
# The integer `√(1 + 8n)` is odd and `√(1 + 8n) - 1` is even.
# We can drop the `- 1` as `div` already discards it.
for n in 1:100
@test div(isqrt(1 + 8n), 2) ==
MOIU.side_dimension_for_vectorized_dimension(n)
end
return
end

Expand Down