This question stems from this post) in which I observed that depending on whether I used log_det, sum_log, det_rootn, or geo_mean, cvx returned different solutions. I just wanted to check whether I’m doing anything crazy before filing a bug report. I let K=M=4, let H = randn(K,M) + 1i*randn(K,M), and let P_ant=250. Then I run the following cvx program:
cvx_begin
variable Q(M,M,K) hermitian;
expression expr
for k=1:K
expr(k) = real(1 + H(k,:)*Q(:,:,k)*H(k,:)');
% had to use real() to eliminate a small(?) imaginary component
end
maximize "objective"
for m = 1:M
sum(Q(m,m,:)) <= P_ant;
end
for k = 1:K
range = 1:K;
notk = range(range~=k);
for j = notk
H(j,:)*Q(:,:,k)*H(j,:)' == 0;
end
Q(:,:,k) == hermitian_semidefinite(M);
end
cvx_end
where “objective” can be one of the following:
sum_log(expr)
geo_mean(expr)
log_det(diag(expr))
det_rootn(diag(expr))
When using either log_det(diag(expr)) or det_rootn(diag(expr)), I believe the answer is correct (at least, the objective is never less than a simpler, non-optimal method I use for comparison). However, when using sum_log(expr) or geo_mean(expr), the entries of expr are nearly the same (i.e. expr(1)=expr(2)=…, which is unexpected), and the objective (sum(expr)) is sometimes less than that of the simple comparison method.
I’ve found the same results in cvx-1.2 and cvx-2.0beta. The confusing thing to me is that geo_mean() is exactly equivalent to det_rootn(diag()), and sum_log() is exactly equivalent to log_det(diag()). And when maximizing over these objectives, I believe they should all be equivalent. It’s strange that the two functions that use diag() have the same behavior… am I doing something wrong?