Source code for quantum_launcher.routines.qiskit_routines.backends.ibm_backend
1""" IBM backend class for Qiskit routines """
2from typing import Literal
3
4from qiskit.providers import BackendV1, BackendV2
5from qiskit_algorithms.optimizers import SPSA, COBYLA
6from qiskit_ibm_runtime import EstimatorV2, SamplerV2
7from qiskit_ibm_runtime import Session, Options
8
9from quantum_launcher.routines.qiskit_routines.backends.qiskit_backend import QiskitBackend
10
11
[docs]
12class IBMBackend(QiskitBackend):
13 """
14 An extension of QiskitBackend providing support for IBM sessions.
15
16 Attributes:
17 session (Session | None, optional): The session to use with name 'device'.
18 """
19
20 def __init__(
21 self,
22 name: Literal['local_simulator', 'backendv1v2', 'session'],
23 options: Options | None = None,
24 backendv1v2: BackendV1 | BackendV2 | None = None,
25 auto_transpile_level: Literal[0, 1, 2, 3] | None = None,
26 session: Session | None = None,
27 ) -> None:
28 self.session = session
29 super().__init__(name, options, backendv1v2, auto_transpile_level)
30
31 @property
32 def setup(self) -> dict:
33 return {
34 'name': self.name,
35 'session': self.session
36 }
37
38 def _set_primitives_on_backend_name(self) -> None:
39 if self.name == 'local_simulator':
40 super()._set_primitives_on_backend_name()
41 return
42 self._auto_assign = True
43 if self.name == 'backendv1v2':
44 if self.backendv1v2 is None:
45 raise AttributeError(
46 'Please indicate a backend when in backendv1v2 mode.')
47 self.estimator = EstimatorV2(self.backendv1v2)
48 self.sampler = SamplerV2(self.backendv1v2)
49 self.optimizer = SPSA() if self.backendv1v2.name.startswith('ibm') else COBYLA() # set spsa for real backends
50
51 elif self.name == 'session':
52 if self.session is None:
53 raise AttributeError(
54 'Please indicate a session when in session mode.')
55 else:
56 self.estimator = EstimatorV2(mode=self.session, options=self.options)
57 self.sampler = SamplerV2(mode=self.session, options=self.options)
58 self.optimizer = SPSA()
59 else:
60 raise ValueError(
61 " ".join([
62 f"Unsupported mode for this backend:'{self.name}'."
63 "Please use one of the following: ['local_simulator', 'backendv1v2', 'session']"
64 ])
65 )
66
67 self._configure_auto_behavior()