Using rel_entr in cvx for : x*log2(1+a*Trace(b*y)/x)


I am debugging my code, kindly help

A=rand(2,2)+1i * rand(2,2);
variable x nonnegative;
variable y(2,2) complex semidefinite;
obj= -rel_entr(x, x+B * trace(A * y))/log(2);
maximize obj;
subject to
x <= 1;
trace(A * y) <= 5;

This code is giving me an error :
Error using cvx/rel_entr (line 71)
Disciplined convex programming error:
Illegal operation: rel_entr( {real affine}, {complex affine} ).

Error in CVX_debug_trace_mul (line 9)
obj=-rel_entr(x,x+Btrace(Ay))/log(2); %xlog2(1+aTrace(b*y)/x), a and b are constants

In this case :
variable x(2) nonnegative;
variable t(2) nonnegative
variable y(2,2) semidefinite;
obj=-rel_entr(t(2,1),t(2,1)+B * trace(A * y))/log(2);
maximize obj;
subject to
t(1,1)+t(2,1) <= 1;
x(1,1)+x(2,1)<=trace(A * y);

The code is not giving any error but status is Failed.
In my code, A is a complex double matrix. What can be done in this regard? Kindly do needful.
Thank you.

1 Like

The arguments of rel_entr must be real.

Stepping back to look at this as an optimization problem, without regard for CVX or its rules, your objective function is complex. What does it mean to maximize a complex variable? is 2+i greater than 3-i?

Your objective function must evaluate to real scalar. It is your problem (or wherever you got it from), not mine, so i don’t know what the fix should be. Maybe you want real(trace(....)), and also in the constraint?

1 Like