Models and Variables
Variables
[1]:
from qilisdk.common.variables import BinaryVariable, Bitwise, Domain, SpinVariable, Variable
x = Variable("x", domain=Domain.REAL, bounds=(1, 2), encoding=Bitwise, precision=1e-1)
s = SpinVariable("s")
b = BinaryVariable("b")
[2]:
x.to_binary()
[2]:
(0.1) * x(0) + (0.2) * x(1) + (0.4) * x(2) + (0.30000000000000004) * x(3) + (1.0)
[3]:
x.evaluate([0, 1, 0, 0])
[3]:
1.2
Building Terms from Variables
[4]:
t1 = 2 * x + 3
print("t1: ", t1)
t2 = 3 * x**2 + 2 * x + 4
print("t2: ", t2)
t3 = 2 * x + b - 1
print("t3: ", t3)
t4 = t1 - t2
print("t4: ", t4)
t1: (2) * x + (3)
t2: (3) * (x^2) + (2) * x + (4)
t3: (2) * x + b + (-1)
t4: (-1.0) + (-3.0) * (x^2)
[5]:
t3.evaluate({x: 1.5, b: 0})
[5]:
2.0
[6]:
from qilisdk.common.variables import LT
LT(2 * x - 1, 1)
[6]:
(2) * x < (2.0)
Models
Building a simple model
[7]:
from qilisdk.common.model import Model, ObjectiveSense
model = Model("example_model")
model.set_objective(2 * x + 3, label="obj", sense=ObjectiveSense.MINIMIZE)
print(model)
Model name: example_model
objective (obj):
minimize :
(2) * x + (3)
subject to the encoding constraint/s:
x_upper_bound_constraint: x <= (2)
x_lower_bound_constraint: x >= (1)
With Lagrange Multiplier/s:
x_upper_bound_constraint : 100
x_lower_bound_constraint : 100
[8]:
model.set_lagrange_multiplier("x_upper_bound_constraint", 1)
print(model)
Model name: example_model
objective (obj):
minimize :
(2) * x + (3)
subject to the encoding constraint/s:
x_upper_bound_constraint: x <= (2)
x_lower_bound_constraint: x >= (1)
With Lagrange Multiplier/s:
x_upper_bound_constraint : 1
x_lower_bound_constraint : 100
[9]:
model.add_constraint("test_constraint", LT(x, 1.5), lagrange_multiplier=10)
print(model)
Model name: example_model
objective (obj):
minimize :
(2) * x + (3)
subject to the constraint/s:
test_constraint: x < (1.5)
subject to the encoding constraint/s:
x_upper_bound_constraint: x <= (2)
x_lower_bound_constraint: x >= (1)
With Lagrange Multiplier/s:
x_upper_bound_constraint : 1
x_lower_bound_constraint : 100
test_constraint : 10
[10]:
model.evaluate({x: 1.4})
[10]:
{'obj': 5.8, 'test_constraint': 0.0}
[11]:
model.evaluate({x: 2})
[11]:
{'obj': 7.0, 'test_constraint': 10.0}
Building Knapsack model
[12]:
import numpy as np
from qilisdk.common.variables import LEQ
n_items = 3
b = [BinaryVariable(f"b_{i}") for i in range(n_items)]
values = [np.random.randint(0, 10) for _ in range(n_items)]
weights = [np.random.randint(0, 10) for _ in range(n_items)]
max_weight = int(0.6 * sum(weights))
print("Knapsack Instance:")
print("-" * 10)
print()
print("Values = ", values)
print("Weights = ", weights)
print("Maximum allowed weight = ", max_weight)
knapsack = Model("knapsack")
knapsack.set_objective(sum(b[i] * values[i] for i in range(n_items)), sense=ObjectiveSense.MAXIMIZE)
knapsack.add_constraint("maximum_weight", LEQ(sum(b[i] * weights[i] for i in range(n_items)), max_weight))
print("-" * 10)
print("Knapsack Model: ")
print("-" * 10)
print(knapsack)
Knapsack Instance:
----------
Values = [7, 6, 4]
Weights = [1, 3, 2]
Maximum allowed weight = 3
----------
Knapsack Model:
----------
Model name: knapsack
objective (obj):
maximize :
(7) * b_0 + (6) * b_1 + (4) * b_2
subject to the constraint/s:
maximum_weight: b_0 + (3) * b_1 + (2) * b_2 <= (3.0)
With Lagrange Multiplier/s:
maximum_weight : 100
QUBO
[13]:
from qilisdk.common.model import QUBO, ObjectiveSense
model = QUBO("example_qubo_model")
model.set_objective(2 * b[0] + 3, label="obj", sense=ObjectiveSense.MINIMIZE)
model.add_constraint(
"qubo_constraint", LT(2 * b[0], 1), lagrange_multiplier=10, penalization="slack", transform_to_qubo=True
)
print(model)
Model name: example_qubo_model
objective (obj):
minimize :
(2) * b_0 + (3)
subject to the constraint/s:
qubo_constraint: (4.0) * (b_0 * qubo_constraint_slack(0)) + (-1.0) * qubo_constraint_slack(0) == (-1.0)
With Lagrange Multiplier/s:
qubo_constraint : 10
[14]:
print(model.qubo_objective)
obj: (2) * b_0 + (13.0) + (40.0) * (b_0 * qubo_constraint_slack(0)) + (-10.0) * qubo_constraint_slack(0)
[15]:
from qilisdk.common.model import QUBO, ObjectiveSense
model = QUBO("example_qubo_model")
model.set_objective(2 * b[0] + 3, label="obj", sense=ObjectiveSense.MINIMIZE)
model.add_constraint(
"qubo_constraint",
LT(2 * b[0], 1),
lagrange_multiplier=1,
penalization="unbalanced",
parameters=[1, 2],
transform_to_qubo=True,
)
print(model)
Model name: example_qubo_model
objective (obj):
minimize :
(2) * b_0 + (3)
subject to the constraint/s:
qubo_constraint: (2.0) * b_0 == (-1.0)
With Lagrange Multiplier/s:
qubo_constraint : 1
[16]:
model.qubo_objective
[16]:
obj: (4.0) * b_0 + (4.0)