# 7.3 Power Cone Optimization¶

The structure of a typical conic optimization problem is

$\begin{split}\begin{array}{lccccl} \mbox{minimize} & & & c^T x+c^f & & \\ \mbox{subject to} & l^c & \leq & A x & \leq & u^c, \\ & l^x & \leq & x & \leq & u^x, \\ & & & Fx+g & \in & \D, \end{array}\end{split}$

(see Sec. 12 (Problem Formulation and Solutions) for detailed formulations). Here we discuss how to set-up problems with the primal/dual power cones.

MOSEK supports the primal and dual power cones, defined as below:

• Primal power cone:

$\POW_n^{\alpha_k} = \left\{ x\in \real^n ~:~ \prod_{i=0}^{n_\ell-1} x_i^{\beta_i} \geq \sqrt{\sum_{j=n_\ell}^{n-1}x_j^2},\ x_0\ldots,x_{n_\ell-1}\geq 0 \right\}$

where $$s = \sum_i \alpha_i$$ and $$\beta_i = \alpha_i / s$$, so that $$\sum_i \beta_i=1$$.

• Dual power cone:

$(\POW_n^{\alpha_k}) = \left\{ x\in \real^n ~:~ \prod_{i=0}^{n_\ell-1} \left(\frac{x_i}{\beta_i}\right)^{\beta_i} \geq \sqrt{\sum_{j=n_\ell}^{n-1}x_j^2},\ x_0\ldots,x_{n_\ell-1}\geq 0 \right\}$

where $$s = \sum_i \alpha_i$$ and $$\beta_i = \alpha_i / s$$, so that $$\sum_i \beta_i=1$$.

Perhaps the most important special case is the three-dimensional power cone family:

$\POW_3^{\alpha,1-\alpha} = \left\lbrace x \in \real^3: x_0^\alpha x_1^{1-\alpha}\geq |x_2|,\ x_0,x_1\geq 0 \right\rbrace.$

which has the corresponding dual cone:

For example, the conic constraint $$(x,y,z)\in\POW_3^{0.25,0.75}$$ is equivalent to $$x^{0.25}y^{0.75}\geq |z|$$, or simply $$xy^3\geq z^4$$ with $$x,y\geq 0$$.

For other types of cones supported by MOSEK, see Sec. 14.8 (Supported domains) and the other tutorials in this chapter. Different cone types can appear together in one optimization problem.

## 7.3.1 Example POW1¶

Consider the following optimization problem which involves powers of variables:

(7.3)$\begin{split}\begin{array} {lrcl} \mbox{maximize} & x_0^{0.2}x_1^{0.8} + x_2^{0.4} - x_0 & & \\ \mbox{subject to} & x_0+x_1+\frac12 x_2 & = & 2, \\ & x_0,x_1,x_2 & \geq & 0. \end{array}\end{split}$

We convert (7.3) into affine conic form using auxiliary variables as bounds for the power expressions:

(7.4)$\begin{split}\begin{array} {lrcl} \mbox{maximize} & x_3 + x_4 - x_0 & & \\ \mbox{subject to} & x_0+x_1+\frac12 x_2 & = & 2, \\ & (x_0,x_1,x_3) & \in & \POW_3^{0.2,0.8}, \\ & (x_2,1.0,x_4) & \in & \POW_3^{0.4,0.6}. \end{array}\end{split}$

The two conic constraints shown in (7.4) can be expressed in the ACC form as shown in (7.5):

(7.5)$\begin{split}\left[\begin{array}{ccccc}1&0&0&0&0\\0&1&0&0&0\\0&0&0&1&0\\0&0&1&0&0\\0&0&0&0&0\\0&0&0&0&1\end{array}\right] \left[\begin{array}{c}x_0\\x_1\\x_2\\x_3\\x_4\end{array}\right] + \left[\begin{array}{c}0\\0\\0\\0\\1\\0\end{array}\right] \in \POW^{0.2,0.8}_3 \times \POW^{0.4,0.6}_3.\end{split}$

We start by creating the optimization model:

    Model M = new Model("pow1");


We then define the variable x corresponding to the original problem (7.3), and auxiliary variables appearing in the conic reformulation (7.4).

      Variable x  = M.variable("x", 3, Domain.unbounded());
Variable x3 = M.variable();
Variable x4 = M.variable();


The linear constraint is defined using the dot product operator Expr.dot:

      // Create the linear constraint
double[] aval = new double[] {1.0, 1.0, 0.5};
M.constraint(Expr.dot(x, aval), Domain.equalsTo(2.0));


The primal power cone is referred to via Domain.inPPowerCone with an appropriate list of variables or expressions in each case.

      // Create the conic constraints
M.constraint(Var.vstack(x.slice(0,2), x3), Domain.inPPowerCone(0.2));
M.constraint(Expr.vstack(x.index(2), 1.0, x4), Domain.inPPowerCone(0.4));


We only need the objective function:

      // Set the objective function
double[] cval = new double[] {1.0, 1.0, -1.0};
M.objective(ObjectiveSense.Maximize, Expr.dot(cval, Var.vstack(x3, x4, x.index(0))));


Calling the Model.solve method invokes the solver:

      M.solve();


The primal and dual solution values can be retrieved using Variable.level, Constraint.level and Variable.dual, Constraint.dual. Here we just display the primal solution

      // Get the linear solution values
double[] solx = x.level();
System.out.printf("x, y, z = %e, %e, %e\n", solx, solx, solx);


which is

[ 0.06389298  0.78308564  2.30604283 ]

Listing 7.3 Fusion implementation of model (7.3). Click here to download.
package com.mosek.fusion.examples;
import mosek.fusion.*;

public class pow1 {
public static void main(String[] args)
throws SolutionError {
Model M = new Model("pow1");
try {
Variable x  = M.variable("x", 3, Domain.unbounded());
Variable x3 = M.variable();
Variable x4 = M.variable();

// Create the linear constraint
double[] aval = new double[] {1.0, 1.0, 0.5};
M.constraint(Expr.dot(x, aval), Domain.equalsTo(2.0));

// Create the conic constraints
M.constraint(Var.vstack(x.slice(0,2), x3), Domain.inPPowerCone(0.2));
M.constraint(Expr.vstack(x.index(2), 1.0, x4), Domain.inPPowerCone(0.4));

// Set the objective function
double[] cval = new double[] {1.0, 1.0, -1.0};
M.objective(ObjectiveSense.Maximize, Expr.dot(cval, Var.vstack(x3, x4, x.index(0))));

// Solve the problem
M.solve();

// Get the linear solution values
double[] solx = x.level();
System.out.printf("x, y, z = %e, %e, %e\n", solx, solx, solx);
} finally {
M.dispose();
}
}
}