# Convert problem to cvx

@Mark_L_Stone hello again, I have worked on my cvx code since then, but unfortunately I have not been able to solve it.
you told me to write 2^(R/k) as exp(Rlog(2)/k) and then to rewrite them as:
k
exp(Rlog(2)/k)
I figured that means this and I don’t know if I’m right:
(sum(bw/ChannelGainUN(row)).
(exp(currentUsersMinRate(i)*log(2))/bw)-1)

and till now this is what I am trying to minimize and my variable is Bw which is an array of bandwidths for n users.

I followed those two links and this is what I did according to what has been told there:

for i=1:n
cvx_begin;
variable bw(n);
sum(bw)==MaxBandwidthOfEachRRH(row);
bw>=0;
z=(bw/ChannelGainUN(row)).*(exp(currentUsersMinRate(i)*log(2))/bw)-1;
{(currentUsersMinRate(i)*log(2)),bw,z}==exponential(1);
minimize(sum(bw/ChannelGainUN(row)).*(exp(currentUsersMinRate(i)*log(2))/bw)-1);
cvx_end;

but I am not getting anything but errors. I know that I am doing it wrong but I cant fix it. could you please help me with it? I have a very short time to solve this, I would really appreciate any help.

I don’t have time to write it out carefully, but note:
z must be declared a variable.
Remove the line z = …,. .
Use z in place of the expression being replaced in the objective function.
You need a separate z for each term in the sum in the objective function sun, so declare variable z(n) and put (…,z(i)) = exponential(1) inside a for loop over i.
Get rid of the for statement you now ihave n the first line.

You need to write your objective in terms of z. You may have other errors, I haven’t checked.

@Mark_L_Stone

Remove the line z = …,. .

if I remove z=… where can I declare what do I mean by z?
because when I remove it, I get an error that z is not declared.

Use z in place of the expression being replaced in the objective function.

you mean in place of bw? I don’t get it correctly…

so declare variable z(n)

so I have to remove bw(n)? or declare them both like: variable bw(n), z(n)

Get rid of the for statement you now ihave n the first line.

yes I forgot to remove it, thanks.

sorry for many many questions I am asking. using CVX for the first time is really confusing…

Unfortunately, you started with a tricky problem on which to start using CVX.

As I wrote above, z needs to be declared a (CVX) variable. Given that you really need z to be a length n,vector, and still need bw to be a CVX variable, you can use
variables bw(n) z(n)

I’m not sure I understand the relation between your code and the problem in your first post, so I will present code as if the simplified 1-D indexing in your code covers your situation, and guess on variable names. Otherwise, you will need to make modifications. You should be able to figure out how to modify my code if doiesn’t quite match your problem.

cvx_begin
variables bw(n) z(n)
minimize(sum((z-bw)./ChannelGainUN))
for i=1:n
{currentUsersMinRate(i)*log(2),bw(i),z(i)} == exponential(1)
end
sum(bw) == MaxBandwidthOfEachRRH
bw >= 0
cvx_end

I made up some (I suppose non-sensical) data, ran the code, and it produced an answer. No guarantees beyond that.

n = 5;
ChannelGainUN = [1.1:.1:1.5]';
currentUsersMinRate = [3.2 2.1 1.4 2.6 5.3]';

With result:

CVX Warning:
Models involving "exponential" or other functions in the log, exp, and entropy
family are solved using an experimental successive approximation method.
This method is slower and less reliable than the method CVX employs for
other models. Please see the section of the user's guide entitled
The successive approximation method
for more details about the approach, and for instructions on how to
suppress this warning message in the future.

Successive approximation method to be employed.
For improved efficiency, SDPT3 is solving the dual problem.
SDPT3 will be called several times to refine the solution.
Original size: 21 variables, 10 equality constraints
5 exponentials add 40 variables, 25 equality constraints
-----------------------------------------------------------------
Cones  |             Errors              |
Mov/Act | Centering  Exp cone   Poly cone | Status
--------+---------------------------------+---------
5/  5 | 3.021e+00  6.360e-01  0.000e+00 | Solved
5/  5 | 6.867e-01  2.941e-02  0.000e+00 | Solved
5/  5 | 7.530e-02  3.598e-04  0.000e+00 | Solved
5/  5 | 9.459e-03  5.666e-06  0.000e+00 | Solved
5/  5 | 1.189e-03  8.907e-08  0.000e+00 | Solved
0/  5 | 1.492e-04  1.100e-09  0.000e+00 | Solved
-----------------------------------------------------------------
Status: Solved
Optimal value (cvx_optval): +64.154

disp(bw)
0.683591761913353
0.440268935079385
0.288547159549769
0.527562346711498
1.060029796730820

@Mark_L_Stone

thank you so much for this, there is just one problem:

minimize(sum((z-bw)./ChannelGainUN))

in here when I start debuging, z and bw are 4 × 1 arrays and ChannelGainUN is a 1 × 5. so they can not be divided and there is a “Matrix dimensions must agree” error. can I change z and bw to an array with 1 row? so they agree?

my arrays is:
currentUsersMinRate=[0.1,1,10,0.1,1]

and in my problem and in this part, channel gain is a single number.

