Appendix 01 - Backend Wrapper#

In Qiskit, there are several simulator source like BasicAer from qiskit, Aer from qiskit-aer or GPU-based qiskit-aer. Also, there are fake backends from qiskit-ibm-runtime and deprecated qiskit.provider.fake_provider. To make it easier to use, we can create a wrapper for each simulator. This notebook will show how to create a wrapper for the simulators.

See also

The complete source code of this tutorial can be found in

./a01_backend_wrapper.ipynb


A01.01 - All the methods in qiskit to get a simulator backend#

1. BasicAer or BasicProvider from qiskit <= 0.46.0:#

  • Ref: https://docs.quantum.ibm.com/api/qiskit/0.19/providers_basicaer

try:
    from qiskit import BasicAer
    from qiskit.providers.basicaer import QasmSimulatorPy

    print("| BasicAer, which can call by '.get_backend':")
    for backend_wrapper in BasicAer.backends():
        print(
            "| - "
            + (str(backend_wrapper) + " ").ljust(38, ".")
            + " "
            + repr(backend_wrapper)
        )

    print("| QasmSimulatorPy, which is a direct call:")
    qasm_simulator = QasmSimulatorPy()
    print(
        "| - " + (str(qasm_simulator) + " ").ljust(38, ".") + " " + repr(qasm_simulator)
    )

    display(qasm_simulator)
except ImportError as e:
    print("| - Your qiskit version does not support BasicAer.")
| - Your qiskit version does not support BasicAer.
try:
    from qiskit.providers.basic_provider import BasicProvider, BasicSimulator

    basic_provider = BasicProvider()
    print("| BasicProvider, which can call by '.get_backend':")
    for backend_wrapper in basic_provider.backends():
        print("| - " + repr(backend_wrapper))

    print("| BasicSimulator, which is a direct call:")
    basic_simulator = BasicSimulator()
    print("| - " + repr(basic_simulator))

    display(basic_simulator)
except ImportError as e:
    print("| - Your qiskit version does not support BasicProvider.")
| BasicProvider, which can call by '.get_backend':
| - <qiskit.providers.basic_provider.basic_simulator.BasicSimulator object at 0x7d70ee980050>
| BasicSimulator, which is a direct call:
| - <qiskit.providers.basic_provider.basic_simulator.BasicSimulator object at 0x7d70eeaf2350>
<qiskit.providers.basic_provider.basic_simulator.BasicSimulator at 0x7d70eeaf2350>

2. Aer from qiskit-aer:#

  • Ref: https://qiskit.github.io/qiskit-aer/getting_started.html

try:
    from qiskit_aer import AerProvider, AerSimulator

    print("| Via AerProvider, which can call by '.get_backend':")
    aer_provider = AerProvider()
    for backend_wrapper in aer_provider.backends():
        print(
            "| - "
            + (str(backend_wrapper) + " ").ljust(38, ".")
            + " "
            + repr(backend_wrapper)
        )

    print("| Via AerSimulator, which is a direct call:")
    aer_simulator = AerSimulator()
    print(
        "| - " + (str(aer_simulator) + " ").ljust(38, ".") + " " + repr(aer_simulator)
    )

    display(aer_simulator)
except ImportError as e:
    print(
        "| - You do not install qiskit_aer yet, install by using 'pip install qiskit-aer'."
    )
| Via AerProvider, which can call by '.get_backend':
| - AerSimulator('aer_simulator') ........ AerSimulator('aer_simulator')
| - AerSimulator('aer_simulator_statevector')  AerSimulator('aer_simulator_statevector')
| - AerSimulator('aer_simulator_density_matrix')  AerSimulator('aer_simulator_density_matrix')
| - AerSimulator('aer_simulator_stabilizer')  AerSimulator('aer_simulator_stabilizer')
| - AerSimulator('aer_simulator_matrix_product_state')  AerSimulator('aer_simulator_matrix_product_state')
| - AerSimulator('aer_simulator_extended_stabilizer')  AerSimulator('aer_simulator_extended_stabilizer')
| - AerSimulator('aer_simulator_unitary')  AerSimulator('aer_simulator_unitary')
| - AerSimulator('aer_simulator_superop')  AerSimulator('aer_simulator_superop')
| - QasmSimulator('qasm_simulator') ...... QasmSimulator('qasm_simulator')
| - StatevectorSimulator('statevector_simulator')  StatevectorSimulator('statevector_simulator')
| - UnitarySimulator('unitary_simulator')  UnitarySimulator('unitary_simulator')
| Via AerSimulator, which is a direct call:
| - AerSimulator('aer_simulator') ........ AerSimulator('aer_simulator')
AerSimulator('aer_simulator')

