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.
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
:#
In version
0.17.0
, due to this issue #1318,FakeBackend
is not available.
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
--------------------------------------------