02 - Converters for Quadratic Programs
[1]:
# This code is from:
# https://qiskit-community.github.io/qiskit-optimization/tutorials/02_converters_for_quadratic_programs.html
[2]:
from qiskit_optimization import QuadraticProgram
from qiskit_optimization.translators.docplex_mp import to_docplex_mp
[3]:
qp = QuadraticProgram()
qp.binary_var("x")
qp.binary_var("y")
qp.integer_var(lowerbound=0, upperbound=7, name="z")
qp.maximize(linear={"x": 3, "y": 2, "z": 1})
qp.linear_constraint(linear={"x": 1, "y": 1, "z": 1}, sense="LE", rhs=5.5, name="xyz_leq")
qp.linear_constraint(linear={"x": 1, "y": 1, "z": 1}, sense="GE", rhs=2.5, name="xyz_geq")
print(qp.prettyprint())
Problem name:
Maximize
3*x + 2*y + z
Subject to
Linear constraints (2)
x + y + z <= 5.5 'xyz_leq'
x + y + z >= 2.5 'xyz_geq'
Integer variables (1)
0 <= z <= 7
Binary variables (2)
x y
[4]:
from qiskit_optimization.converters import InequalityToEquality
[5]:
ineq2eq = InequalityToEquality()
qp_eq = ineq2eq.convert(qp)
print(qp_eq.prettyprint())
Problem name:
Maximize
3*x + 2*y + z
Subject to
Linear constraints (2)
x + xyz_leq@int_slack + y + z == 5 'xyz_leq'
x - xyz_geq@int_slack + y + z == 3 'xyz_geq'
Integer variables (3)
0 <= z <= 7
0 <= xyz_leq@int_slack <= 5
0 <= xyz_geq@int_slack <= 6
Binary variables (2)
x y
[6]:
from qiskit_optimization.algorithms import CplexOptimizer
cplex_optimizer = CplexOptimizer()
[7]:
result_orig = cplex_optimizer.solve(qp)
print(result_orig)
fval=8.0, x=1.0, y=1.0, z=3.0, status=SUCCESS
[8]:
result_eq = cplex_optimizer.solve(qp_eq)
print(result_eq)
fval=8.0, x=1.0, y=1.0, z=3.0, xyz_leq@int_slack=0.0, xyz_geq@int_slack=2.0, status=SUCCESS
[9]:
print("interpreting values of result_eq:", ineq2eq.interpret(result_eq.x))
print("values of result_orig:", result_orig.x)
interpreting values of result_eq: [1. 1. 3.]
values of result_orig: [1. 1. 3.]
[10]:
print(qp_eq.prettyprint())
Problem name:
Maximize
3*x + 2*y + z
Subject to
Linear constraints (2)
x + xyz_leq@int_slack + y + z == 5 'xyz_leq'
x - xyz_geq@int_slack + y + z == 3 'xyz_geq'
Integer variables (3)
0 <= z <= 7
0 <= xyz_leq@int_slack <= 5
0 <= xyz_geq@int_slack <= 6
Binary variables (2)
x y
[11]:
from qiskit_optimization.converters import IntegerToBinary
[12]:
int2bin = IntegerToBinary()
qp_eq_bin = int2bin.convert(qp_eq)
print(qp_eq_bin.prettyprint())
Problem name:
Maximize
3*x + 2*y + z@0 + 2*z@1 + 4*z@2
Subject to
Linear constraints (2)
x + xyz_leq@int_slack@0 + 2*xyz_leq@int_slack@1 + 2*xyz_leq@int_slack@2 + y
+ z@0 + 2*z@1 + 4*z@2 == 5 'xyz_leq'
x - xyz_geq@int_slack@0 - 2*xyz_geq@int_slack@1 - 3*xyz_geq@int_slack@2 + y
+ z@0 + 2*z@1 + 4*z@2 == 3 'xyz_geq'
Binary variables (11)
x y z@0 z@1 z@2 xyz_leq@int_slack@0 xyz_leq@int_slack@1 xyz_leq@int_slack@2
xyz_geq@int_slack@0 xyz_geq@int_slack@1 xyz_geq@int_slack@2
[13]:
result_eq = cplex_optimizer.solve(qp_eq)
print(result_eq)
fval=8.0, x=1.0, y=1.0, z=3.0, xyz_leq@int_slack=0.0, xyz_geq@int_slack=2.0, status=SUCCESS
[14]:
result_eq_bin = cplex_optimizer.solve(qp_eq_bin)
print(result_eq_bin)
fval=8.0, x=1.0, y=1.0, z@0=1.0, z@1=1.0, z@2=0.0, xyz_leq@int_slack@0=0.0, xyz_leq@int_slack@1=0.0, xyz_leq@int_slack@2=0.0, xyz_geq@int_slack@0=0.0, xyz_geq@int_slack@1=1.0, xyz_geq@int_slack@2=0.0, status=SUCCESS
[15]:
print("interpreting values of result_eq_bin:", int2bin.interpret(result_eq_bin.x))
print("values of result_eq:", result_eq.x)
interpreting values of result_eq_bin: [1. 1. 3. 0. 2.]
values of result_eq: [1. 1. 3. 0. 2.]
[16]:
print(qp_eq_bin.prettyprint())
Problem name:
Maximize
3*x + 2*y + z@0 + 2*z@1 + 4*z@2
Subject to
Linear constraints (2)
x + xyz_leq@int_slack@0 + 2*xyz_leq@int_slack@1 + 2*xyz_leq@int_slack@2 + y
+ z@0 + 2*z@1 + 4*z@2 == 5 'xyz_leq'
x - xyz_geq@int_slack@0 - 2*xyz_geq@int_slack@1 - 3*xyz_geq@int_slack@2 + y
+ z@0 + 2*z@1 + 4*z@2 == 3 'xyz_geq'
Binary variables (11)
x y z@0 z@1 z@2 xyz_leq@int_slack@0 xyz_leq@int_slack@1 xyz_leq@int_slack@2
xyz_geq@int_slack@0 xyz_geq@int_slack@1 xyz_geq@int_slack@2
[17]:
from qiskit_optimization.converters import LinearEqualityToPenalty
[18]:
lineq2penalty = LinearEqualityToPenalty()
qubo = lineq2penalty.convert(qp_eq_bin)
print(qubo.prettyprint())
Problem name:
Maximize
-26*x^2 + 26*x*xyz_geq@int_slack@0 + 52*x*xyz_geq@int_slack@1
+ 78*x*xyz_geq@int_slack@2 - 26*x*xyz_leq@int_slack@0
- 52*x*xyz_leq@int_slack@1 - 52*x*xyz_leq@int_slack@2 - 52*x*y - 52*x*z@0
- 104*x*z@1 - 208*x*z@2 - 13*xyz_geq@int_slack@0^2
- 52*xyz_geq@int_slack@0*xyz_geq@int_slack@1
- 78*xyz_geq@int_slack@0*xyz_geq@int_slack@2 - 52*xyz_geq@int_slack@1^2
- 156*xyz_geq@int_slack@1*xyz_geq@int_slack@2 - 117*xyz_geq@int_slack@2^2
- 13*xyz_leq@int_slack@0^2 - 52*xyz_leq@int_slack@0*xyz_leq@int_slack@1
- 52*xyz_leq@int_slack@0*xyz_leq@int_slack@2 - 52*xyz_leq@int_slack@1^2
- 104*xyz_leq@int_slack@1*xyz_leq@int_slack@2 - 52*xyz_leq@int_slack@2^2
+ 26*y*xyz_geq@int_slack@0 + 52*y*xyz_geq@int_slack@1
+ 78*y*xyz_geq@int_slack@2 - 26*y*xyz_leq@int_slack@0
- 52*y*xyz_leq@int_slack@1 - 52*y*xyz_leq@int_slack@2 - 26*y^2 - 52*y*z@0
- 104*y*z@1 - 208*y*z@2 + 26*z@0*xyz_geq@int_slack@0
+ 52*z@0*xyz_geq@int_slack@1 + 78*z@0*xyz_geq@int_slack@2
- 26*z@0*xyz_leq@int_slack@0 - 52*z@0*xyz_leq@int_slack@1
- 52*z@0*xyz_leq@int_slack@2 - 26*z@0^2 - 104*z@0*z@1 - 208*z@0*z@2
+ 52*z@1*xyz_geq@int_slack@0 + 104*z@1*xyz_geq@int_slack@1
+ 156*z@1*xyz_geq@int_slack@2 - 52*z@1*xyz_leq@int_slack@0
- 104*z@1*xyz_leq@int_slack@1 - 104*z@1*xyz_leq@int_slack@2 - 104*z@1^2
- 416*z@1*z@2 + 104*z@2*xyz_geq@int_slack@0 + 208*z@2*xyz_geq@int_slack@1
+ 312*z@2*xyz_geq@int_slack@2 - 104*z@2*xyz_leq@int_slack@0
- 208*z@2*xyz_leq@int_slack@1 - 208*z@2*xyz_leq@int_slack@2 - 416*z@2^2
+ 211*x - 78*xyz_geq@int_slack@0 - 156*xyz_geq@int_slack@1
- 234*xyz_geq@int_slack@2 + 130*xyz_leq@int_slack@0 + 260*xyz_leq@int_slack@1
+ 260*xyz_leq@int_slack@2 + 210*y + 209*z@0 + 418*z@1 + 836*z@2 - 442
Subject to
No constraints
Binary variables (11)
x y z@0 z@1 z@2 xyz_leq@int_slack@0 xyz_leq@int_slack@1 xyz_leq@int_slack@2
xyz_geq@int_slack@0 xyz_geq@int_slack@1 xyz_geq@int_slack@2
[19]:
result_eq_bin = cplex_optimizer.solve(qp_eq_bin)
print(result_eq_bin)
fval=8.0, x=1.0, y=1.0, z@0=1.0, z@1=1.0, z@2=0.0, xyz_leq@int_slack@0=0.0, xyz_leq@int_slack@1=0.0, xyz_leq@int_slack@2=0.0, xyz_geq@int_slack@0=0.0, xyz_geq@int_slack@1=1.0, xyz_geq@int_slack@2=0.0, status=SUCCESS
[20]:
result_qubo = cplex_optimizer.solve(qubo)
print(result_qubo)
fval=8.0, x=1.0, y=1.0, z@0=1.0, z@1=1.0, z@2=0.0, xyz_leq@int_slack@0=0.0, xyz_leq@int_slack@1=0.0, xyz_leq@int_slack@2=0.0, xyz_geq@int_slack@0=0.0, xyz_geq@int_slack@1=1.0, xyz_geq@int_slack@2=0.0, status=SUCCESS
[21]:
print("interpreting values of result_eq_bin:", lineq2penalty.interpret(result_qubo.x))
print("values of result_eq_bin:", result_eq_bin.x)
interpreting values of result_eq_bin: [1. 1. 1. 1. 0. 0. 0. 0. 0. 1. 0.]
values of result_eq_bin: [1. 1. 1. 1. 0. 0. 0. 0. 0. 1. 0.]
[22]:
print("result_orig.x", result_orig.x)
x = result_qubo.x
for conv in [lineq2penalty, int2bin, ineq2eq]:
x = conv.interpret(x)
print("interpreting result_qubo.x", x)
result_orig.x [1. 1. 3.]
interpreting result_qubo.x [1. 1. 3.]
[ ]: