How to model this constraint in a better way?

veca and vecb are know vectors. both of them have M element.
X and z are optimization variable.
M=2000 and N=4;
I am using Mosek.

I have modeled one of the constraints as

 for m=1:M
      for n=1:N

But CVX keeps on running forever!

How can I fix this problem? A better modeling of the constraint? Ned your help

First of all the code looks strange because you overwrite the same z(m) with a new object N times in the loop. I find it unlikely that is what you meant.

Second, does CVX or the solver take the time? Do you have the log output? Do you have reproducible code?

The original problem I have is

for i=1:L
    for j=1:L
        for n=1:N
            if  W(i,j)>0 and i<j

where W (L,L) is a known matrix and is symmetric. X(L,N) is optimization variable.

So, I tried to reduce the size of the problem by extracting all the pairs (i,j) for which W(i,j)>0. So, I removed the if condition.

Now, let’s says there are M such pairs.

veca contains the i’s

vecb contains the j’s

Now, the constraint becomes

for m=1:M
    for n=1:N
        z(m)>=X(veca(m),n)+ X(vecb(m),n)-1;

Am I not doing i right?

That’s not what you wrote first, where you had = and not >=.

More to the point, have you looked where the long runtime is spent? Does the solver get called? Can you post the full log output?

Calling Mosek 9.1.9: 1696 variables, 1172 equality constraints

MOSEK Version 9.1.9 (Build date: 2019-11-21 11:32:15)
Copyright (c) MOSEK ApS, Denmark. WWW:
Platform: MACOSX/64-X86

Name :
Objective sense : min
Type : LO (linear optimization problem)
Constraints : 1172
Cones : 0
Scalar variables : 1696
Matrix variables : 0
Integer variables : 604

Optimizer started.
Mixed integer optimizer started.
Threads used: 12
Presolve started.
Presolve terminated. Time = 0.01
Presolved problem: 604 variables, 1172 constraints, 3516 non-zeros
Presolved problem: 0 general integer, 604 binary, 0 continuous
Clique table size: 80
0 0 1 0 5.3435304069e+02 NA NA 0.1
0 1 1 0 5.3435304069e+02 0.0000000000e+00 100.00 0.1
0 1 1 0 2.6639684719e+02 0.0000000000e+00 100.00 0.1
0 1 1 0 2.5699623154e+02 0.0000000000e+00 100.00 0.1
Cut generation started.
0 1 1 0 2.5699623154e+02 0.0000000000e+00 100.00 0.1
Cut generation terminated. Time = 0.00
0 9 1 0 2.2601093073e+02 0.0000000000e+00 100.00 0.2
7 20 1 0 2.2601093073e+02 0.0000000000e+00 100.00 0.2
22 35 1 0 1.7598504841e+02 0.0000000000e+00 100.00 0.2
29 42 1 0 1.5511410774e+02 0.0000000000e+00 100.00 0.2
36 46 1 0 1.5508072242e+02 0.0000000000e+00 100.00 0.2

and it goes on forever…

That’s very interesting, the relaxation won’t improve at all.

I suggest you first try the latest Mosek 10.0 and if that does not help then save the task file of the problem (instructions in 1 Technical Issues — MOSEK FAQ 10.0.44) and send to Mosek support email.

For a difficult MIP even if the solution starts to converge you may anyhow need to relax termination tolerances from 13.4 The Optimizer for Mixed-Integer Problems — MOSEK Optimization Toolbox for MATLAB 10.0.44 to finish before optimality. It is MIP so no free lunch.

I hope you are not setting cvx_precision best or anything like that. If you do, remove it.

How to use latest version of Mosekin CVX is addressed in How to speed up CVX for sparse, low-rank matrix recovery - #2 by Mark_L_Stone .

To set Mosek MIP absolute gap optimality tolerance to 0;05 and MIP relative gap optimality tolerance to 1% when Mosek is called from CVX

Chnage the specified tolerance as desired.

Thanks. Is there anything I can do with the modeling? Remove the for loop, for example? If so, how can i do it?

But why? It will not help you with the solver time.

Have you tried any of the suggestions? I would be interested to know if it helps making progress on the relaxation. If not then we would really like see the task file at Mosek to check what is going on.