How to include binary norm constraint in CVX?

I want to include
for k=1:K
for n=1:N
norm(d(n,k)) == binary ;
in my CVX code but I get an error
please guide me on How to include binary norm constraints in CVX?

What does this constraint even mean? You want norm(d(n,k)) to be equal to zero or one?

Anyhow, this seems non-convex, and probably not MIDCP representable But perhaps something could be done if you made clear what kind of variable d is and what your intended constraint is.

I want to represent this as MIDCP
this is entier code:

function [d, cvx_status, cvx_optval] = ...
   iter_opt_prob_3_SOCP(W, G,Hr_prim,Hd,sigma_2,SINR_target,int_users_matrix)

K = size(Hd,2);
N = size(G,1) ;

 % Define a, b and R
        A = zeros(N*K,K);
        B = zeros(K,K);
        for k = 1:K                               % looping over all users
            int_users = int_users_matrix(k,:);    % interfering users
            A(1+(k-1)*N:k*N,k)= diag(Hr_prim(:,k)')*G*W(:,k);
            B(k,k)= Hd(:,k)'*W(:,k);
            for m = int_users
                A(1+(k-1)*N:k*N,m)= diag(Hr_prim(:,k)')*G*W(:,m);
                B(k,m)= Hd(:,k)'*W(:,m);
% -------------------------------------------------------------------------
        cvx_begin sdp
        cvx_solver sedumi %sedumi %SDPT3  %Mosek     % Choose the underlying solver
        cvx_precision best        % Change the cvx numerical precision
        variable d(N,K) complex
%         variable V(N+1,N+1) complex semidefinite;
%         variable a_aux(1,K) nonnegative;   % Auxiliary variables for max sum
        %variable a_aux nonnegative;       % Auxiliary variables for max min
%         expressions  SINR_CONSTR(K) desired(K) interference(K);
        % Define the expressions desired, interference, and SINR_CONSTR
        % in terms of the optimization variables 
        % sinr_fun_handle = @sinr_CONSTRAINT;
        %[desired, interference, SINR_CONSTR] = sinr_fun_handle(V, b, R, SINR_target, sigma_2, all_users, int_users_matrix);
%         for k = 1:K                               % looping over all users
%             int_users       = int_users_matrix(k,:);% interfering users
%             desired(k)      = trace(real(R{k,k}*V)) + square_abs(B{k,k});
%             interference(k) = 0;
%             for m = int_users
%                 interference(k) = ...
%                     interference(k) + ...
%                     trace(real(R{k,m}*V)) + ...
%                     square_abs(B{k,m});
%             end
%             SINR_CONSTR(k)  = ...
%                 desired(k)  -  a_aux(k) - ...
%                 SINR_target * (interference(k) + sigma_2);
%         end

        %all_elements = 1:M+1;
        % Write the optimization problem
%         maximize( sum(a_aux) );
        minimise 0
        subject to
        %SINR_CONSTR == nonnegative(N_users)
        for k = 1:K
            {[conj(B(k,:)'+ A(1+(k-1)*N:k*N,:)'*d(:,k)) ; sqrt(sigma_2)],...
            sqrt(1+1/SINR_target)*real(B(k,k)+d(:,k)' * A(1+(k-1)*N:k*N,k))}...
            == complex_lorentz(K+1); % SINR CONSTRAINT
%             desired(k) >= a_aux(k) + ...
%                 SINR_target * (interference(k) + sigma_2);
            %sqrt(SINR_CONSTR(k)) >= 0
%         diag(V) == ones(N+1,1);
        % Other 2 constraints are already in the definitions of opt variables
        %obj_fn2 >= 0; % Dummy constraint to check/prevent the resulting -ve cvx_optval
        for k = 1 : 1 : K
        for k = 1:K
%         theta_mat = diag(v);
        %Undoing Relaxation
%         for k=1:K
% %         d(:,k)=abs(d(:,k))>=mean(abs(d(:,k)));
% %         d(:,k)=abs(d(:,k));
%         d(:,k)=abs(d(:,k))>=0.5*ones(N,1);
%         end

What specifically do you need help with? I see only two instance of norm, and in both cases they are SOCP constraints which CVX should accept, although the second of those has extraneous ones instead of 1 on the RHS, and which could use norms instead of norm in for loop.

Is the issue that the program in your preceding post relaxes norm equality constraints? if so, the non-relaxed version would not appear to be MIDCP-representable. I still don’t know why you refer to binary.

Yes, This is a relaxed version of this code,
Is this MIDCP-representable?

As Iwrote,the non-relaxed version would not appear to be MIDCP-representable.

1 Like

Thanks a lot,
which approach do you suggest for unrelaxing?

Converting == to <=, which you appear to have already done. Whether that provides a useful solution to your original problem is for you to determine. If the relaxed solution is not useful, then perhaps you should use a non-convex solver, such as available under YALMIP (I think you will need to expand out norm(x) == a to x'*x == a^2, because YALMIP doesn’t allow non-convex use of the 2-norm.).