Skip to main content

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)