Model Classes
Dynex model classes wrap dimod model objects and pass configuration context to the sampler.
import dynex
model = dynex.BQM(bqm) # dimod.BinaryQuadraticModel
model = dynex.CQM(cqm) # dimod.ConstrainedQuadraticModel
model = dynex.DQM(dqm) # dimod.DiscreteQuadraticModel
dynex.BQM
Wraps a dimod BinaryQuadraticModel.
dynex.BQM(bqm: dimod.BinaryQuadraticModel, config: DynexConfig = None)
bqm
dimod.BinaryQuadraticModel
required
A dimod BQM object. Variable types can be 'BINARY' (0/1) or 'SPIN' (-1/+1).
import dimod
import dynex
# BINARY variables (0 or 1)
bqm = dimod.BinaryQuadraticModel(
{'x': -1.0, 'y': -1.0},
{('x', 'y'): 2.0},
0.0,
'BINARY'
)
model = dynex.BQM(bqm)
# SPIN variables (-1 or +1) — Ising model
bqm_ising = dimod.BinaryQuadraticModel(
{0: -0.5, 1: 0.5},
{(0, 1): -1.0},
0.0,
'SPIN'
)
model_ising = dynex.BQM(bqm_ising)
# From QUBO dict
Q = {(0, 0): -1, (1, 1): -1, (0, 1): 2}
bqm_qubo = dimod.BinaryQuadraticModel.from_qubo(Q)
model_qubo = dynex.BQM(bqm_qubo)
dynex.CQM
Wraps a dimod ConstrainedQuadraticModel. Constraints are encoded as first-class objects.
dynex.CQM(cqm: dimod.ConstrainedQuadraticModel)
import dimod
import dynex
cqm = dimod.ConstrainedQuadraticModel()
x, y, z = dimod.Binary('x'), dimod.Binary('y'), dimod.Binary('z')
# Maximize x + 2y + 3z subject to budget constraint
cqm.set_objective(-x - 2*y - 3*z)
cqm.add_constraint(x + y + z <= 2, label='budget')
cqm.add_constraint(x + z >= 1, label='minimum')
model = dynex.CQM(cqm)
dynex.DQM
Wraps a dimod DiscreteQuadraticModel. Each variable can take one of multiple discrete values.
dynex.DQM(dqm: dimod.DiscreteQuadraticModel)
import dimod
import dynex
dqm = dimod.DiscreteQuadraticModel()
dqm.add_variable(3, label='color') # 3 possible values: 0, 1, 2
dqm.add_variable(4, label='size') # 4 possible values: 0, 1, 2, 3
# Biases
dqm.set_linear('color', [1.0, -1.0, 0.0])
dqm.set_linear('size', [0.0, 0.5, -1.0, 0.5])
# Interactions
dqm.set_quadratic('color', 'size', {(0, 0): 1.0, (1, 2): -0.5})
model = dynex.DQM(dqm)
Model selection guide
def select_model(problem_type):
if problem_type == 'qubo':
# Natural binary optimization, no constraints
return dynex.BQM(dimod.BinaryQuadraticModel.from_qubo(Q))
elif problem_type == 'constrained':
# Hard constraints (budget, capacity, etc.)
cqm = dimod.ConstrainedQuadraticModel()
# ... build cqm ...
return dynex.CQM(cqm)
elif problem_type == 'multi_valued':
# Variables with >2 discrete states
dqm = dimod.DiscreteQuadraticModel()
# ... build dqm ...
return dynex.DQM(dqm)