Source code for qlauncher.routines.qiskit.backends.aer_backend
1"""qiskit_aer implementation of QiskitBackend"""
2
3from typing import Literal
4
5from qiskit.primitives import BackendEstimatorV2, BackendSamplerV2
6from qiskit.providers import BackendV1, BackendV2
7from qiskit_aer import AerSimulator
8from qiskit_aer.noise import NoiseModel
9from qiskit_ibm_runtime import Options
10
11from qlauncher.routines.qiskit.backends.qiskit_backend import QiskitBackend
12from qlauncher.routines.qiskit.mitigation_suppression.base import CircuitExecutionMethod
13
14
[docs]
15class AerBackend(QiskitBackend):
16 """
17 QiskitBackend utilizing the qiskit_aer library. Runs local simulations only, utilizing CUDA capable gpus if available.
18 """
19
20 def __init__(
21 self,
22 name: Literal['local_simulator', 'backendv1v2'],
23 options: Options | None = None,
24 backendv1v2: BackendV1 | BackendV2 | None = None,
25 auto_transpile_level: Literal[0, 1, 2, 3] | None = None,
26 error_mitigation_strategy: CircuitExecutionMethod | None = None,
27 simulation_method: str = 'automatic',
28 simulation_device: Literal['CPU', 'GPU'] = 'CPU',
29 ) -> None:
30 self.method = simulation_method
31 self.device = simulation_device
32 super().__init__(
33 name,
34 options=options,
35 backendv1v2=backendv1v2,
36 auto_transpile_level=auto_transpile_level,
37 error_mitigation_strategy=error_mitigation_strategy,
38 )
39
40 def _set_primitives_on_backend_name(self) -> None:
41 if self.name == 'local_simulator':
42 self.simulator = AerSimulator(method=self.method, device=self.device)
43 elif self.name == 'backendv1v2':
44 if self.backendv1v2 is None:
45 raise AttributeError('Please indicate a backend when in backendv1v2 mode.')
46 noise_model = NoiseModel.from_backend(self.backendv1v2)
47 self.simulator = AerSimulator(method=self.method, device=self.device, noise_model=noise_model)
48 else:
49 raise ValueError(
50 f"Unsupported mode for this backend:'{self.name}'. Please use one of the following: ['local_simulator', 'backendv1v2']"
51 )
52
53 self.sampler = BackendSamplerV2(backend=self.simulator)
54 self.estimator = BackendEstimatorV2(backend=self.simulator)
55
56 self._configure_auto_behavior()
57
[docs]
58 def set_options(self, **fields) -> None:
59 """Set additional options for the instance AerSimulator"""
60 self.simulator.set_options(**fields)