9.4 Converting a quadratically constrained problem to conic form¶
MOSEK employs the following form of quadratic problems:
A conic quadratic constraint has the form
in its most basic form where
A quadratic problem such as (9.8), if convex, can be reformulated in conic form. This is in fact the reformulation MOSEK performs internally. It has many advantages:
elegant duality theory for conic problems,
reporting accurate dual information for quadratic inequalities is hard and/or computational expensive,
it certifies that the original quadratic problem is indeed convex,
modeling directly in conic form usually leads to a better model [And13] i.e. a faster solution time and better numerical properties.
In addition, there are more types of conic constraints that can be combined with a quadratic cone, for example semidefinite cones.
MOSEK offers a function that performs the conversion from quadratic to conic quadratic form explicitly. Note that the reformulation is not unique. The approach followed by MOSEK is to introduce additional variables, linear constraints and quadratic cones to obtain a larger but equivalent problem in which the original variables are preserved.
In particular:
all variables and constraints are kept in the problem,
each quadratic constraint and quadratic terms in the objective generate one rotated quadratic cone,
each quadratic constraint will contain no coefficients and upper/lower bounds will be set to \(\infty,-\infty\) respectively.
This allows the user to recover the original variable and constraint values, as well as their dual values, with no conversion or additional effort.
Note
Task.toconic
modifies the input task in-place: this means that if the reformulation is not possible, i.e. the problem is not conic representable, the state of the task is in general undefined. The user should consider cloning the original task.
9.4.1 Quadratic Constraint Reformulation¶
Let us assume we want to convert the following quadratic constraint
to conic form. We first check whether \(l = -\infty\) or \(u = \infty\), otherwise either the constraint can be dropped, or the constraint is not convex. Thus let us consider the case
Introducing an additional variable \(w\) such that
we obtain the equivalent form
If \(Q\) is positive semidefinite, then there exists a matrix \(F\) such that
and therefore we can write
Introducing an additional variable \(z = 1\), and setting \(y = Fx\) we obtain the conic formulation
Summarizing, for each quadratic constraint involving \(t\) variables, MOSEK introduces
a rotated quadratic cone of dimension \(t+2\),
two additional variables for the cone roots,
\(t\) additional variables to map the remaining part of the cone,
\(t\) linear constraints.
A quadratic term in the objective is reformulated in a similar fashion. We refer to [And13] for a more thorough discussion.
Example
Next we consider a simple problem with quadratic objective function:
We can specify it in the human-readable OPF format.
[comment]
An example of small QO problem from Boyd and Vandenberghe, "Convex Optimization", page 189 ex 4.3
The solution is (1,0.5,-1)
[/comment]
[variables]
x0 x1 x2
[/variables]
[objective min]
0.5 (13 x0^2 + 17 x1^2 + 12 x2^2 + 24 x0 * x1 + 12 x1 * x2 - 4 x0 * x2 ) - 22 x0 - 14.5 x1 + 12 x2 + 1
[/objective]
[bounds]
[b] -1 <= * <= 1 [/b]
[/bounds]
The objective function is convex, the minimum is attained for \(x^\star = (1,0.5,-1)\). The conversion will introduce first a variable \(x_3\) in the objective function such that \(x_3\geq 1/2 x^TQx\) and then convert the latter directly in conic form. The converted problem follows:
The model generated by Task.toconic
is
[comment]
Written by MOSEK version 8.1.0.19
Date 21-08-17
Time 10:53:36
[/comment]
[hints]
[hint NUMVAR] 9 [/hint]
[hint NUMCON] 4 [/hint]
[hint NUMANZ] 11 [/hint]
[hint NUMQNZ] 0 [/hint]
[hint NUMCONE] 1 [/hint]
[/hints]
[variables disallow_new_variables]
x0000_x0 x0001_x1 x0002_x2 x0003 x0004
x0005 x0006 x0007 x0008
[/variables]
[objective minimize]
- 2.2e+01 x0000_x0 - 1.45e+01 x0001_x1 + 1.2e+01 x0002_x2 + x0003
+ 1e+00
[/objective]
[constraints]
[con c0000] 3.605551275463989e+00 x0000_x0 - 5.547001962252291e-01 x0002_x2 + 3.328201177351375e+00 x0001_x1 - x0006 = 0e+00 [/con]
[con c0001] 3.419401657060442e+00 x0002_x2 + 2.294598480395823e+00 x0001_x1 - x0007 = 0e+00 [/con]
[con c0002] 8.111071056538127e-01 x0001_x1 - x0008 = 0e+00 [/con]
[con c0003] - x0003 + x0004 = 0e+00 [/con]
[/constraints]
[bounds]
[b] -1e+00 <= x0000_x0,x0001_x1,x0002_x2 <= 1e+00 [/b]
[b] x0003,x0004 free [/b]
[b] x0005 = 1e+00 [/b]
[b] x0006,x0007,x0008 free [/b]
[cone rquad k0000] x0004, x0005, x0006, x0007, x0008 [/cone]
[/bounds]
We can clearly see that constraints c0000
, c0001
and c0002
represent the original linear constraints as in (9.11), while c0003
corresponds to (9.10). The cone roots are x0005
and x0004
.