Source code for quantum_launcher.routines.dwave_routines
1from typing import Callable
2
3from quantum_launcher.base import Algorithm, Problem, Backend, Result
4from quantum_launcher.import_management import DependencyError
5try:
6 from dimod.binary.binary_quadratic_model import BinaryQuadraticModel
7 from dimod import Sampler, SampleSet
8 from tabu import TabuSampler
9 from dwave.system import DWaveSampler, EmbeddingComposite
10 from dwave.samplers import SimulatedAnnealingSampler
11except ImportError as e:
12 raise DependencyError(e, install_hint='dwave') from e
13
14
[docs]
15class DwaveSolver(Algorithm):
16 _algorithm_format = 'bqm'
17
18 def __init__(self, chain_strength=1, **alg_kwargs) -> None:
19 self.chain_strength = chain_strength
20 super().__init__(**alg_kwargs)
21
[docs]
22 def run(self, problem: Problem, backend: Backend, formatter: Callable, **kwargs):
23 self._sampler: Sampler = backend.sampler
24 self.label: str = f'{problem.name}_{problem.instance_name}'
25 bqm: BinaryQuadraticModel = formatter(problem)
26 res = self._solve_bqm(bqm, **kwargs)
27 return self.construct_result(res)
28
29 def _solve_bqm(self, bqm, **kwargs):
30 res = self._sampler.sample(
31 bqm, num_reads=1000, label=self.label, chain_strength=self.chain_strength, **kwargs)
32 return res
33
[docs]
34 def construct_result(self, result: SampleSet) -> Result:
35 distribution = {}
36 energies = {}
37 for (value, energy, occ) in result.record:
38 bitstring = ''.join(map(str, value))
39 if bitstring in distribution:
40 distribution[bitstring] += occ
41 continue
42 distribution[bitstring] = occ
43 energies[bitstring] = energy
44
45 return Result.from_distributions(distribution, energies, result)
46
47
[docs]
48class TabuBackend(Backend):
49 def __init__(self, name: str = "TabuSampler", parameters: list = None) -> None:
50 super().__init__(name, parameters)
51 self.sampler = TabuSampler()
52
53
[docs]
54class DwaveBackend(Backend):
55 def __init__(self, name: str = "DWaveSampler", parameters: list = None) -> None:
56 super().__init__(name, parameters)
57 self.sampler = EmbeddingComposite(DWaveSampler())
58
59
[docs]
60class SimulatedAnnealingBackend(Backend):
61 def __init__(self, name: str = "SimulatedAnnealingSampler", parameters: list = None) -> None:
62 super().__init__(name, parameters)
63 self.sampler = SimulatedAnnealingSampler()
64
65
66__all__ = ['DwaveSolver', 'TabuBackend',
67 'DwaveBackend', 'SimulatedAnnealingBackend']