3. Access qiskit-aer-gpu:#

  • Ref: https://qiskit.github.io/qiskit-aer/getting_started.html

try:
    from qiskit_aer import AerSimulator

    aer_simulator_gpu = AerSimulator()

    print("| - Check the available devices:", aer_simulator_gpu.available_devices())

    print("| - Then set option as GPU")
    aer_simulator_gpu.set_options(device="GPU")

    print("| - And check again:")
    print(
        "| - "
        + (str(aer_simulator_gpu) + " ").ljust(38, ".")
        + " "
        + repr(aer_simulator_gpu)
    )

    display(aer_simulator_gpu)
except ImportError as e:
    print(
        "| - You do not install qiskit_aer yet, install by using 'pip install qiskit-aer'."
    )
| - Check the available devices: ('CPU',)
| - Then set option as GPU
| - And check again:
| - AerSimulator('aer_simulator') ........ AerSimulator('aer_simulator')
AerSimulator('aer_simulator')

A01.02 - FackBackend#

1. From qiskit <= 0.46.0:#

try:
    from qiskit.providers.fake_provider import (
        FakeProvider as FakeProviderDep,
        FakeProviderForBackendV2 as FakeProviderForBackendV2Dep,
    )

    fake_provider_v1_old = FakeProviderDep()
    fake_provider_v2_old = FakeProviderForBackendV2Dep()
    print("| - Fake Backend from 'qiskit'")
    print("| - BackendV1")
    print([b.name() for b in fake_provider_v1_old.backends()])
    print("| - BackendV2")
    print([b.name for b in fake_provider_v2_old.backends()])
except ImportError as e:
    print("| - Your qiskit version does not support fake_provider.")
| - Your qiskit version does not support fake_provider.

2. From qiskit-ibm-runtime:#

try:
    from qiskit_ibm_runtime.fake_provider import (
        FakeProviderForBackendV2 as FakeProviderForBackendV2Indep,
    )

    fake_provider_v2_new = FakeProviderForBackendV2Indep()
    print("| - BackendV2")
    print([b.name for b in fake_provider_v2_new.backends()])
except ImportError as e:
    print("| - Your qiskit version does not support fake_provider.")
except FileNotFoundError as e:
    print(e)
    print("| - The version of 'qiskit-ibm-runtime' may be 0.17.0")
    print(
        "| - Fake Backend is not available in this version, consider to use other version."
    )
    print(
        "| - For more detail, see: https://github.com/Qiskit/qiskit-ibm-runtime/issues/1318"
    )

try:
    from qiskit_ibm_runtime.fake_provider import (
        FakeProvider as FakeProviderIndep,
    )

    fake_provider_v1_new = FakeProviderIndep()
    print("| - Fake Backend from 'qiskit-ibm-runtime'")
    print("| - BackendV1")
    print([b.name() for b in fake_provider_v1_new.backends()])
except ImportError as e:
    print("| - Since 0.33.0, FakeProvider for BackendV! has been deprecated.")
    print("| - Or your qiskit version does not support fake_provider.")
except FileNotFoundError as e:
    print(e)
    print("| - The version of 'qiskit-ibm-runtime' may be 0.17.0")
    print(
        "| - Fake Backend is not available in this version, consider to use other version."
    )
    print(
        "| - For more detail, see: https://github.com/Qiskit/qiskit-ibm-runtime/issues/1318"
    )
| - Your qiskit version does not support fake_provider.
| - Since 0.33.0, FakeProvider for BackendV! has been deprecated.
| - Or your qiskit version does not support fake_provider.

A01.03 - Backend Wrapper#

As previously mentioned, getting a simulator backend is complicated. So Qurry introduce a wrapper to make it easier to get a simulator backend.

from qurry import BackendWrapper

