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']