SDP constraint must be square

Uncategorized
Sep 28, 2023
S

Hello,

I am working on a convex optimization problem using the CVX toolbox, where I employ the Big-M formulation to address a SDP problem. My declared variables within the cvx_begin sdp environment are:

variable W(M, M, N) hermitian semidefinite
variable W_tilde(M, M, N, J) hermitian semidefinite
variable c(N, J) nonnegative

I constrain the variable c to be between 0 and 1 as it is a continuous variable. However, I encounter the following error when I run my program:

Error using cvxprob/newcnstr
SDP constraint must be square.

Error in variable (line 191)
    newcnstr( prob, v, 0, '>=', false );

This error seems to be associated with the variable c(N, J). Could you provide guidance on how to resolve this issue? Thank you!

J

Could you show the code line that threw this error ?

S
Replying to #3

Please find the code below:

    cvx_begin sdp 
    variable W(M, M, N) hermitian semidefinite
    variable W_tilde(M, M, N, J) hermitian semidefinite
    variable c(N, J) nonnegative
    expressions y(N, J) z(N, J) R(N, 1)

    % Define the objective function
    for n = 1:N
        W_int_n = W_int(:, :, n);
        W_n = W(:, :, n);
        H_n = squeeze(H(n, :, :));

        % Initialize x
        x = cvx(zeros(1, 1));

        % Loop over j
        for j = 1:J
            W_tilde_nj = W_tilde(:, :, n, j);
            F_nj = squeeze(F(n, j, :, :));
            alpha_nj = alpha(n, j);

            % Update x
            x = x + alpha_nj * trace(F_nj * W_tilde_nj)/sigma;
        end

        % Calculate constant terms
        tr_Hn_Wn = trace(H_n * W_n);
        tr_Hn_Wintn = trace(H_n * W_int_n);

        % Update R
        R(n) = real(log(x + beta_sic * tr_Hn_Wn + 1) / log2) ...
            - real(log(beta_sic * tr_Hn_Wintn + 1) / log2) ...
            - real(trace((beta_sic_log2 * H_n / (tr_Hn_Wintn + 1 / beta_sic)) * (W_n - W_int_n)));
    end

    obj = sum(R);
    maximize(obj)

    subject to
    for n = 1:N
        W_n = W(:, :, n);
        H_n = squeeze(H(n, :, :));

        for j = 1:J
            G_jn = squeeze(G(n, j, :, :));
            F_nj = squeeze(F(n, j, :, :));
            W_tilde_nj = W_tilde(:, :, n, j);
            a_m = squeeze(a(n, j, :));
            alpha_nj = alpha(n, j);

            y(n, j) = alpha_nj * trace(a_m * a_m' * W_tilde_nj);
            z(n, j) = alpha_nj * trace(F_nj * W_tilde_nj);

            % C3
            real(trace(G_jn * W_tilde_nj) - P_th/(1 - alpha_nj)) >= 0;
            imag(trace(G_jn * W_tilde_nj) - P_th/(1 - alpha_nj)) == 0;

            % C5
            real(W_tilde_nj - c(n, j) * PmaxEye) <= 0;
            imag(W_tilde_nj - c(n, j) * PmaxEye) == 0;

            % C6
            real(W_tilde_nj - W_n) <= 0;
            imag(W_tilde_nj - W_n) == 0;

            % C7
            real(W_tilde_nj - W_n + (1 - c(n, j)) * PmaxEye) >= 0;
            imag(W_tilde_nj - W_n + (1 - c(n, j)) * PmaxEye) >= 0;
        end
        % C2
        real((trace(H_n * W_n) / (gamma_t_th*sigma)) - sum(z, 2)/sigma - 1) >= 0;
        imag((trace(H_n * W_n) / (gamma_t_th*sigma)) - sum(z, 2)/sigma - 1) >= 0;

        % C4
        trace(W_n) - Pmax <= 0;
    end

    % C1
    real(sum(y, 1)/sigma - gamma_s_th) >= 0;
    imag(sum(y, 1)/sigma - gamma_s_th) == 0;

    % C8
    sum(sum(c - c_int.^2 - 2 * c_int .* (c - c_int))) <= 0;

    % C9
    0 <= c <= 1;
    cvx_end

Also, the error in the command window is given by:

Error using cvxprob/newcnstr
SDP constraint must be square.

Error in variable (line 191)
    newcnstr( prob, v, 0, '>=', false );

Error in Optimiz_W_C (line 40)
    variable c(N, J) nonnegative
J
Replying to #4

try variable c(N,J) ; c(:)>=0; rather than simply “variable c(N,J) nonnegative”. because i guess the latter was like c>=0, which means c is semidefinte in sdp mode, instead of c being nonnegative element-wise.

M

I haven;t checked your code, and it is not reproducible, but your code uses squeeze a lot. Perhaps you have squeezed out a dimension you shouldn’t have, in which case maybe reshape will do what you need. I would suggest you try using whos and perhaps just typing “things” at the command line and seeing how CVX characterizes them. Look for anything which doesn’t have the needed dimensions.

S
Replying to #5

Thank you for your response. Given the nature of the problem as an SDP, it does not accommodate non-square matrices. Here, c(N, J) is a non-square matrix. I employed the Big-M formulation once again. Thus, I defined:

\tilde{W}_k(n) = c_k(n) \cdot W(n),

where W(n) = w(n) \cdot w'(n) and 0 \leq c_k(n) \leq 1 is a scalar. Do you have any advice or suggestions on handling non-square matrices in such scenarios?

M

You need to tell us clearly what the mathematical specification of your optimization problem is. it must be convex, or CVX can’t be used. When you have clearly stated a convex optimization problem, then perhaps readers can help you formulate if for CVX, if they know how.