Skip to main content

D-Wave

D-Wave's quantum annealing hardware relies on metal loops of niobium that have tiny electrical currents running through them.

Solvers

ModelSolvers
Quadratic Unconstrained Binary Optimization (QUBO)dwave.Advantage_system4.1, dwave.Advantage_system5.4, dwave.Advantage_system6.4, dwave.Advantage2_prototype2.5, dwave.hybrid_binary_quadratic_model_version2p
Constrained Quadratic Model (CQM)dwave.hybrid_constrained_quadratic_model_version1p
Discrete Quadratic Model (DQM)dwave.hybrid_discrete_quadratic_model_version1p

Samplers

D-Wave samplers are designed to solve problems that can be formulated as binary quadratic models (BQM). The samplers are used to find the lowest energy state of the BQM.

Advantage Systems

  • Advantage_system4.1
  • Advantage_system5.4
  • Advantage_system6.4
  • Advantage2_prototype2.5

https://www.dwavesys.com/solutions-and-products/systems/

import strangeworks as sw
from strangeworks_optimization import StrangeworksOptimizer
from strangeworks_optimization_models.parameter_models import DwaveSamplerParameterModel
from dimod import BinaryQuadraticModel

sw.authenticate(api_key)

linear = {1: -2, 2: -2, 3: -3, 4: -3, 5: -2}
quadratic = {(1, 2): 2, (1, 3): 2, (2, 4): 2, (3, 4): 2, (3, 5): 2, (4, 5): 2}
model = BinaryQuadraticModel(linear, quadratic, "BINARY")

# solver = "dwave.Advantage_system6.4"
solver = "dwave.Advantage2_prototype2.5"
options = DwaveSamplerParameterModel(num_reads=100, chain_strength=50)

so = StrangeworksOptimizer(model=model, solver=solver, options=options)
sw_job = so.run()

print(f"Job slug: {sw_job.slug}")
print(f"Job status: {so.status(sw_job.slug)}")

results = so.results(sw_job.slug)

print(f"Best solution:\n{results.solution.first}")

Parameters

from strangeworks_optimization_models.parameter_models import DwaveSamplerParameterModel

options = DwaveSamplerParameterModel(.....)

For more information on the parameters, please refer to the D-Wave Solver Parameters documentation.

NameTypeDescriptionDefaultValues (Range)
num_readsintSpecifies the number of reads (solutions) to be obtained.1[1, max_num_reads]
chain_strengthintSets the strength of the chains in the embedding.Determined by solver[Depends on system]
anneal_offsetsList[float]Provides offsets to annealing paths, per qubit.No offsetsSpecified per qubit
anneal_scheduleList[List[float]]Specifies the custom annealing schedule as time and fraction.Standard scheduleSpecified per system
annealing_timefloatSets the duration of the annealing process per read.Default system valueSpecified per system
auto_scaleboolAutomatically rescales h and J values to the QPU's range.True[True, False]
flux_biasesList[float]Applies manual flux biases for qubit calibration.No biases[Depends on system]
flux_drift_compensationboolCompensates for flux drift in qubits.True[True, False]
h_gain_scheduleList[List[float]]Sets time-dependent gains for qubit biases.Not specified[Depends on system]
initial_statedictSets the initial state for reverse annealing.Not specified[Depends on system]
max_answersintLimits the number of answers returned.num_reads[1, num_reads]
num_spin_reversal_transformsintApplies spin reversal transforms to reduce noise.0[0, max_transforms]
programming_thermalizationfloatTime to wait post-programming for thermalization.1000 μs[0μs, max_thermal]
readout_thermalizationfloatTime to wait post-readout for thermalization.0 μs[0μs, max_thermal]
reduce_intersample_correlationboolAdds delays between samples to reduce correlations.False[True, False]
reinitialize_stateboolReinitializes to the initial state for each anneal cycle.False[True, False]
embedding_parametersdictSpecifies the embedding parameters.False[True, False]

Solvers

  • dwave.Advantage_system4.1
  • dwave.Advantage_system5.4
  • dwave.Advantage_system6.4
  • dwave.Advantage2_prototype2.5
  • sim.SimulatedAnnealingSampler
  • sim.RandomSampler

Embedding

Embedding refers to the process of mapping a binary quadratic model (BQM) or an Ising model onto the physical qubits of a processor, such as those provided by D-Wave or Hitachi systems.

This is necessary because the structure of the problem graph (source graph) often does not directly match the hardware graph (target graph) of the quantum processing unit (QPU).

Embedding ensures that each variable in the problem is represented by a chain of qubits, which collectively act as a single logical variable.

Embedding Parameters

Use the EmbeddingParameterModel to set the parameters for the MinorMiner algorithm. This algorithm is a heuristic method that attempts to find an embedding that minimizes the number of chains and the chain lengths.

from strangeworks_optimization_models.parameter_models import EmbeddingParameterModel

