0

I am solving a convex problem using cvxpy. The constraints are rather simple, there are 3 variables, but we could eliminate one. The objective is convex and involves the entropy and logarithm. The solution is correct, in the sense that the variables have the expected values. Howver the objective value should be around -1.06, but it is infinite. Is there a bug with evaluating involved expressions ?

#!/usr/bin/env python3

import cvxpy as cx
import numpy as np

from math import log

def entr(x):
    return -x * log(x)


def check_obj(a, b, c):
    return -entr(2.0) + -2.0 * log(2.0) + -entr(1.0 + a) + -1.0  + a * log(2.0) + -entr(2.0 + a) -2.0  + a * log(1.0)  -entr(1.0  + a + b + c) + -1.0 + a + b + c * log(2.0) + -entr(2.0) + -2.0 * log(2.0) + -entr(1.0 + b) -1.0  + b * log(2.0) + -entr(2.0 + b) + -2.0 + b * log(1.0)  -entr(1.0 + b + a + c) -1.0 + b + a + c * log(2.0)

a = cx.Variable(name='a')
b = cx.Variable(name='b')
c = cx.Variable(name='c')
obj = -cx.entr(2.0) + -2.0 * cx.log(2.0) + -cx.entr(1.0 + a) + -1.0  + a * cx.log(2.0) + -cx.entr(2.0 + a) -2.0  + a * cx.log(1.0)  -cx.entr(1.0  + a + b + c) + -1.0 + a + b + c * cx.log(2.0) + -cx.entr(2.0) + -2.0 * cx.log(2.0) + -cx.entr(1.0 + b) -1.0  + b * cx.log(2.0) + -cx.entr(2.0 + b) + -2.0 + b * cx.log(1.0)  -cx.entr(1.0 + b + a + c) -1.0 + b + a + c * cx.log(2.0)

p = cx.Problem(cx.Minimize(obj), [0 <= a, 0<= b, 0 <= c, a + b + c == 1])
p.solve()

# should be 'optimal' and indeed it is
print(p.status)

# the following two values should be the same, but p.value is infinite and should be around -1.06
print(p.value)
print(check_obj(a.value, b.value, c.value))

1 Answers1

0

It looks like a bug in the entropy atom. I fixed it and made a pull request here. It is merged now. If you run your code with the latest cvxpy from the master branch it should give correct results.

bstellato
  • 160
  • 1
  • 6