/ProxSDP.jl

Semidefinite programming optimization solver

Primary LanguageJuliaMIT LicenseMIT

ProxSDP

Build Status
Build Status Codecov branch

ProxSDP is a semidefinite programming (SDP) solver based on the paper "Exploiting Low-Rank Structure in Semidefinite Programming by Approximate Operator Splitting". ProxSDP solves general SDP problems by means of a first order proximal algorithm based on the primal-dual hybrid gradient, also known as Chambolle-Pock method. The main advantage of ProxSDP over other state-of-the-art solvers is the ability of exploit the low-rank property inherent to several SDP problems.

Overview of problems ProxSDP can solve

Installing

Currently ProxSDP only works with Julia 0.6.x

To add ProxSDP run:

Pkg.add("ProxSDP")

Building problems with JuMP.jl

Currently the easiest ways to pass problems to ProxSDP is through JuMP (v0.19-alpha) or MathOptInterface (v0.6).

The main caveat is that currently ProxSDP must have one and only one PSD variable, no other variables are allowed.

In the test folder one can find MOI implementations of some problems: MIMO, Sensor Localization, Random SDPs and sdplib problems.

JuMP example

ProxSDP uses the new implementation of JuMP, currently in alpha version.

Therefore one needs to checkout in JuMP on the tag v0.19-alpha

For more example on how to use the latest version of JuMP please refer to the manual.

A quick JuMP example:

using ProxSDP, JuMP

# Create a JuMP model using ProxSDP as the solver
model = Model(with_optimizer(ProxSDP.Solver, log_verbose=true))

# Create a Positive Semidefinite variable
# Currently ProxSDP is only able to hold one PSD
# variable and no other variable
@variable(model, X[1:2,1:2], PSD)

# but you can define pieces of the one PSD
# variable to hold other variable as in the
# Canonical SDP format
x = X[1,1]
y = X[2,2]

# There is no limits on linear constraints
# one can define as many as wanted
@constraint(model, ub_x, x <= 2)

@constraint(model, ub_y, y <= 30)

@constraint(model, con, 1x + 5y <= 3)

# ProxSDP supports maximization or minimization
# of linear functions
@objective(model, Max, 5x + 3 * y)

# Then we can solve the model
JuMP.optimize!(model)

# And ask for results!
JuMP.objective_value(model)

JuMP.result_value(x)

JuMP.result_value(y)

Referencing

The first version of the paper can be found here.

@article{souto2018exploiting,
  title={Exploiting Low-Rank Structure in Semidefinite Programming by Approximate Operator Splitting},
  author={Souto, Mario and Garcia, Joaquim D and Veiga, {\'A}lvaro},
  journal={arXiv preprint arXiv:1810.05231},
  year={2018}
}

TODO

  • Add support for other cones