SDPLR.jl is a wrapper for the SDPLR semidefinite programming solver.
SDPLR.jl is licensed under the MIT License.
The underlying solver, SDPLR, is licensed under the GPL v2 license.
Install SDPLR.jl using Pkg.add:
import Pkg
Pkg.add("SDPLR")In addition to installing the SDPLR.jl package, this will also download and install the SDPLR binaries. You do not need to install SDPLR separately.
To use a custom binary, read the Custom solver binaries section of the JuMP documentation.
To use SDPLR with JuMP, use
SDPLR.Optimizer:
using JuMP, SDPLR
model = Model(SDPLR.Optimizer)The SDPLR optimizer supports the following constraints and attributes.
List of supported objective functions:
List of supported variable types:
List of supported constraint types:
List of supported model attributes:
The algorithm is parametrized by the attributes that can be used both with JuMP.set_attributes and JuMP.get_attributes
and have the following types and default values:
rho_f::Cdouble = 1.0e-5
rho_c::Cdouble = 1.0e-1
sigmafac::Cdouble = 2.0
rankreduce::Csize_t = 0
timelim::Csize_t = 3600
printlevel::Csize_t = 1
dthresh_dim::Csize_t = 10
dthresh_dens::Cdouble = 0.75
numbfgsvecs::Csize_t = 4
rankredtol::Cdouble = 2.2204460492503131e-16
gaptol::Cdouble = 1.0e-3
checkbd::Cptrdiff_t = -1
typebd::Cptrdiff_t = 1
maxrank::Function = default_maxrankThe following attributes can be also be used both with JuMP.set_attributes and JuMP.get_attributes, but they are also
modified by optimize!:
majiteriterlambdaupdatetotaltimesigma
When they are set, it provides the initial value of the algorithm.
With get, they provide the value at the end of the algorithm.
totaltime is the total time in second. For the other attributes,
their meaning is best described by the following pseudo-code.
Given values of R, lambda and sigma, let
vio = [dot(A[i], R * R') - b[i]) for i in 1:m] (vio[0] is dot(C, R * R') in the C implementation, but we ignore this entry here),
val = dot(C, R * R') - dot(vio, lambda) + sigma/2 * norm(vio)^2,
y = -lambda - sigma * vio,
S = C + sum(A[i] * y[i] for i in 1:m) and
the gradient is G = 2S * R.
Note that norm(G) used in SDPLR when comparing with rho_c which has a 2-scaling difference
from norm(S * R) used in the paper.
The SDPLR solvers implements the following algorithm.
sigma = inv(sum(size(A[i], 1) for i in 1:m))
origval = val
while majiter++ < 100_000
lambdaupdate = 0
localiter = 100
while localiter > 10
lambdaupdate += 1
localiter = 0
if norm(G) / (norm(C) + 1) <= rho_c / sigma
break
end
while norm(G) / (norm(C) + 1) - rho_c / sigma > eps()
localiter += 1
iter += 1
D = lbfgs(G)
R += linesearch(D) * D
if norm(vio) / (norm(b) + 1) <= rho_f || totaltime >= timelim || iter >= 10_000_000
return
end
end
lambda -= sigma * vio
end
if val - 1e10 * abs(origval) > eps()
return
end
if norm(vio) / (norm(b) + 1) <= rho_f || totaltime >= timelim || iter >= 10_000_000
return
end
sigma *= 2
while norm(G) / (norm(C) + 1) < rho_c / sigma
sigma *= 2
end
lambdaupdate = 0
end