The following routines attempt to solve quadratic programs of the form

$\text{min} \frac{1}{2} z^T P z + q^T z\;\;\;\text{such that }l_b \le z \le u_b$

using the Alternating Direction Method of Multipliers.

These functions are inspired by a simple ADMM quadratic program solver due to Boyd et al. Elemental’s implementations make use of parallel (dense) linear algebra and allows the user to optionally directly invert the Cholesky factor to improve the parallel performance of the application of its inverse.

## C++ API¶

Int QuadraticProgram(const Matrix<Real> &P, const Matrix<Real> &q, Real lb, Real ub, Matrix<Real> &z, Real rho = 1., Real alpha = 1.2, Int maxIter = 500, Real absTol = 1e-6, Real relTol = 1e-4, bool inv = false, bool progress = true)
Int QuadraticProgram(const AbstractDistMatrix<Real> &P, const AbstractDistMatrix<Real> &q, Real lb, Real ub, AbstractDistMatrix<Real> &z, Real rho = 1., Real alpha = 1.2, Int maxIter = 500, Real absTol = 1e-6, Real relTol = 1e-4, bool inv = true, bool progress = true)

Implementations

Example driver

Parameters Input/Output Explanation
P Input SPD and part of objective, $$\frac{1}{2}x^T P x + q^T x$$
q Input part of objective
lb Input lower-bound of constraints, $$l_b \le x \le u_b$$
ub Input upper-bound of constraints, $$l_b \le x \le u_b$$
z Output primal solution (second term)
rho Input augmented-Lagrangian parameter
alpha Input over-relaxation parameter (usually in $$[1,1.8]$$)
maxIter Input maximum number of ADMM iterations
absTol Input absolute convergence tolerance
relTol Input relative convergence tolerance
inv Input compute inverse of Cholesky factor?
progress Input display detailed progress information?

## C API¶

ElError ElQuadraticProgram_s(ElConstMatrix_s P, ElConstMatrix_s S, float lb, float ub, ElMatrix_s Z, ElInt* numIts)
ElError ElQuadraticProgram_d(ElConstMatrix_d P, ElConstMatrix_d S, double lb, double ub, ElMatrix_d Z, ElInt* numIts)
ElError ElQuadraticProgramDist_s(ElConstDistMatrix_s P, ElConstDistMatrix_s S, float lb, float ub, ElDistMatrix_s Z, ElInt* numIts)
ElError ElQuadraticProgramDist_d(ElConstDistMatrix_d P, ElConstDistMatrix_d S, double lb, double ub, ElDistMatrix_d Z, ElInt* numIts)