Shortcuts

Source code for shor.providers.qiskit.base

from typing import List, Union

from qiskit import Aer, execute
from qiskit.providers import BaseBackend, BaseProvider

from shor.errors import ProviderError
from shor.providers.base import Job, Provider, Result
from shor.quantum import QC
from shor.transpilers.qiskit import to_qiskit_circuit
from shor.utils.qbits import int_from_bit_string

DEFAULT_DEVICE = Aer.get_backend("qasm_simulator")
DEFAULT_PROVIDER = Aer


[docs]class QiskitResult(Result): def __init__(self, qiskit_result): self.qiskit_result = qiskit_result @property def counts(self): return {int_from_bit_string(k.split(" ")[0]): v for k, v in self.qiskit_result.get_counts().items()} @property def sig_bits(self): measurement_bases = list(self.qiskit_result.get_counts().keys()) return len(measurement_bases[0]) if measurement_bases else 0
[docs]class QiskitJob(Job): def __init__(self, qiskit_job): self.qiskit_job = qiskit_job @property def status(self): return self.qiskit_job.status() @property def result(self) -> QiskitResult: return QiskitResult(self.qiskit_job.result())
[docs]class QiskitProvider(Provider): def __init__(self, device=None, provider=DEFAULT_PROVIDER, **config): if not issubclass(provider.__class__, BaseProvider): raise ProviderError( f"Qiskit Provider improperly initialized - must be a subclass of " f"<Qiskit.providers.BaseProvider>. The provided provider is not: {provider}" ) self.provider = provider if device: self.use_device(device) elif "backend" in config: # Qiskit uses the language "backend" instead of device, attempt to load this as well self.use_device(config["backend"]) else: self.device = config.get("backend", DEFAULT_DEVICE)
[docs] def devices(self, **kwargs) -> List[str]: return [d.name for d in self.provider.backends(**kwargs)]
[docs] def use_device(self, device: Union[str, BaseBackend], **kwargs) -> bool: if type(device) is str: self.device = self.provider.get_backend(name=device, **kwargs) elif issubclass(device.__class__, BaseBackend): self.device = device return self.device is not None
[docs] def run(self, circuit: QC, times: int) -> QiskitJob: job = execute(to_qiskit_circuit(circuit), self.device, shots=times) return QiskitJob(job)
@property def jobs(self) -> List[Job]: return list(map(lambda j: QiskitJob(j), self.device.get_jobs()))