Shortcuts

Source code for shor.providers.qiskit.ibmq

from qiskit.providers.ibmq import IBMQ as QiskitIBMQ
from qiskit.providers.ibmq import IBMQAccountCredentialsNotFound

from shor.framework.docstring import _Hints, doc
from shor.providers import Aer
from shor.providers.base import WithLoginMixin
from shor.providers.qiskit.base import QiskitProvider

DEFAULT_DEVICE = "qasm_simulator"


class _IBMQHints(_Hints):
    LOGIN = """
To login and remember your IBMQ account use `IBMQ.login(TOKEN, remember=True)`
Your TOKEN can be found at: https://quantum-computing.ibm.com/account
"""


[docs]class IBMQ(QiskitProvider, WithLoginMixin): __doc__ = f"""{{pdoc}} The IBMQ provider enables access to IBM quantum computers. An IBMQ Experience account is required. If no account is provided, `{DEFAULT_DEVICE}` will be chosen as the device {_IBMQHints.LOGIN.indent(4)} """ def __init__(self, device=DEFAULT_DEVICE, **config): """ Initialize an IBMQ provider. Uses Qiskit to run programs on IBMQ quantum computers. If you need to access the Qiskit provider directly for any reason, use `.provider` :param device: Initialize with a specific device, defaults to qasm_simulator. See `devices` to list options :param config: Additional Qiskit provider configuration. Passed along as key word arguments to Qiskit's IBMQ provider """ IBMQ._try_login_saved_account() provider = QiskitIBMQ.providers()[0] if QiskitIBMQ.providers() else Aer config["provider"] = provider if "backend" in config: if not isinstance(config["backend"], str): config["backend"] = provider.get_backend(DEFAULT_DEVICE) if provider and provider.backends() else None super().__init__(**config)
[docs] @classmethod def account(cls) -> str: active_account = QiskitIBMQ.active_account() if not active_account: print("No active account") return active_account if active_account else ""
[docs] @classmethod @doc( f"""{{pdoc}} {_IBMQHints.LOGIN} """ ) def login(cls, token: str = "", remember: bool = False, **kwargs) -> bool: if not token: return cls._try_login_saved_account() else: QiskitIBMQ.enable_account(token, **kwargs) if remember: QiskitIBMQ.save_account(token, **kwargs)
[docs] @classmethod def logout(cls, forget: bool = False) -> None: if cls.account(): if forget: QiskitIBMQ.delete_account() QiskitIBMQ.disable_account()
@classmethod def _try_login_saved_account(cls) -> bool: if not QiskitIBMQ.active_account(): try: QiskitIBMQ.load_account() except IBMQAccountCredentialsNotFound: print(f"No saved account found for IBMQ. Only simulator devices will be available. {_IBMQHints.LOGIN}") return False # Failed login return True # Successful login