Source code for qlauncher.routines.qiskit.mitigation_suppression.base
1from abc import ABC, abstractmethod
2from types import UnionType
3from typing import TYPE_CHECKING
4
5from qiskit import QuantumCircuit
6from qiskit.quantum_info import SparsePauliOp
7
8from qlauncher.base import Backend
9from qlauncher.routines.circuits import CIRCUIT_FORMATS
10
11if TYPE_CHECKING:
12 from qlauncher.routines.qiskit import QiskitBackend
13
14
[docs]
15class CircuitModificationMethod(ABC):
16 """Method that relies only on modifying the input circuit"""
17
[docs]
18 @abstractmethod
19 def modify_circuit(self, circuit: QuantumCircuit) -> QuantumCircuit:
20 pass
21
22
[docs]
23class CircuitExecutionMethod(ABC):
24 """Method that relies on executing multiple modified versions of the circuit"""
25
26 compatible_circuit: type | UnionType
27
[docs]
28 @abstractmethod
29 def sample(self, circuit: CIRCUIT_FORMATS, backend: Backend, shots: int = 1024) -> dict[str, int]:
30 """
31 Sample circuit on the backend.
32
33 Args:
34 circuit (QuantumCircuit): Circuit to run.
35 backend (QiskitBackend): Backend to run on.
36 shots (int, optional): Number of samples to collect. Defaults to 1024.
37
38 Returns:
39 dict[str,int]: Bitstring counts.
40 """
41 pass
42
[docs]
43 @abstractmethod
44 def estimate(self, circuit: QuantumCircuit, observable: SparsePauliOp, backend: 'QiskitBackend') -> float:
45 """
46 Estimate energy of observable after running a given circuit on the backend.
47
48 Args:
49 circuit (QuantumCircuit): Circuit to run.
50 observable (SparsePauliOp): Observable to estimate.
51 backend (QiskitBackend): Backend to use.
52
53 Returns:
54 float: Estimated energy of the observable.
55 """
56 pass