|
7 | 7 |
|
8 | 8 | import numpy as np |
9 | 9 | from qiskit.circuit import QuantumCircuit |
10 | | -from qiskit.primitives.base import BaseEstimator, EstimatorResult |
11 | | -from qiskit.primitives.primitive_job import PrimitiveJob |
12 | | -from qiskit.primitives.utils import ( |
13 | | - _circuit_key, # noqa: PLC2701 |
14 | | - _observable_key, # noqa: PLC2701 |
15 | | - init_observable, |
16 | | -) |
17 | | -from qiskit.quantum_info import Pauli, PauliList, SparsePauliOp |
| 10 | +from qiskit.primitives import Estimator as QiskitEstimator |
| 11 | +from qiskit.primitives import EstimatorResult |
| 12 | +from qiskit.quantum_info import Pauli, PauliList |
18 | 13 |
|
19 | 14 | from mqt.ddsim.pyddsim import CircuitSimulator |
20 | 15 | from mqt.ddsim.qasmsimulator import QasmSimulatorBackend |
21 | 16 |
|
22 | 17 | if TYPE_CHECKING: |
23 | 18 | from qiskit.circuit import Parameter |
24 | 19 | from qiskit.circuit.parameterexpression import ParameterValueType |
25 | | - from qiskit.quantum_info.operators.base_operator import BaseOperator |
26 | 20 |
|
27 | 21 | Parameters = Union[Mapping[Parameter, ParameterValueType], Sequence[ParameterValueType]] |
28 | 22 |
|
29 | 23 |
|
30 | | -class Estimator(BaseEstimator): |
| 24 | +class Estimator(QiskitEstimator): |
31 | 25 | """DDSIM implementation of qiskit's sampler. |
32 | 26 | Code adapted from Qiskit's BackendEstimator class. |
33 | 27 | """ |
@@ -152,47 +146,6 @@ def _observable_circuit(num_qubits: int, pauli: Pauli) -> tuple[QuantumCircuit, |
152 | 146 |
|
153 | 147 | return obs_circuit, qubit_indices |
154 | 148 |
|
155 | | - def _run( |
156 | | - self, |
157 | | - circuits: Sequence[QuantumCircuit], |
158 | | - observables: Sequence[BaseOperator | SparsePauliOp], |
159 | | - parameter_values: Sequence[Parameters], |
160 | | - **run_options: dict[str, Any], |
161 | | - ) -> PrimitiveJob: |
162 | | - circuit_indices = [] |
163 | | - for circuit in circuits: |
164 | | - key_circ = _circuit_key(circuit) |
165 | | - index = self._circuit_ids.get(key_circ) |
166 | | - if index is not None: |
167 | | - circuit_indices.append(index) |
168 | | - else: |
169 | | - num_circuits = len(self._circuits) |
170 | | - circuit_indices.append(num_circuits) |
171 | | - self._circuit_ids[key_circ] = num_circuits |
172 | | - self._circuits.append(circuit) |
173 | | - self._parameters.append(circuit.parameters) |
174 | | - observable_indices = [] |
175 | | - for observable in observables: |
176 | | - observable_copy = init_observable(observable) |
177 | | - key_obs = _observable_key(observable_copy) |
178 | | - index = self._observable_ids.get(key_obs) |
179 | | - if index is not None: |
180 | | - observable_indices.append(index) |
181 | | - else: |
182 | | - num_observables = len(self._observables) |
183 | | - observable_indices.append(num_observables) |
184 | | - self._observable_ids[key_obs] = num_observables |
185 | | - self._observables.append(observable_copy) |
186 | | - job = PrimitiveJob( |
187 | | - self._call, |
188 | | - circuit_indices, |
189 | | - observable_indices, |
190 | | - parameter_values, |
191 | | - **run_options, |
192 | | - ) |
193 | | - job.submit() |
194 | | - return job |
195 | | - |
196 | 149 | def _call( |
197 | 150 | self, |
198 | 151 | circuits: Sequence[int], |
|
0 commit comments