backend_wrapper = BackendWrapper()
backend_wrapper("sim")
/.venv/lib/python3.13/site-packages/qurry/tools/backend/import_fake.py:141: QurryDependenciesNotWorking: "No fake provider available. It may be caused by version conflict.  For qiskit<1.0.0 please install qiskit-ibm-runtime<0.21.0 by  'pip install qiskit-ibm-runtime<0.21.0'.  If you are still using qiskit 0.46.X and lower originally,  then install newer qiskit-ibm-runtime at same time,  please check whether the version of qiskit  has been updated to 1.0 by the installation  because since qiskit-ibm-runtime 0.21.0+  has been updated its dependency to qiskit 1.0.  If you already have qiskit-ibm-runtimes installed and lower than 0.21.0,  it is only available to use qiskit 0.46.X as dependency  for the migration of fake_provider is not completed around this version.  Many of the fake backends are not available in qiskit-ibm-runtime.  (This made me a lot problem to handle the fake backends in Qurry.)  (If you see this error raised, good luck to you to fix environment. :smile:.)"
  warnings.warn(LUCKY_MSG, category=QurryDependenciesNotWorking)
<AerSimulator('aer_simulator')>
  • If your environment includes the GPU acceleration, qiskit-aer-gpu, it will be check the availability to access, if does, the GPU backend will also be available.

print("| Does we have GPU backend to access:", backend_wrapper.is_aer_gpu)
try:
    # If you have GPU, you can use this backend.
    display(backend_wrapper("aer_gpu"))
except ValueError as err:
    print("| - There is not GPU backend to access:", err)
| Does we have GPU backend to access: False
| - There is not GPU backend to access: 'aer_gpu' unknown backend or backend callsign.
print(backend_wrapper.statesheet())
backend_wrapper.available_backends
------------------------------------------------------------
 ### BackendWrapper Statesheet
------------------------------------------------------------
 #### Simulator
 - Aer GPU ........................... False
 - Simulator Provider by ............. qiskit_aer
   sim
   No Callsign Added
------------------------------------------------------------
 #### IBM
   No Backends Available. Real backends need to be loaded by 'BackendManager' instead of 'BackendWrapper'.
   No Callsign Added
------------------------------------------------------------
 #### Fake
   No Backends Available. Choose fake version when initializing the backend wrapper.
   No Callsign Added
------------------------------------------------------------
 #### Extra
   No Backends Available.
   No Callsign Added
{'sim': {'sim': <AerSimulator('aer_simulator')>},
 'real': {},
 'fake': {},
 'extra': {}}
from qurry.process import AVAIBILITY_STATESHEET
from qurry.tools.qiskit_version import QISKIT_VERSION_STATESHEET

print(AVAIBILITY_STATESHEET)
print(QISKIT_VERSION_STATESHEET)
 | Qurrium version: 0.13.0
---------------------------------------------------------------------------
 ### Qurrium Post-Processing
   - Backend Availability ................... Python Cython Rust   JAX   
 - randomized_measure
   - entangled_entropy.entropy_core_2 ....... Yes    Depr.  Yes    No    
   - entangle_entropy.purity_cell_2 ......... Yes    Depr.  Yes    No    
   - entangled_entropy_v1.entropy_core ...... Yes    Depr.  Yes    No    
   - entangle_entropy_v1.purity_cell ........ Yes    Depr.  Yes    No    
   - wavefunction_overlap.echo_core_2 ....... Yes    Depr.  Yes    No    
   - wavefunction_overlap.echo_cell_2 ....... Yes    Depr.  Yes    No    
   - wavefunction_overlap_v1.echo_core ...... Yes    Depr.  Yes    No    
   - wavefunction_overlap_v1.echo_cell ...... Yes    Depr.  Yes    No    
 - hadamard_test
   - purity_echo_core ....................... Yes    No     Yes    No    
 - magnet_square
   - magnsq_core ............................ Yes    No     Yes    No    
 - string_operator
   - strop_core ............................. Yes    No     Yes    No    
 - classical_shadow
   - rho_m_core ............................. Yes    No     No     Yes   
 - utils
   - randomized ............................. Yes    Depr.  Yes    No    
   - counts_process ......................... Yes    No     Yes    No    
   - bit_slice .............................. Yes    No     Yes    No    
   - dummy .................................. Yes    No     Yes    No    
   - test ................................... Yes    No     Yes    No    
---------------------------------------------------------------------------
   + Yes ...... Working normally.
   + Error .... Exception occurred.
   + No ....... Not supported.
   + Depr. .... Deprecated.
---------------------------------------------------------------------------

 | Qurrium version: 0.13.0
--------------------------------------------
 ### Qiskit version
 - main
   - qiskit-aer ......... 0.17.1
 - deprecated
 - into-community
--------------------------------------------