# Attempting to perform a biconvex optimization with quad_form

Hello, I am trying to perform a biconvex optimization with the following code

cvx_begin
% This is the biconvex optimization
variable sig(4,4) semidefinite
variable x(2,1)
minimize ( quad_form(x,diag([zero_bra * partial_trace_env(kron(eye(2), rho.’) * sig) * > zero_ket;one_bra * partial_trace_env(kron(eye(2), rho.’) * sig) * one_ket])) )
subject to
partial_trace_sys(sig) == eye(2);
trace((kron(diag(x),rho.’))*sig) == 0;
trace((kron(diag(x),d_rho.’))*sig) == 1;
cvx_end

However, I am getting this error:

Either x or (Q,v) must be constant.

Error in TEST (line 65)
minimize ( quad_form(x,diag([zero_bra * partial_trace_env(kron(eye(2), rho.’) * sig) * >zero_ket;one_bra * partial_trace_env(kron(eye(2), rho.’) * sig) * one_ket])) )

What can I do here?

P.S. zero_bra, zero_ket, one_bra, one_ket, rho, d_rho are variables that I’ve defined before and I’m certain that the D in quad_form(x, D) is a square, symmetric matrix. Also, “TEST” is just the name of my file. Thanks!

`x'*Q*x` is non-convex (and non-concave) if both `x` and `Q` are optimization variables or expressions involving them.

CVX is a tool for convex optimization, not bi-convex optimization.

if you’re willing to use Python, you could consider CVXPY with its `DMCP` multi-convex optimization add-on https://github.com/cvxgrp/dmcp . Also see https://web.stanford.edu/~boyd/papers/pdf/dmcp.pdf In Julia, there is a `MultiConvex` add-on for Convex.jl. Or you could hatch your own iterative scheme in CVX, in which case you’d be on your own in getting it robust enough to work reliably to even find a local optimum.

Or just use a non-convex solver, for instance under YALMIP.

2 Likes