Problem of Mosek solver

I have design a simple optimization code of the precoding matrix in the downlink MIMO scenario.

% Parameters
M = 4; % BS antennas
K = 5; % Users
sigma = db2pow(-80); % Noise power
SINR_th = 1; % SINR threshold

% Random Gaussian channel
H_cas = (randn(K, M) + 1i*randn(K, M)) / sqrt(2);

% Optimizing the precoding
cvx_begin
    cvx_solver mosek
    variable W(M, M, K) complex hermitian semidefinite
    minimize( trace(sum(W, 3)) )
    subject to
        for iter_k = 1:K
            h_k = H_cas(iter_k, :).' * conj(H_cas(iter_k, :));
            interference = real(trace(h_k * (sum(W, 3) - W(:, :, iter_k))));
            real(trace(h_k * W(:, :, iter_k))) >= SINR_th * (interference + sigma);
        end
cvx_end

% Verifying
gamma = zeros(1, K);
for iter_k = 1: K
    h_k = H_cas(iter_k, :).' * conj(H_cas(iter_k, :));
    E_k = real(trace(h_k * W(:, :, iter_k)));
    E_m = real(trace(h_k * (sum(W, 3) - W(:, :, iter_k))));
    gamma(iter_k) = E_k/(E_m + sigma);
end
disp(gamma);

My problem is: The optimization problem W cannot make the SINR \ge 1 hold.
The following is the running log of this code:

Calling Mosek 9.1.9: 85 variables, 5 equality constraints
------------------------------------------------------------

MOSEK Version 9.1.9 (Build date: 2019-11-21 11:34:40)
Copyright (c) MOSEK ApS, Denmark. WWW: mosek.com
Platform: Windows/64-X86

Problem
  Name                   :                 
  Objective sense        : min             
  Type                   : CONIC (conic optimization problem)
  Constraints            : 5               
  Cones                  : 0               
  Scalar variables       : 5               
  Matrix variables       : 5               
  Integer variables      : 0               

Optimizer started.
Presolve started.
Linear dependency checker started.
Linear dependency checker terminated.
Eliminator started.
Freed constraints in eliminator : 0
Eliminator terminated.
Eliminator - tries                  : 1                 time                   : 0.00            
Lin. dep.  - tries                  : 1                 time                   : 0.00            
Lin. dep.  - number                 : 0               
Presolve terminated. Time: 0.00    
Problem
  Name                   :                 
  Objective sense        : min             
  Type                   : CONIC (conic optimization problem)
  Constraints            : 5               
  Cones                  : 0               
  Scalar variables       : 5               
  Matrix variables       : 5               
  Integer variables      : 0               

Optimizer  - threads                : 12              
Optimizer  - solved problem         : the primal      
Optimizer  - Constraints            : 5
Optimizer  - Cones                  : 0
Optimizer  - Scalar variables       : 5                 conic                  : 0               
Optimizer  - Semi-definite variables: 5                 scalarized             : 180             
Factor     - setup time             : 0.00              dense det. time        : 0.00            
Factor     - ML order time          : 0.00              GP order time          : 0.00            
Factor     - nonzeros before factor : 15                after factor           : 15              
Factor     - dense dim.             : 0                 flops                  : 4.19e+04        
ITE PFEAS    DFEAS    GFEAS    PRSTATUS   POBJ              DOBJ              MU       TIME  
0   1.3e+01  0.0e+00  4.1e+01  0.00e+00   4.000000000e+01   0.000000000e+00   1.0e+00  0.02  
1   1.9e+00  2.2e-16  2.8e+00  8.97e-01   6.441256528e+00   2.573274372e-09   1.5e-01  0.03  
2   1.6e-01  2.4e-15  6.6e-02  8.91e-01   5.577200774e-01   7.878263112e-09   1.2e-02  0.03  
3   8.2e-05  3.3e-15  5.9e-07  9.98e-01   2.890545069e-04   8.480372864e-09   6.3e-06  0.03  
4   3.4e-08  2.4e-15  5.3e-12  1.00e+00   1.294791667e-07   8.483527075e-09   2.6e-09  0.05  
5   8.5e-09  2.6e-15  8.7e-13  7.98e-01   5.221510783e-08   1.634224410e-08   6.6e-10  0.05  
6   3.1e-09  2.1e-15  3.5e-13  1.79e-01   7.050103158e-08   4.688096425e-08   2.4e-10  0.05  
7   6.4e-10  2.8e-15  4.1e-14  4.94e-01   7.101180539e-08   6.496732572e-08   5.0e-11  0.05  
Optimizer terminated. Time: 0.06    


