Solver claims solution is optimal, but violates constraints
- Dominant language
- JetBrains MPS
- Stars
- 192
- Forks
- 70
- PR merge metrics
- No merged PRs in 30d
Description
## tldr
I'm trying to add booleans together, hoping that the result is a boolean OR. I'm expecting a boolean OR, XOR, or an error, or `INFEASIBLE`. But what happens is that the solver violates other constraints to satisfy the addition.
## Minimum working example
````
import cvxpy
from cvxopt.modeling import op
from cvxopt.modeling import variable, op, max, sum
import cylp
A = cvxpy.Bool(name='A')
B = cvxpy.Bool(name='B')
C = cvxpy.Bool(name='C')
constr = [] # constraints list
constr.append(A == 1)
constr.append(B == 1)
# trying to implement A or B
# not sure if addition works as boolean or
constr.append(C == A + B)
# I also tried this
#constr.append(1.0*C == 1.0*A + 1.0*B)
# I don't care what the objective is,
#all states are constrained to a single value
obj = cvxpy.Maximize(A)
problem = cvxpy.Problem(obj, constr)
ret = problem.solve(solver=cvxpy.CBC)
print('problem.status == %s' % problem.status)
assert(problem.status in [cvxpy.OPTIMAL, cvxpy.OPTIMAL_INACCURATE])
print('A:%f | B:%f | C:%f' % tuple([x.value for x in [A,B,C]]))
````
## Expected output
* A == 1 and B == 1, because that's what the constraints explicitly state.
* If the solver does not know how to sum two true booleans (state C), it should throw an error, or return `INFEASIBLE`.
## Observed output
* A == 0 and B == 0, even though I specified exactly that through the constraints
* Solver claims solution is 'optimal'
## Comments
My third constraint seems to be causing issues. I understand that summing booleans is a bit odd, I was just wondering/hoping that it would work.
The issue here is that when the solver encounters this odd third constraint, it violates the first two constraints and claims the solution is optimal.
When I run this, I do see some `FutureWarning`s. They sound like they are not of consequence, but could they be the cause of the problem?
The output when I run this code is:
````
matt@machine:~/muckaround/opt$ python simple2.py
/usr/local/lib/python2.7/dist-packages/cvxpy/problems/solvers/cbc_intf.py:143: FutureWarning: comparison to `None` will result in an elementwise object comparison in the future.
x = model.addVariable('x', n)
/usr/local/lib/python2.7/dist-packages/cylp/py/modeling/CyLPModel.py:193: FutureWarning: comparison to `None` will result in an elementwise object comparison in the future.
if (other == None):
/usr/local/lib/python2.7/dist-packages/cylp/py/modeling/CyLPModel.py:516: FutureWarning: comparison to `None` will result in an elementwise object comparison in the future.
if self.lower == None:
/usr/local/lib/python2.7/dist-packages/cvxpy/problems/solvers/cbc_intf.py:153: FutureWarning: comparison to `None` will result in an elementwise object comparison in the future.
model += A[0:dims[s.EQ_DIM], :] * x == b[0:dims[s.EQ_DIM]]
problem.status == optimal
A:0.000000 | B:0.000000 | C:0.000000
````
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.