embedding = EmbeddingParameterModel(.....)
ParameterTypeDefaultDescription
max_no_improvementintNoneMaximum number of failed iterations to improve the current solution. Each iteration attempts to find an embedding for each variable such that it is adjacent to all its neighbours.
random_seedintNoneSeed for the random number generator. If set to None, the seed is initialized using os.random().
timeoutintNoneMaximum time (in seconds) before the algorithm gives up.
max_betafloatNoneQubits are assigned weight based on a formula (beta^n) where n is the number of chains containing that qubit. This value should be greater than 1. If None, max_beta is effectively infinite.
triesintNoneNumber of restart attempts before the algorithm stops. A typical restart takes between 1 and 60 seconds.
inner_roundsintNoneMaximum number of iterations between restart attempts. If None, inner_rounds is effectively infinite.
chainlength_patienceintNoneMaximum number of failed iterations to improve chain lengths in the current solution.
max_fillintNoneRestricts the number of chains that can simultaneously incorporate the same qubit during the search. Values above 63 are treated as 63. If None, max_fill is effectively infinite.
threadsintNoneMaximum number of threads to use. Parallelization is only advantageous where the expected degree of variables is significantly greater than the number of threads.
return_overlapboolNoneDetermines the function’s return value. If True, a 2-tuple is returned with the embedding and a boolean representing the embedding validity. If False, only an embedding is returned.
skip_initializationboolNoneSkips the initialization pass if the chains passed through initial_chains and fixed_chains are semi-valid.
verboseintNoneLevel of output verbosity. Ranges from 0 (quiet) to 4 (detailed debugging).
interactiveboolNoneIf True, the verbose output will be printed to stdout/stderr and keyboard interrupts will stop the embedding process, returning the current state to the user.
initial_chainsdictNoneInitial chains to be inserted into an embedding before fixed_chains are placed.
fixed_chainsdictNoneFixed chains that are inserted into an embedding before the initialization pass and do not change during the algorithm.
restrict_chainsdictNoneEnsures that each chain is a subset of restrict_chains throughout the algorithm.
suspend_chainsdictNoneA metafeature implemented in the Python interface. Each entry is an iterable of iterables representing the target node labels.

Solvers

  • DwaveSamplerParameterModel(embedding_parameters)
  • HitachiParameterModel(embedding_parameters)

To use embedding with D-Wave solvers, you can pass the embedding_parameters parameter to the solver.

from strangeworks_optimization_models.parameter_models import DwaveSamplerParameterModel

options = DwaveSamplerParameterModel(embedding_parameters={
"chain_strength": 10,
"anneal_schedule": [[0, 0], [1, 1]],
"anneal_offsets": [0, 0],
"annealing_time": 1,
"auto_scale": True,
})

Leap Hybrid

SolversVariablesConstraints
hybrid_binary_quadratic_model_version2p, hybrid_constrained_quadratic_model_version1p, hybrid_discrete_quadratic_model_version1pUp to 1 millionUp to 100,000

For more information, visit D-Wave Cloud Platform

QUBO

import strangeworks as sw
from strangeworks_optimization import StrangeworksOptimizer
from strangeworks_optimization_models.parameter_models import DwaveLeapParameterModel
from dimod import BinaryQuadraticModel

sw.authenticate(api_key)

linear = {1: -2, 2: -2, 3: -3, 4: -3, 5: -2}
quadratic = {(1, 2): 2, (1, 3): 2, (2, 4): 2, (3, 4): 2, (3, 5): 2, (4, 5): 2}
model = BinaryQuadraticModel(linear, quadratic, "BINARY")

solver = "dwave.hybrid_binary_quadratic_model_version2p"
options = DwaveLeapParameterModel(time_limit=1)

so = StrangeworksOptimizer(model=model, solver=solver, options=options)
sw_job = so.run()

CQM

import strangeworks as sw
from strangeworks_optimization import StrangeworksOptimizer
from strangeworks_optimization_models.parameter_models import DwaveLeapParameterModel
from dimod import Binary, ConstrainedQuadraticModel

sw.authenticate(api_key)

weights = [0.9, 0.7, 0.2, 0.1]
capacity = 1
y = [Binary(f"y_{j}") for j in range(len(weights))]
x = [[Binary(f"x_{i}_{j}") for j in range(len(weights))] for i in range(len(weights))]
model = ConstrainedQuadraticModel()
model.set_objective(sum(y))

for i in range(len(weights)):
model.add_constraint(sum(x[i]) == 1, label=f"item_placing_{i}")

for j in range(len(weights)):
model.add_constraint(
sum(weights[i] * x[i][j] for i in range(len(weights))) - y[j] * capacity <= 0,
label=f"capacity_bin_{j}",
)

solver = "dwave.hybrid_constrained_quadratic_model_version1p"
options = DwaveLeapParameterModel(time_limit=1)

so = StrangeworksOptimizer(model=model, solver=solver, options=options)
sw_job = so.run()

DQM

import strangeworks as sw
from strangeworks_optimization import StrangeworksOptimizer
from strangeworks_optimization_models.parameter_models import DwaveLeapParameterModel
from dimod import DiscreteQuadraticModel
import random

sw.authenticate(api_key)

model = DiscreteQuadraticModel()
for i in range(10):
model.add_variable(4)
for i in range(9):
for j in range(i + 1, 10):
model.set_quadratic_case(i, random.randrange(0, 4), j, random.randrange(0, 4), random.random())

solver = "dwave.hybrid_discrete_quadratic_model_version1p"
options = DwaveLeapParameterModel(time_limit=1)

so = StrangeworksOptimizer(model=model, solver=solver, options=options)
sw_job = so.run()

Parameters

from strangeworks_optimization_models.parameter_models import DwaveLeapParameterModel

options = DwaveLeapParameterModel(time_limit)
NameTypeDescriptionMinimum
time_limitintSpecifies the time limit (seconds) for the solver5

Solvers

  • dwave.hybrid_binary_quadratic_model_version2p
  • dwave.hybrid_constrained_quadratic_model_version1p
  • dwave.hybrid_discrete_quadratic_model_version1p