Everything in my example data is 5 by 1, including ChannelGainUN = [1.1:.1:1.5]' , so it was all compatible and successfully ran. I just made up the data so I could check that there were no syntax errors and that ir ran successfully. You should be able to duplicate my results.

I presume that you have or will obtain actual input data which you want to use. Of course, you should make the dimensions of everything compatible. You can make adjustments to my program as needed to match your data and problem.

@Mark_L_Stone
yes your example is totally correct, but my channelgainUN is a signle number, and when I put that is here:

minimize(sum((z-bw)./ChannelGainUN))

it gives no errors but it does not solve it and says that its infeasible.

If you show a complete reproducible example, with all input data, then perhaps we can diagnose your problem.

@Mark_L_Stone

yes sure

Let’s make this simpler. Just display with format long all the input data used by your CVX code.

gainofthisRRH
currentUsersMinRate
MaxBandwidthOfEachRRH

Please show the CVX and solver output you got when you ran your code which you wrote “says that its infeasible”/

i gave these values:

gainofthisRRH=15;
currentUsersMinRate=[0.1,1,10,0.1]
MaxBandwidthOfEachRRH=20;

I changed the MaxBandwidthOfEachRRH to a single number (i had given an array before but it was a mistake) and now it says "solved"
and now it gives me 4 values for bw:

disp(bw)
0.1786
1.7857
17.8571
0.1786

and this is the output:

Successive approximation method to be employed.
For improved efficiency, SDPT3 is solving the dual problem.
SDPT3 will be called several times to refine the solution.
Original size: 16 variables, 7 equality constraints
4 exponentials add 32 variables, 20 equality constraints
Cones | Errors |
Mov/Act | Centering Exp cone Poly cone | Status
--------±--------------------------------±--------
4/ 4 | 6.429e-01 2.889e-02 0.000e+00 | Solved
4/ 4 | 2.916e-02 6.174e-05 0.000e+00 | Solved
2/ 4 | 1.786e-03 2.098e-07 0.000e+00 | Solved
0/ 0 | 0.000e+00 0.000e+00 0.000e+00 | Solved
Status: Solved
Optimal value (cvx_optval): +0.474269

thank you so much for your help

After solution, bw should be an n by 1 vector containing the optimal values.

After cvx_end, you have the statement bandwidth(i)=max(0,bw(i)); This will only be executed for the then current value of i, which is n (because it had been used as the index of a for loop from 1 to n). If an optimal solution has been obtained, bw should be non-negative anyhow, unless you are worried about roundoff-level negative values. If you really want to do this, then use bandwidth = max(0,bw); which will ensure each element is non-negative.

it gives me 4 bw s now, thank you so much for your help

@Mark_L_Stone hi again, I have a new question that is related to this one. I need to add the constraint below to my cvx optimization. how can I add it to my code?

I want my cvx code to minimize the current problem that i mentioned above and it also shoud minimize the power in a way that 1/(bw.log2((1+power.gain)/bw(0.1+Interference)) is minimized too.
this is my current cvx code:

cvx_begin;
variables bw(n) z(n);
minimize(sum((z-bw)./gainofthisRRH));
for i=1:n
{a(i)*log(2),bw(i),z(i)} == exponential(1);
end
sum(bw) == maxbwofthisrrh;
bw >= 0;
cvx_end;
bw = bw.';
for i=1:n
bandwidth(i)=max(0,bw(i));
end

is there any way to achieve this?

You seem to have some missing symbols in your additional objective, so I am not sure what it is, and whether it is convex and expressible in CVX.

Presuming that it is convex and expressible in CVX, either combine both objectives in a way which makes sense to you., such as a weighted sum, or minimize one of the objectives subject to an additional constraint that the other objective <= u, where u is a constant you choose. If u is too small, the problem might be infeasible. By varying u, you can map out an efficient frontier of optimal tradeoffs between the two objectives.

I actually made some changes to make it easier to solve. so I came up with adding the phrase below:

∑k∈Kn 1/(b(w).R(k,min))

to the previous one.
and b(w) is the same as the previous problem, and is the variable that I am looking for. and R(k,min) is the same R(k,min) in the previous problem, I mean currentUsersMinRate. so it’s and array in size of Kn

so I need to minimize this phrase:

+ ∑k∈Kn 1/(b(w).R(k,min))

what should I add to my CVX code?

I don’t understand what problem you want to solve. Do you want to add an additional term to your existing objective function? If so, can you write this new term in MATLAB, even if is not legal in CVX? Be sure to make clear what variables would be CVX (optimization) variables and what is input data. Also, use the same variable names as before for anything which is supposed to be the same variables as before. It might be best to show the complete program. At least that way we can see the problem you want to solve.

Of course, this additional term better be convex.

Do you maybe want to use inv_pos? But I don’t understand what R(k,min) is.

yes, I want to add and additional term to my current objective function. I have calculated the second term and its is convex. so I need to minimize the sum of both phrases.
I mean something like this. (I don’t know how to add R(k,min) to my cvx.

cvx_begin;
variables bw(n) z(n);
minimize(sum((z-bw)./gainofthisRRH)+sum(1./bw*R(k,min));
for i=1:n
{a(i)*log(2),bw(i),z(i)} == exponential(1);
end
sum(bw) == maxbwofthisrrh;
bw >= 0;
cvx_end;
bw = bw.';