2

I am working with the following code:

import sys, numpy as np
import cvxpy as cvx

if __name__ == '__main__':
    sims = np.random.randint(20, 30, size=500)
    center = 30
    n = [500, 1]

    # minimize     p'*log(p)
    # subject to
    #              sum(p) = 1
    #              sum(p'*a) = target1

    A = np.mat(np.vstack([np.ones(n[0]), sims]))
    b = np.mat([1.0, center]).T

    x = cvx.Variable(n)
    obj = cvx.Maximize(cvx.sum(cvx.entr(x)))
    constraints = [A @ x == b]
    prob = cvx.Problem(obj, constraints)
    prob.solve()
    weights = np.array(x.value)

Here the x.value is empty. I am not sure how to modify my above setup. I am trying to readjust the mean of sims to a different value defined by variable center here.

Red
  • 26,798
  • 7
  • 36
  • 58
Zanam
  • 4,607
  • 13
  • 67
  • 143

2 Answers2

1

First in way of debugging: try and use this to see what is the issue:

prob.solve(verbose=True)

and this to check that a solution was found:

print(prob.status)

In your case the problem is infeasible, the linear problem you are trying to solve - doesn't always have a solution. You may introduce an "eps" variable to define the needed accuracy for your problem, or test in advance using a linear algebra library that some solution exists.

Itay Vegh
  • 51
  • 4
1

Remember to check if prob.value is finite before trying to access the values of the variables after calling prob.solve(). As you have a maximization problem, and prob.value returns -inf (see below output), it means that your problem is infeasible:

import sys, numpy as np
import cvxpy as cvx

if __name__ == '__main__':
    sims = np.random.randint(20, 30, size=500)
    center = 30
    n = [500, 1]

    # minimize     p'*log(p)
    # subject to
    #              sum(p) = 1
    #              sum(p'*a) = target1

    A = np.mat(np.vstack([np.ones(n[0]), sims]))
    b = np.mat([1.0, center]).T

    x = cvx.Variable(n)
    obj = cvx.Maximize(cvx.sum(cvx.entr(x)))
    constraints = [A @ x == b]
    prob = cvx.Problem(obj, constraints)
    prob.solve()
    print(prob.value)
    weights = np.array(x.value)

Output:

-inf

From Variable values return 'None' after solving the problem:

Diagnosing infeasibility issues is a common task when using optimization models in practice. Usually you will find either a bug in your code, or you will see that the abstract mathematical model can be infeasible (even if coded up perfectly).

For a quick reference of how it just might be how your abstract mathematical model is infeasible, rather than a bug in your code, you can try either replacing the

constraints = [A @ x == b]

with

constraints = [A @ x >= b] # Outputs 183.9397...

or with

constraints = [A @ x <= b] # Outputs 6.2146...

and you will see that your code works.

Red
  • 26,798
  • 7
  • 36
  • 58