PropertyT.jl/src/SDPs.jl

76 lines
1.9 KiB
Julia
Raw Normal View History

2017-03-13 14:49:55 +01:00
using JuMP
import MathProgBase: AbstractMathProgSolver
function constraints(pm, total_length=maximum(pm))
2017-03-13 14:49:55 +01:00
n = size(pm,1)
constraints = [Vector{Tuple{Int,Int}}() for _ in 1:total_length]
2017-03-13 14:49:55 +01:00
for j in 1:n
2017-03-14 16:42:04 +01:00
for i in 1:n
2017-03-13 14:49:55 +01:00
idx = pm[i,j]
push!(constraints[idx], (i,j))
2017-03-13 14:49:55 +01:00
end
end
return constraints
end
function splaplacian(RG::GroupRing, S, T::Type=Float64)
result = RG(T)
result[RG.group()] = T(length(S))
for s in S
result[s] -= one(T)
end
return result
end
function splaplacian{TT<:Ring}(RG::GroupRing{TT}, S, T::Type=Float64)
result = RG(T)
result[one(RG.group)] = T(length(S))
2017-03-13 14:49:55 +01:00
for s in S
2017-06-06 11:51:15 +02:00
result[s] -= one(T)
2017-03-13 14:49:55 +01:00
end
return result
end
function create_SDP_problem(Δ::GroupRingElem, matrix_constraints; upper_bound=Inf)
N = size(parent(Δ).pm, 1)
2017-03-17 16:27:01 +01:00
Δ² = Δ*Δ
@assert length(Δ.coeffs) == length(matrix_constraints)
2017-03-13 14:49:55 +01:00
m = JuMP.Model();
JuMP.@variable(m, P[1:N, 1:N])
2017-04-01 15:21:57 +02:00
JuMP.@SDconstraint(m, P >= 0)
JuMP.@constraint(m, sum(P[i] for i in eachindex(P)) == 0)
2017-03-20 21:41:12 +01:00
2017-03-13 14:49:55 +01:00
if upper_bound < Inf
2017-04-01 15:21:57 +02:00
JuMP.@variable(m, 0.0 <= λ <= upper_bound)
2017-03-20 21:41:12 +01:00
else
2017-04-01 15:21:57 +02:00
JuMP.@variable(m, λ >= 0)
2017-03-13 14:49:55 +01:00
end
for (pairs, δ², δ) in zip(matrix_constraints, Δ².coeffs, Δ.coeffs)
2017-04-01 15:21:57 +02:00
JuMP.@constraint(m, sum(P[i,j] for (i,j) in pairs) == δ² - λ*δ)
2017-03-13 14:49:55 +01:00
end
2017-03-20 21:41:12 +01:00
2017-04-01 15:21:57 +02:00
JuMP.@objective(m, Max, λ)
2017-03-20 21:41:12 +01:00
return m, λ, P
2017-03-13 14:49:55 +01:00
end
2017-06-04 20:26:05 +02:00
function solve_SDP(SDP_problem)
info(LOGGER, Base.repr(SDP_problem))
2017-03-13 14:49:55 +01:00
o = redirect_stdout(LOGGER_SOLVER.handlers["solver_log"].io)
Base.Libc.flush_cstdio()
2017-03-16 09:35:32 +01:00
@logtime LOGGER solution_status = MathProgBase.optimize!(SDP_problem.internalModel)
Base.Libc.flush_cstdio()
2017-03-16 09:35:32 +01:00
redirect_stdout(o)
2017-03-13 14:49:55 +01:00
if solution_status != :Optimal
warn(LOGGER, "The solver did not solve the problem successfully!")
2017-03-13 14:49:55 +01:00
end
info(LOGGER, solution_status)
2017-03-13 14:49:55 +01:00
2017-06-04 20:26:05 +02:00
return 0
2017-03-13 14:49:55 +01:00
end