Interior-point solution summary
  Problem status  : PRIMAL_AND_DUAL_FEASIBLE
  Solution status : OPTIMAL
  Primal.  obj: 7.1011805391e-08    nrm: 1e-08    Viol.  con: 4e-09    var: 0e+00    barvar: 0e+00  
  Dual.    obj: 6.4967325724e-08    nrm: 6e+00    Viol.  con: 0e+00    var: 4e-16    barvar: 9e-15  
Optimizer summary
  Optimizer                 -                        time: 0.06    
    Interior-point          - iterations : 7         time: 0.05    
      Basis identification  -                        time: 0.00    
        Primal              - iterations : 0         time: 0.00    
        Dual                - iterations : 0         time: 0.00    
        Clean primal        - iterations : 0         time: 0.00    
        Clean dual          - iterations : 0         time: 0.00    
    Simplex                 -                        time: 0.00    
      Primal simplex        - iterations : 0         time: 0.00    
      Dual simplex          - iterations : 0         time: 0.00    
    Mixed integer           - relaxations: 0         time: 0.00    

------------------------------------------------------------
Status: Solved
Optimal value (cvx_optval): +7.10118e-08
 
    0.9488    0.8835    0.8828    0.8804    0.9027

The last line is my verification of users’ SINRs, which are all less than 1.
I try to use the sdpt3 solver, and this problem disappears. So, why does this weird problem occur?

The value of sigma is 1e-8, which might be contributing to what you consider to be undesirable numerical behavior, and is on the edge of being numerically drowned out

Mosek’s solution is satisfying constraints within feasibility tolerance (1e-8), despite the gamma values being less than 1. For the common set of random numbers I used., here are the results for Mosek for:

for iter_k = 1:K
     h_k = H_cas(iter_k, :).' * conj(H_cas(iter_k, :));
     interference = real(trace(h_k * (sum(W, 3) - W(:, :, iter_k))));
     disp(real(trace(h_k * W(:, :, iter_k))) - (SINR_th * (interference + sigma))
 end

    -5.501548383956508e-09
    -1.024760386281478e-08
    -7.553336921204232e-09
    -1.019039193384313e-08
    -1.735891816344296e-08

Comparable figures for SeDuMi (constraint violations by up to 1e-11; hence some gamma slightly less than 1);

   -6.610244745472800e-12
    -9.993355886579664e-12
    -7.372229923401787e-12
    -1.453101157954243e-11
    -1.842235525075595e-11

and SDPT3 (no constraint violations at all, hence gamma values >= 1):

2.160199476201441e-10
 6.255263141681361e-10
 3.321670872656848e-10
 6.269888246591401e-10
 3.782143811010843e-10

All the optimal objective values are within tolerance of each other, in the range of 1.4e-8 to 2.1e-8.

If you require the constraint to be satisfied with “no cheating”, you can try to improve numerical scaling (not sure this is doable) and/or add a small positive number, such as 1e-6 or 1e-7, to the RHS of the constraint.

From a numerical standpoint, all the elements of the “optimal” W are essentially zero. If that is not what you want, it would seem your model needs improvement. How to do so is left to you.

Thank you very much! I will try to solve this problem according to your suggestion.